可调万年历以及温度1602液晶显示设计完全源程序1_第1页
可调万年历以及温度1602液晶显示设计完全源程序1_第2页
可调万年历以及温度1602液晶显示设计完全源程序1_第3页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、可调万年历以及温度显示设计完全源程序1602液晶1作者:日期:基于51单片机系列89C52单片机 的设计。此为主程序部分,还有另外一部 分为18b20的温度初始化模块一并也上 传啦/*1602液晶显示程序* * * * *# include<reg52.h># in elude intrins。h> #defi ne uchar un sig ned char#defi ne uint un sig nedintuchar a,miao,shi, fen, ri, yue,nian,week,flag1,key1 n , temp; #defi ne yh 0x80# def

2、ine er 0x80+0x40 /DS1302时钟芯片与 C51之间的引脚连接定义sbit IO=P1A1;sbit SCLK=P1A° ;sbit RST=P"2;sbit ACC0=ACCA0;sbit ACC7=ACCA7 ;/校时按键与C51的引脚连接定义/设置键/加键/减键/蜂鸣器,通过三极管9012驱动,sbit key仁P"5;sbit key2=P1A6;sbit key3=P1A7 ;/sbit buzzer=P1A3;端口低电平响typedef unsigned char BYTE ;typedef un sig ned int WORD;t

3、ypedef bit BOOL ;extern GetTemp(void);exter n un sig ned int idata Temperature;externInit18b20 ();un sig ned char a,b,c;sbitIcde n=P2A7;液晶使能位sbitIcdrw=P2A5 ;液晶读写位sbitIcdrs=P2A6;/数据命令选择位个人收集整理勿做商业用途uchar code tab1='-07012 ” ;/年显示的固定字符uchar code tab2 ="19:50:00"/时间显示的固定字符void w_cmd(uint

4、date );void w_data( uint date);*定时器1子函数*void systemni () -TMOD|= 0x11;TH1=0x8e ;/11。0592MTL1=0x33;IE = 0x8A;TR1 = 1;/ * * * * * *延时子函数* * * *void delay(uchar x )uchar y,z;for(y=x;y > 0; y-)for (z=110;z > 0; z-);/* * * * * * * * * * * * * * /lcdnit ()* 液晶初始化和写命令及数据命令* * * * * * * *void 示,lcden=

5、0; lcdrw=0 ; w_cmd(0x38 );5*7点阵,8位数据w_cmd(0x01); w_cmd(0x0c); w_cmd (0x06);初始使能端/写数据选择/设置液晶工作模式,意思:16* 2行显清显示开显示不显示光标/整屏不移动,光标自动右移w_cmd (yh+1);置之后开始显示for(a=0 ; a<14;a+) w_data (tab1 a); 分delay (3);w_cmd (er+2);个位置后开始显示日历显示固定符号从第一行第1个位/向液晶屏写日历显示的固定符号部时间显示固定符号写入位置,从第2for (a=0; a 8;a+)/写”命令子程序/写显示时间

6、固定符号,两个冒号w_data (tab2a ) delay(3) ; void w_cmd( uint date) _lcdrs=0; P0=date;delay (5); lcde n=1;delay (5); lcde n=0;void w_data(uint date )/ 写 数据子程序 _lcdrs=1 ; P0=date; delay(3) lcde n=1;delay (5) lcde n=0;/* * * * * DS1302有关子函数* *void write_byte (uchar dat) 写一个字节 _ACC=dat;RST=1;for (a=8;a> 0;a-

7、)IO=ACCO ;SCLK=0 ;SCLK=1 ;ACC=ACC>>1;/读一个字节uchar read_byte () _RST=1;for (a=8;a> 0;a-)ACC7=IO ;SCLK=1 ;SCLK=O;.ACC=ACC >> 1; return (ACC);/- 一 - void write_1302 (uchar add, uchar dat) 指定写入地址,数据RST=0;SCLK=0 ;RST=1;write_byte (add);write_byte (dat);SCLK=1 ;RST=0;uchar read_1302 (uchar a

8、dd) 定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1; write_byte (add); temp=read_byte ();SCLK=1 ;RST=0; return(temp);uchar BCD_Decimal(uchar bcd)返回十进制一uchar Decimal ;Decimal=bcd > >4;return(Decimal=Decimal*10+(bcd & =0x0F) void ds1302_init ()(2010-01 07, 12: 00:00,week4)RST=0;SCLK=0;write_1302 (0x8

9、e,0x00);II向1302芯片写函数,II从1302读数据函数,指IIBCD码转十进制函数,输入 BCD ,II1302芯片初始化子函数允许写,禁止写保护个人收集整理 write_1302 ( 0x80,0x00);初始秒数据00write_1302(0x82,0x53);初始分数据00#write_1302 ( 0x84 , 0x19); 写入初始小时数据12write_1302(0x8a,0x02);初始周数据4write_1302 ( 0x86 , 0x12);写入初始日期数据07write_1302 ( 0x88,0x07);入初始月份数据01 write_1302 (0x8c,0

10、x11);入初始年份数据10write_1302 (0x8e,0x80);勿做商业用途/向DS1302内写秒寄存器 80H写入/向DS1302内写分寄存器 82H写入/向DS1302内写小时寄存器 84H/向DS1302内写周寄存器 8aH写入/向DS1302内写日期寄存器 86H/向DS1302内写月份寄存器 88H写/向DS1302内写年份寄存器 8cH写/打开写保护/* * * *温度显示子函数 * *void write_temp(uchar add,uchar dat) 置_uchar gw, sw;gw=dat % 10;sw=dat/10;w_cmd (er+add);w_dat

11、a (0x30+sw);码w_data (0x30+gw );码 _w_data(0xdf);符库的该符号地址码w_data (0x43);写C的地址码* * * * /向LCD写温度数据,并指定显示位/取得个位数字/取得十位数字/er是头文件规定的值 0x80+0x40数字+30得到该数字的 LCD1602显示数字+30得到该数字的 LCD1602显示/显示温度的小圆圈符号,0xdf是液晶屏字显示"C"符号,0x43是液晶屏字符库里大/* * * * * * 时间显示子函数* * */取得个位数字/取得十位数字/er是头文件规定的值 0x80+0x40数字+30得到该数字

12、的LCD1602显示码数字+30得到该数字的LCD1602显示码void write_sfm(uchar add , uchar dat)现示数据两个参数uchar gw,sw;gw=dat % 10;sw=dat/10;w_cmd(er+add );w_data(0x30+sw );w_data(0x30+gw );/向LCD写时分秒,有显示位置加、/ * * * * *年、月、日显示子函数void write_ ny r(uchar add,uchar dat) 示数据,两个参数uchar gw, sw;gw=dat%10;sw=dat/10;w_cmd (yh+add);w_data (

13、0x30+sw); w_data(0x30+gw);* */向LCD写年月日,有显示位置加数、/取得个位数字取得十位数字/设定显示位置为第一个位置 +add/数字+30得到该数字的 LCD1602显示码数字+30得到该数字的LCD1602显示码/* * *写星期子函数* *void write_week (uchar week) _/写星期函数w_cmd (yh+0x0c);/星期字符的显示位置switch (week)case 1:w_data (' M ; w_data ('O'); w_data('N '); break;/星期数为1时,显示cas

14、e 2: w_data (' T'); w_data('U'); w_data('E '); break;case 3:w_data('W '); w_data('E ;') w_data( ' )D: break;星期数据为2时显示/星期数据为3时显示case 4: w_data (' T'; w_data( ' )H' w_data ('U ' break;/星期数据为4是显示case 5:w_data ('F ');w_data('

15、;R');w_data (');'break;/星期数据为5时显示case 6: w_data (' S') w_data('T ;') w_data( ' A');/星期数据为6时显示break;case 7:w_data (' $; w_data ('U '); w_data( ' )N: break;/ * *键盘扫描有关函数*void keysca n()if (key1=0)delay(9);if (key1=0 )/ buzzer=0;/ delay(20);/ buzzer=1

16、;while (!key1);key1n+ ;if (key1 n=9 )key1n=1;年、返回,8个功能循环switch(key1 n)case 1:TR0=0 ;TR仁0 ;w_cmd (er+0x09); w_cmd(0x0f);temp= (miao)/10*16+(miao) write_1302(0x8e,0x00 ); write_1302(0x80,0x80|temp) write_1302 ( 0x8e, 0x80); break;case 2:w_cmd (er+6);/write_1602com(0x0f); break;case 3:w_cmd (er+3);/wri

17、te_1602com (0x0f); break;case 4: w_cmd(yh+0x0e);/星期数据为7时显示* * * * */key1为功能键(设置键)延时,用于消抖动/延时后再次确认按键按下/蜂鸣器短响一次设置按键共有秒、分、时、星期、日、月、/关闭定时器/设置按键按动一次,秒位置显示光标/设置光标为闪烁% 10;/秒数据写入 DS1302;/miao按2次fen位置显示光标按动3次,shi/按动4次,week个人收集整理勿做商业用途write_1602com (OxOf);break;case 5: w_cmd(yh+0x0a) ;/按动 5 次,riwrite_1602com

18、(0x0f);break;case 6: w_cmd (yh+0x07) ;/按动 6 次,yuewrite_1602com (OxOf);break;case 7:w_cmd(yh+0x04) ;/按动 7 次,nian/write_1602com (0x0f);break;case 8:w_cmd (0x0c);/按动到第8次,设置光标不闪烁TR0=1 ; 打开定时器temp= ( miao)/10*16+ (miao)% 10;write_1302 (0x8e, 0x00);write_1302 (0x80, 0x00|temp);/miao 数据写入 DS1302write_1302(

19、0x8e,0x80);break;/- 一 - 一 -一key2 一-一 一 if (key1n!=0 )键次数不等于零)if(key2=0)delay (10);if(key2=0 )/ buzzer=0;/ delay (20);/ buzzer=1; while (!key2);switch (key1 n) case 1: miao+;if (miao=60) miao=0; write_sfm(0x08,miao );temp= (miao) /10*16+(miao )当key1按下以下。再按以下键才有效/上调键/蜂鸣器短响一次/设置键按动1次,调秒键(按个人收集整理勿做商业用途w

20、rite_1302(0x8e,0x00 ); write_1302 ( 0x80, temp);write_1302(0x8e,0x80 );w_cmd(er+0x09 );write_1602com(0x0b);break;case 2: fen+;if(fen=60 )fen=0;write_sfm (0x05,fen);temp= (fen)/10 玄 16+ (fen)%10 ; write_1302 (0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80);w_cmd(er+6 );break;case 3:shi+;if (

21、shi=24)shi=0;write_sfm(2,shi);temp= (shi) /10 * 16+ (shi) %10;write_1302 (0x8e,0x00);write_1302 (0x84,temp);write_1302 ( 0x8e, 0x80);w_cmd (er+3);break;case 4: week+;if(week=8 )week=1;w_cmd (yh+0x0C);write_week (week);temp=(week)/10 玄 16+(week)% 10;write_1302 (0x8e, 0x00);write_1302 (0x8a,temp);writ

22、e_1302 ( 0x8e,0x80);w_cmd (yh+0x0e);break;case 5: ri+;if(ri=32)ri=1;write_nyr(9 , ri);temp=(ri)/10*16+(ri) % 10;write_1302(0x8e , 0x00);write_1302(0x86 , temp);write_1302 (0x8e, 0x80);w_cmd (yh+10);break;case 6:yue+;if(yue=13 )yue=1 ;write_nyr (6,yue);temp= (yue)/10*16+(yue ) %10; write_1302(0x8e ,

23、0x00); write_1302 (0x88,temp); write_1302 (0x8e,0x80); w_cmd(yh+7 );break;case 7: nian+;if(nian=100)nian=0;write_nyr(3 , nian);temp=(nian)/10 * 16+(nian ) %10; write_1302 (0x8e, 0x00); write_1302 ( 0x8c,temp); write_1302(0x8e,0x80);w_cmd(yh+4);break;/减键key3 ,各句功能参照加键'注释if(key3=0)delay (10);if(ke

24、y3=0 ) buzzer=0;调延时,消抖动/蜂鸣器短响一次/delay (20);/buzzer=1; while (!key3); switch(key1 n )case 1: miao-; if(miao= 1) miao=59;write_sfm(0x08,miao );temp=(miao) /10* 16+ (miao)%10;write_1302(0x8e ,0x00);write_1302(0x80 ,temp);个人收集整理勿做商业用途write_1302 (0x8e, 0x80);w_cmd (er+0x09);write_1602com(0x0b);break;case

25、 2: fen-;if(fe n= 1)fen=59;write_sfm(5,fen );temp=(fen) /10 玄 16+(fen )% 10;write_1302(0x8e,0x00 );write_1302 (0x82, temp);write_1302(0x8e , 0x80);w_cmd (er+6);break;case 3:shi-;if(shi= 1)shi=23;write_sfm(2 , shi);temp=(shi) /10* 16+(shi) %10;write_1302(0x8e , 0x00);write_1302 ( 0x84, temp);write_13

26、02 (0x8e, 0x80);w_cmd(er+3 );break;case 4:week-;if(week=0)week=7;w_cmd (yh+0x0C);write_week (week);temp=(week) /10*16+ (week) %10;write_1302 ( 0x8e,0x00);write_1302 (0x8a,temp);write_1302 (0x8e,0x80);w_cmd (yh+0x0e );break;case 5:ri-;if (ri=0 )ri=31;write_nyr(9 , ri);temp= (ri)/10 衣 16+ (ri)% 10;/十进

27、制转换成 DS1302 要求的 DCB 码 write_1302 ( 0x8e,0x00); /允许写,禁止写保护write_1302 ( 0x86,temp) ; /向DS1302内写日期寄存器 86H写入调整 后的日期数据BCD码write_1302(0x8e,0x80);/ 打开写保护w_cmd ( yh+10); /因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 6:yue-;if (yue=O)yue=12;write_nyr (6, yue);temp= (yue) /10*16+(yue) % 10; 十进制转换成 DS1302 要求的 DCB

28、 码write_1302(0x8e,0x00);允许写,禁止写保护write_1302 ( 0x88,temp); /向DS1302内写月份寄存器 88H写入调整后 的月份数据BCD码write_1302 ( 0x8e, 0x80) ;/打开写保护 w_cmd ( yh+7);因为设置液晶的模式是写入数据后,指针自动加一, 所以需要光标回位break;case 7:nian-;if(n ia n=-1)nian=99 ;write_nyr(3, nian);temp=(nian ) /10* 16+(nian)%10 ; /十进制转换成 DS1302 要求的 DCB 码 write_1302

29、( 0x8e, 0x00);/ 允许写,禁止写保护 write_1302(0x8c,temp) ; /向DS1302内写年份寄存器 8cH写入调整后的 年份数据BCD码write_1302(0x8e,0x80 ); /打开写保护 w_cmd (yh+4); /因为设置液晶的模式是写入数据后,指针自动加一, 所以需要光标回位break;* * *“ ” TO中断”初始* * * * *void in trupt()TMOD=0x01 ;EA=1;ET0=1;TH0=(65536 50000)/256 ; TL0= (65536-50000) % 256; TR0=1 ;/ * void init ()/ ” T中断”初始选择16位定时器0x01/开总中断/开“ T0中断允许位定时器装初值/定时器、计数器设置函数 */* *TMOD=Ox11 ;THO=O ;TLO=O;EA=1 ;ET0=1;TR0=1;* *主函数*指定定时/计数器的工作方式为3/定时器T0的高四位=0/定时器T0的低四位=0/系统允许有开放的中断/允许T0中断开启中断,启动定时器v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论