版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考物理总复习专题十电磁感应第2讲法拉第电磁感应定律、自感、涡流练习含答案
- 广东省阳东广雅学校高二信息技术 三维动画制作教案
- 2024年学年七年级语文下册 第二单元 告别抒怀 第4课《告别昨天的我》教案2 新疆教育版
- 2024-2025学年高中化学 第3章 第2节 课时3 铁的重要化合物教案 新人教版必修1
- 2024年届九年级历史上册 第5课 为争取“民主”“共和”而战教案2 北师大版
- 2023六年级数学上册 二 比和比例 测量旗杆高度教案 冀教版
- 2023六年级数学下册 三 解决问题的策略第三课时 解决问题的策略(练习课)教案 苏教版
- 文书模板-中医师承关系合同书
- 高考地理一轮复习第十二章环境与发展第一节环境问题与可持续发展课件
- 生活水泵房管理制度
- 老年人的火灾预防与自救技巧课件
- 新时代鲁班精神
- 《教育的初心》读书分享
- 软件工程生涯发展展示
- 检验检测机构质量管理
- 基于PLC的热水箱恒温控制系统
- 医疗机构校验管理课件
- 痔疮护理课件
- 药物临床试验突发事件应急预案
- 《继电保护培训》课件
- 医院装饰工程服务方案
评论
0/150
提交评论