版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、模板文档副标题拓跋公司名称I 公司地址目录函数功能:延时函数,i=1时,大约延时10us2函数功能:数码管显示函数函数功能:设置外部中断1函数功能:向74HC595发送一个字节的数据5函数功能:检测有按键按下并读取键值函数功能:数据处理函数.9.10*功能:初始化触摸SPI.1.1功能:使用SPI读取数据功能:读取触摸数据13#inelude "led.h"/液晶显示1.4.*函数功能:向LCD写入一个字节的命令 1.5.*函数功能:向LCD写入一个字节的数据 1.7.*函数功能:初始化LCD屏1.9.*函数功能:通过595发送四个字节的数据 23.*函数功能:设置串口27
2、.*函数名:delay*函数功能:延时函数,i=1时,大约延时10us*/void delay( uint i)while(i-);/*函数名:DigDisplay()函数功能:数码管显示函数*输入*/*输出*void DigDisplay() uchar i;for(i=0;i<8;i+)switch(i) /位选,选择点亮的数码管,case(O):LSA=O;LSB=O;LSC=O; break;/ 显示第 0 位case(1):LSA=1;LSB=0;LSC=0; break;/ 显示第 1 位case(2):LSA=0;LSB=1;LSC=0; break;/ 显示第 2 位ca
3、se(3):LSA=1;LSB=1;LSC=0; break;/ 显示第 3 位case(4):LSA=0;LSB=0;LSC=1; break;/ 显示第 4 位case(5):LSA=1;LSB=0;LSC=1; break;/ 显示第 5 位case(6):LSA=0;LSB=1;LSC=1; break;/ 显示第 6 位case(7):LSA=1;LSB=1;LSC=1; break;/ 显示第 7 位P0=smgdua n i; 发送段码delay(IOO); /间隔一段时间扫描P0=0x00; 消隐 /* 函数名:Int1Init()*/函数功能:设置外部中断1*void In
4、t1I nit() /设置INT1IT1=1;跳变沿出发方式(下降沿)EX1=1;打开INT1的中断允许。EA=1;打开总中断void Int1()interrupt 2/外部中断1的中断函数 delay(1000);/ 延时消抖if(k4=O)Ied=led;/*函数名:Hc595SendByte(uchardat)*函数功能:向74HC595发送一个字节的数据*输入:无*输出:无*/uchar leddua n=0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00;uchar ledwei=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0x
5、fe;void Hc595Se ndByte(uchar dat)uchar a;SRCLK=0;RCLK=0;for(a=0;a<8;a+)SER=dat>>7;dat<<=1;SRCLK=1;_n op_();_n op_();SRCLK=0;RCLK=1;_nop_();_nop_();RCLK=0;P0=0x7f;for(i=0;i<8;i+)PO=ledweii;/ 位选Hc595SendByte(ledduani);/ 发送段选数据delay(IOO);/ 延时Hc595SendByte(OxOO);/ 消隐/*函数名:KeyDow n*函数功能
6、:检测有按键按下并读取键值*输入:无*输出:无* void KeyDow n( void)char a=0;GPIO_KEY=OxOf;if(GPIO_KEY!=OxOf)读取按键是否按下delay(1000); 延时10ms进行消抖if(GPIO_KEY!=OxOf)再次检测键盘是否按下 /测试列GPIO_KEY=OXOF;switch(GPIO_KEY)case(0X0e): KeyValue=O;break;case(0X0d): KeyValue=4;break;case(0X0b): KeyValue=8;break;case(0X07): KeyValue=12;break;/测试
7、行GPIO_KEY=OXFO;switch(GPIO_KEY)case(0Xe0): KeyValue=KeyValue;break;case(OXdO): KeyValue=KeyValue+1;break;case(OXbO): KeyValue=KeyValue+2;break;case(0X70): KeyValue=KeyValue+3;break;while(a<50)&&(GPIO_KEY!=OxfO)/ 检测按键松手检测delay(1000);a+;/* 函数名:datapros()*输入:无*输出:无*void datapros()uint temp;s
8、tatic uchar i;if(i=50)i=0;temp = Read_AD_Data(0xE4);/ 外部 adi+;dispO=smgdua ntemp/1000;千位disp1=smgdua ntemp%1000/100;百位disp2=smgdua ntemp%1000%100/10;个位disp3=smgdua ntemp%1000%100%10;#i nclude"XPT2046.h"/*函数名:TSPI Start*输入:无*输出:无功 能:初始化触摸SPI*/void SPI_Start(void)CLK = 0;CS = 1;DIN = 1;CLK =
9、 1;CS = 0;/* 函数名:SPI_Write*输入:dat :写入数据*输出:无*功能:使用SPI写入数据*/void SPI_Write(uchar dat)uchar i;CLK = 0;for(i=0; i<8; i+)DIN = dat >> 7; dat <<= 1;CLK = 0;放置最高位/上升沿放置数据CLK = 1;/*函数名:SPI_Read*输入:无*输出:dat :读取到的数据功 能:使用SPI读取数据*/uint SPI_Read(void)uint i, dat=O;CLK = 0;II接收12位数据for(i=0; i<
10、12; i+)dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;return dat;,*函数名:Read_AD_Data*输入:cmd :读取的X或者Y*输出:endValue :最终信号处理后返回的值功能:读取触摸数据*uint Read_AD_Data(uchar cmd)uchar i;uint AD_Value;CLK = 0;CS = 0;SPI_Write(cmd);for(i=6; i>0; i-);/延时等待转换结果CLK = 1;/发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_no
11、p_();AD_Value=SPI_Read();CS = 1;return AD_Value;*函数名:Lcd1602_Delay1ms*函数功能:延时函数,延时1ms*输入:c*输出:无*说名:该函数是在12MHZ晶振下,12分频单片机的延时。嗫*/void Lcd1602_Delay1ms(uint c)/误差0usuchar a,b;for (; c>0; c-)for (b=199;b>0;b-)*/for(a=1;a>0;a_);*函数名:LcdWriteCom*函数功能:向LCD写入一个字节的命令*输入:com*输出:无嗫*#ifndef LCD1602_4PI
12、NS / 当没有定义这个 LCD1602_4PINS 时void LcdWriteCom(uchar com)/ 写入命令LCD1602_E = 0;LCD1602_RS = 0;LCD1602_RW = 0;/使能/选择发送命令/选择写入LCD1602_DATAPINS = com;/ 放入命令Lcd1602_Delay1ms(5);/ 保持时间LCD1602_E = 0;#elsevoid LcdWriteCom(uchar com)/ 写入命令LCD1602_E = 0;/ 使能清零LCD1602_RS = 0;/选择写入命令LCD1602_RW = 0;/ 选择写入所以传送高LCD16
13、02_DATAPINS = com; /由于4位的接线是接到 P0 口的高四位 四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;/ 写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; / 发送低四位LCD1602_E = 1;/ 写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#en dif/*函数名:LcdWriteData*函数功能:向LCD写入一个字节的数据*输入:dat*输出:无*#ifndef LCD1602_4PINSvoid Lc
14、dWriteData(uchar dat)/ 写入数据LCD1602_E = 0;/ 使能清零LCD1602_RS = 1; /选择输入数据LCD1602_RW = 0;/ 选择写入LCD1602_DATAPINS = dat; / 写入数据LCD1602_E = 1;/ 写入时序Lcd1602_Delay1ms(5); / 保持时间LCD1602_E = 0;#elsevoid LcdWriteData(uchar dat)/ 写入数据LCD1602_E = 0;/ 使能清零LCD1602_RS = 1;/选择写入数据LCD1602_RW = 0;/ 选择写入所以传送高LCD1602_DAT
15、APINS = dat; II由于4位的接线是接到 P0 口的高四位 四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;II写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; II写入低四位LCD1602_E = 1;/ 写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;#en dif/* 函数名:LcdInit()函数功能 :初始化LCD屏*输入:无*输出:无*/#ifndefLCD1602_4PINSvoid LcdI nit()/LCD初始化
16、子程序LcdWriteCom(0x38); / 开显示LcdWriteCom(OxOc);/开显示不显示光标LcdWriteCom(0x06);/ 写一个指针加 1LcdWriteCom(0x01);/ 清屏LcdWriteCom(0x80); /设置数据指针起点#elsevoid Lcdlnit()/LCD初始化子程序LcdWriteCom(0x32);/将8位总线转为 4位总线LcdWriteCom(0x28);/在四位线下的初始化LcdWriteCom(OxOc);/开显示不显示光标LcdWriteCom(0x06);/写一个指针加 1LcdWriteCom(0x01);/清屏LcdWr
17、iteCom(0x80);/设置数据指针起点#en dif#in clude "in tri ns.h"typedef un sig ned int uint;typedef un sig ned char uchar;/对数据类型进行声明定义/-定义使用的10 口 -/ sbit SRCLK=P3W;sbit RCLK=P3A5;sbit SER=P3A4;/定义LED点阵的位选,也就是类似于数码管的位选 ,因为要对其动态扫描操作/数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平uchar code ledwei=
18、0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,0x80,;uchar code leddua n1=/*- 文字:普 -*/*- 宋体12;此字体下对应的点阵为:宽x高=16x16-*/0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x
19、7E,0x45,0x64,0x54,0x44,0x40,0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,;uchar code leddua n2=/*- 文字:中 -*/*- 宋体12;此字体下对应的点阵为:宽x高=16x16-*/0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x
20、04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00,/*;*函数名:delay*函数功能:延时函数,i=1时,大约延时10us*void delay( uint i)while(i-);/* 函数名:Hc595SendByte(uchar dat1,uchar dat2,uchar dat3,uchar dat4)*函数功能:通过595发送四个字节的数据*输 入:dat1 :第4个595输出数值* * dat2:第3个595输出数值* * dat3 :第2个595输出数值* * dat4 :第1个595输出数值*/*输 出:无*void Hc595Se ndByte(u
21、char dat1,uchar dat2,uchar dat3,uchar dat4)uchar a;SRCLK = 1;RCLK = 1;for(a=0;a<8;a+)/ 发送 8 位数SER = datl >> 7;/从最高位开始发送datl <<= 1;SRCLK = 0;_n op_();_n op_();SRCLK = 1;for(a=0;a<8;a+)SER = dat2 >> 7;dat2 <<= 1;SRCLK = 0;_n op_();_n op_();SRCLK = 1;for(a=0;a<8;a+)/发送时
22、序/发送8位数/从最高位开始发送/发送时序/发送8位数SER = dat3 >> 7;/从最高位开始发送dat3 <<= 1;SRCLK = 0;_n op_();_n op_();SRCLK = 1;for(a=0;a<8;a+)SER = dat4 >> 7;dat4 <<= 1;SRCLK = 0;_n op_();_n op_();SRCLK = 1;/发送时序/发送8位数/从最高位开始发送/发送时序RCLK = 0;_nop_();_nop_();/*RCLK = 1;*函数名:mai n*函数功能:主函数*输入:无*输出:无*
23、void mai n() uchar i;while(1)for(i=0;i<16;i+)Hc595Se ndByte(ledweii+16,ledweii,leddua n116+i,leddua n1i); delay(10);/*函数名:Usart In it()*函数功能:设置串口*输入:无*/*输出:无*void Usartlnit()SCON=0X50;/设置为工作方式1TMOD=0X20;/设置计数器工作方式2PCON=OX8O;/波特率加倍TH1=0XF3;/计数器初始值设置,注意波特率是4800的TL1=0XF3;ES=1;/打开接收中断EA=1;/打开总中断TR1=1
24、;/打开计数器/*函数名:mai n*函数功能:主函数*输入:无*输出:无*/void mai n()Usartl nit(); / 串口初始化 while(1);/*函数名*函数功能*输入*输出:Usart() in terrupt 4:串口通信中断函数:无:无*/void Usart() in terrupt 4uchar receiveData;receiveData=SBUF;出去接收到的数据RI = 0;清除接收中断标志位SBUF=receiveData;将接收到的数据放入到发送寄存器while(!TI);/等待发送数据完成TI=0;/清除发送完成标志位头文件#ifndef _TOU
25、_H #defi ne _TOU_H#in clude <reg52.h>#defi ne uchar un sig ned char void dely(uchar i)while(i-);#en dif#i nclude<reg51.H>#defi ne uintun sig ned int#defi ne uchar un sig ned char sfr ADC_CONTR =OXBC;sfr ADC_RES =0XBD;sfr ADC_L0W2 =0XBE;sfr ADC_LOW2 =0XBE;sfr P1ASF =0X9D;#defi ne ADC_POWE
26、R 0X80#defi ne ADC_FLAG 0x10#defi ne ADC_START 0X08#defi ne ADC_SPEEDLL 0X00#defi ne ADC_SPEEDL 0X20 #defi ne ADC_SPEEDH 0X40 #defi ne ADC_SPEEDHH 0X60sbit CS=P2A0;/LCD12864串行通信片选sbit SID=P2A1;/LCD12864 串行通信数据口sbit SCLK=P2A2;/LCD12864串行通信同步时钟信号sbit PSB=P2A5;/LCD12864 并/串选择:H并行L串行/AD转换高八位/AD转换低八位un s
27、ig ned int temp1,sh1,ge1, n1,m1;un sig ned char ad_result_data10;un sig ned char ad_result_low210;un sig ned char ad_result_total10;/AD转换总十位unsigned char ad_average_result;/AD 转换十次的平均值un sig ned char Ain,Vin;un sig ned char b,t,R;char tp=0;unsigned char code ma1 6=0xb5,0xe7,0xd1,0xb9,0xa1,0xc3; /电压:
28、un sig ned char code ma2="."uchar code disp1=" 提示:按 1 键进入"uchar code disp2="功能选择界面."un sig ned char code num 0=0xa3,0xb0;un sig ned char code nu m1=0xa3,0xb1;un sig ned char code nu m2=0xa3,0xb2;un sig ned char code nu m3=0xa3,0xb3;un sig ned char code num 4=0xa3,0xb4;u
29、n sig ned char code nu m5=0xa3,0xb5;un sig ned char code nu m6=0xa3,0xb6;un sig ned char code nu m7=0xa3,0xb7;un sig ned char code nu m8=0xa3,0xb8;un sig ned char code nu m9=0xa3,0xb9;/ 模块延时程序1msvoid delay1ms(ui nt delay1ms) STC11F60XE,22.1184M,延时 1msuint i,j;for(;delay1ms>0;delay1ms-)for(i=0;i&l
30、t;7;i+)for( j=0;j<210;j+);void delay(ui nt delay) STC11F60XE,22.1184M,延时 170usuint i,j;for(;delay>0;delay_)for(i=0;i<124;i+);for( j=0;j<124;j+);/*AD转换程序*/void AD_i nitiate() /初始化函数ES=0;TMOD=Ox21; /定时计数器方式控制寄存器,"自动重装,16位计数器".SCON=0x50; /串行控制寄存器,方便在串口助手那观察TH1=0xfa;TL1=0xfa;TR1=1;
31、void ADC_Power_On()/AD 转换电ADC_CONTR|=0x80;delay(5);/必要的延时void get_ad_result()/取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据uint i,q=0;for(i=0;i<10;i+)tp=0;ADC_RES=0;/高八位数据清零,STC12C5A60S2 AD 数据寄存名与STC12C54 X系列不同ADC_RESL=0;/低两位清零ADC_CONTR|=0x08; / 启动 AD 转换while(!tp)/判断AD转换是否完成tp=0x10;tp&=ADC_CONTR;ADC_
32、CONTR&=0xe7; ad_average_result=ADC_RES; q=q+ad_average_result;ad_average_result=q/10;ad_average_result=ad_average_result*4*5000/1024;/*ad换纟结束 */void send_ad_result() /取AD结果函数发送到串口 ,方便调试SBUF=n1;while(TI=0);TI=0;delay1ms(100);SBUF=R>>4;/ 电压采样程序void caiyangP10()/ 测电压P1M1|=OxO1;ADC_CONTR=OxeO;
33、/设置P1.0为输入AD转换口P1MO|=OxO1;/ 设 P1_0 为开漏模式 女口:P1_0= #00000000Bdelay(2);/取转换数据get_ad_result();Vi n=ad_average_result;R=Vi n;/* 写控制字到LCD12864*/void write_cmd(uchar cmd)uchar i;uchar i_data;i_data=0xf8;/命令控制字:11111000 写指令 11111010 写数据 11111100 读状态11111110读数据CS=1;/片选置高,才能进行读写操作SCLK=0;/* 写命令控制字*/for(i=0;i&
34、lt;8;i+)/循环八次,每次读取一位数据SID=(bit)(i_data&0x80);/bit 表示取其最高位SCLK=O;SCLK=1;/正跳变写入指令i_data=i_data<<1;/ 左移一位/* */* 写指令高四位*/i_data=cmd;i_data=i_data&OxfO;/ 把低四位置 0for(i=0;i<8;i+)/循环八次,每次读取一位数据SID=(bit)(i_data&0x80);/bit 表示取其最高位SCLK=0;SCLK=1;/正跳变写入指令i_data=i_data<<1;/ 左移一位/* */i_d
35、ata=cmd;i_data=i_data<<4;for(i=0;i<8;i+)/* 写指令低四位*/,再把低四位置0/左移四位,把低四位的数据移到高四位/循环八次,每次读取一位数据SID=(bit)(i_data&0x80);/bit表示取其最咼位SCLK=O;SCLK=1;/正跳变写入指令i_data=i_data<<1;/ 左移一位/* */CS=0;/把片选置低delay1ms(5);/延时是因为没有进行忙检测,适当的延时可以不进行忙检测/* */* 写数据到 LCD12864*/void write_dat(uchar dat)uchar i;u
36、char i_data;i_data=Oxfa;CS=1;for(i=0;i<8;i+)SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;i_data=dat;i_data=i_data&0 xfO;for(i=0;i<8;i+)SID=(bit)(i_data&0x80);SCLK=0;SCLK=1;i_data=i_data<<1;i_data=dat;i_data=i_data<<4;for(i=0;i<8;i+)SID=(bit)(i_data&
37、;0x80);SCLK=0;SCLK=1;i_data=i_data<<1;cs=o;delay1ms(5);/* */* 显示坐标*/void lcd_pos(uchar x,uchar y)/汉字显示坐标,x为哪一行,y为哪一列uchar pos;if(x=0)x=0x80;/ 第一行else if(x=1)x=0x90;/ 第二行else if(x=2)x=0x88;/第三行else if(x=3)x=0x98;/第四行pos=x+y;/显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖)write_cmd(pos);/* */* 显示8个汉字*/void disp_
38、ha nzi(uchar code *ch n) uchar i;write_cmd(0x30); /基本指令操作方式for(i=0;i<16;i+)16 列*8 个汉字=128 (刚好)write_dat(ch ni);/* */* 显示数字*/void disp_ num (uchar code *ch n)uchar i;write_cmd(0x30); /基本指令操作方式for(i=0;i<2;i+)1 个数字write_dat(ch ni);void disp_ nu mber(uchar num)switch( num)case 0: disp_ num(num 0);break;ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026防疫人员面试题库及答案
- 2026辅警必练面试题及答案
- 软件工程师技术水平绩效衡量表
- 2026海门教师面试题目及答案
- 嘉峪关市2025-2026学年高三下第一次测试生物试题含解析
- 四川省南充市2025-2026学年高三最后一模生物试题含解析
- 汽车维修服务技师技能考核标准指南
- 守护校园安全安全意识常伴,小学主题班会课件
- 小学生习惯养成与学习方法小学主题班会课件
- 制造工厂设备维护工程师绩效评定表
- 安全工伤培训总结课件
- 山东省潍坊市2024-2025学年高二下学期期末考试政治试题(含答案)
- 重症超声在ECMO治疗中的应用
- 2025年1月国家开放大学汉语言文学本科《外国文学专题》期末纸质考试试题及答案
- 轧钢机械装备及其智能化技术 课件 第7章 剪切机
- 04S520埋地塑料排水管道施工标准图集
- 锅炉更换烟管安装施工方案
- 安徽大学《数据结构与算法》2023-2024学年第一学期期末试卷
- 中建企业定额数据库(劳务分包库)
- 四川省成都市第十一中学2024-2025学年高一上学期入学分班质量检测数学试题(原卷版)
- 《蚂蚁和西瓜》少儿美术绘画课件创意教程教案
评论
0/150
提交评论