1、可用按键修改时间的DS1302时钟显示程序资料#include/52单片机头文件,规定了52单片机的寄存器和IO口等#include/_nop_空指令及左右循环移位子函数库 #include lcd1602.hsbit sda=P11; /位定义1302芯片的接口,数据输出端定义在P1.1引脚sbit rst=P12; /位定义1302芯片的接口,复位端口定义在P1.1引脚sbit sck=P10; /位定义1302芯片的接口,时钟输出端口定义在P1.1引脚 sbit s1=P13;/定义设置按钮 sbit s2=P14;/定义调时按钮 sbit s3=P16;/定义确定按钮 sbit s4=
2、P17; sbit ACC0=ACC0; sbit ACC7=ACC7; sbit beep=P36; uchar fen,shi,miao,ri,yue,nian,zhou,s1num,s2num,s4num,flag1,flag2,lshi,lfen; uchar code table= 2014: : ;/要写入1602液晶的数据uchar code table1= : : : ;/字库中的字可直接以外加号的形式直接写入uchar code table2= Welcome To Lcd!;/欢迎界面 uchar code table3=Happy Every One!; /欢迎界面 /*
3、 时函数,z的取值为这个函数的延时ms数,delay(200);大约延时200ms.delay(500);大约延时500ms */ void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-); void delay20ms(void) /3*i*j+2*i=3*100*60+2*100=20000s=20ms; unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ;/*函数功能:延时1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是1毫秒*/void dela
4、y1ms() unsigned char i,j; for(i=0;i4;i+) for(j=0;j33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i; for(i=0;in;i+) delay1ms(); /*蜂鸣器函数*/ void didi() uchar i; for(i=0;i60;i+) beep = 0; delay(1); beep = 1; delay(1); /*/void gudingtime_1602() uchar num; write_com(0x80);/将指针
5、指向初始位置 for(num=0;num11;num+)/循环函数,用于将 12- - 写入液晶 write_data(tablenum); write_com(0x80+0x40);/将指针指向1602液晶的第二行 for(num=0;num16;num+)/功能与上同,用于将 : : : 写入 write_data(table1num); /*显示欢迎界面函数*/ void displaystar(void) uchar i; write_com(0x80); for(i=0;i16;i+) write_data(table2i); write_com(0x80+0x40); for(i=
6、0;i0;i-) sda=ACC0; sck=1; sck=0; ACC=ACC1; /*读数据字节子函数*/uchar Output_1byte(void)/读一字节数据 uchar i; for(i=8;i0;i-) ACC=ACC1; ACC7=sda; sck=1; sck=0; return(ACC); /*写DS1302数据函数*/ void write_1302(uchar DS_ADD,uchar DS_DAT)/写操作 rst=0; sck=0; rst=1; Input_1byte(DS_ADD); Input_1byte(DS_DAT); sck=1; rst=0; /*
7、读DS1302数据函数*/ uchar read_1302(uchar DS_ADD)/读操作 uchar DS_INF; rst=0; sck=0; rst=1; Input_1byte(DS_ADD); DS_INF=Output_1byte(); sck=1; rst=0; return(DS_INF); /*初始化DS1302子函数*/ void inital_1302() write_1302(0x8e,0x00);/禁止写保护 /*write_1302(0x90,0xaa);/定义充电 */ write_1302(0x80,0x53);/秒 write_1302(0x84,0x13
8、);/时 write_1302(0x82,0x43);/分 write_1302(0x8c,0x14);/年 write_1302(0x88,0x09);/月 write_1302(0x86,0x06);/日 write_1302(0x8a,0x06);/星期 write_1302(0xc0,0x08);/闹钟小时初始化 write_1302(0xfc,0x00);/闹钟分钟初始化 write_1302(0x8e,0x80);/开保护 /*扫描函数 */ void keyscan() if(s1=0&s4num=0) /按键1按下且s4再次之前未曾按过 delay(5); if(s1=0&s4
9、num=0) flag1=1; s1num+; while(!s1); didi(); if(s1num=1) write_com(0x80+0x40+8);/光标移动到*位置 write_com(0x0f);/显示光标 if(s1num=2) write_1302(0x8e,0x00);/可以写 write_1302(0x80,miao);/写入秒信息 write_1302(0x8e,0x80);/开写保护 write_com(0x80+0x40+5); if(s1num=3) write_1302(0x8e,0x00); write_1302(0x82,fen); /分 write_130
10、2(0x8e,0x80); write_com(0x80+0x40+2); if(s1num=4) write_1302(0x8e,0x00); write_1302(0x88,yue); /月 write_1302(0x8e,0x80); write_com(0x80+13); if(s1num=5) write_1302(0x8e,0x00); write_1302(0x84,shi); /时 write_1302(0x8e,0x80); write_com(0x80+10); if(s1num=6) write_1302(0x8e,0x00); write_1302(0x86,ri);
11、/日 write_1302(0x8e,0x80); write_com(0x80+7); if(s1num=7) write_1302(0x8e,0x00); write_1302(0x8c,nian); /年 write_1302(0x8e,0x80); write_com(0x80+4); /*if(s1num=8) flag1=0; s1num=0; write_1302(0x8e,0x00); write_1302(0x8a,zhou); write_1302(0x8e,0x80); write_com(0x0c);/不显示光标 */ /*/ if(s1num!=0&s4num=0)/
12、按键1按下*次且s4再次之前未曾按过 (按键按下时,时间修改函数) if(s2=0) delay(5); if(s2=0) while(!s2); didi(); if(s1num=1) int x1,x2; x1=miao%16; x2=miao/16; x1+; if(x1=10) x1=0; x2+; if(x2=6) x2=0; miao=x1+x2*16; /秒 write_sfm(0x40+7,miao);/将修改的数送到1602显示 write_com(0x80+0x40+8);/挪回光标 if(s1num=2) int x3,x4; x3=fen%16; x4=fen/16;
13、x3+; if(x3=10) x3=0; x4+; if(x4=6) x4=0; fen=x3+x4*16; write_sfm(4+0x40,fen); write_com(0x80+0x40+5); /分 if(s1num=3) int x5,x6; x5=shi%16; x6=shi/16; x5+; if(x6=2&x5=4) x5=0; x6=0; if(x5=10) x5=0; x6+; shi=x5+x6*16; write_sfm(1+0x40,shi); /时 write_com(0x80+0x40+2); /*if(s1num=4) zhou+; if(zhou=8) zh
14、ou=1; write_zhou(zhou); write_com(0x80+15); */ if(s1num=4) int x5,x6; x5=ri%16; x6=ri/16; x5+; if(x6=3&x5=1) x5=1; x6=0; if(x5=10) x5=0; x6+; ri=x5+x6*16; write_sfm(9,ri); /日 write_com(0x80+10); if(s1num=5) int x5,x6; x5=yue%16; x6=yue/16; x5+; if(x6=1&x5=3) x5=1; x6=0; if(x5=10) x5=0; x6+; yue=x5+x
15、6*16; write_sfm(6,yue); /月 write_com(0x80+7); if(s1num=6) int x5,x6; x5=nian%16; x6=nian/16; x5+; if(x6=2&x5=1) x5=1; x6=0; if(x5=10) x5=0; x6+; nian=x5+x6*16; write_sfm(3,nian); /年 write_com(0x80+4); /*时间调整模式*/ if(s1num!=0|s4num!=0)/ 在调整模式下 if(s3=0)/如果确定键按下 delay(5); if(s3=0) /延时并重新检测S3是否按下,用于差小误差
16、if(s1num!=0) while(!s3); didi();/在松手时将调整后的时间、日期及周信息写入 DS1302,退出调整模式并隐藏光标,按键次数清0 write_1302(0x8e,0x00); write_1302(0x80,miao); write_1302(0x84,shi); write_1302(0x82,fen); write_1302(0x8a,zhou); write_1302(0x8c,nian);/年 write_1302(0x88,yue);/月 write_1302(0x86,ri); write_1302(0x8e,0x80); flag1=0; write
17、_com(0x0c); s1num=0; if(s4num!=0) while(!s3); didi();/在松手时将调整后的时间、日期及周信息写入DS1302,退出调整模式并隐藏光标,按键次数清0 write_1302(0x8e,0x00); write_1302(0xc0,lshi); write_1302(0xfc,lfen); write_1302(0x8e,0x80); flag2=0; s4num=0; write_com(0x0c); if(s4=0&s1num=0)/按键4按下*次且s1再次之前未曾按过 (闹钟位置已改好的) delay(5); if(s4=0&s1num=0)
18、 s4num+; flag2=1; while(!s4); didi(); if(s4num=1) write_com(0x80+0x40+14); write_com(0x0f); if(s4num=2) write_1302(0x8e,0x00);/可以写 write_1302(0xfc,lfen);/闹钟初始化 write_1302(0x8e,0x80);/开写保护 write_com(0x80+0x40+11); if(s4num=3) s4num=0; flag2=0; write_1302(0x8e,0x00);/可以写 write_1302(0xc0,lshi);/闹钟初始化 write_1302(0x8e,0x80);/开写保护 write_com(0x0c);/不显示光标 if(s4num!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1