1、万年历程序/*功能 :DS1302+lcd1602 万年历时钟1,显示年、月、日、星期、时、分、秒2,DS1302掉电不丢失时间3,按键校准编写者: 温斌编写日期:2011-11-15*/#include#define uchar unsigned char#define uint unsigned intsbit SCLK=P20;sbit IO=P21;sbit RST=P22;sbit lcdrs=P24;sbit lcdrw=P25;sbit lcden=P26;sbit ACC7=ACC7;sbit s1=P10;sbit s2=P11;sbit s3=P12;uchar flag;
2、uchar shi,fen,miao,week,month,year,day;uchar code table=2011-11-14 01;uchar code table1=00:00:00;uchar code add=0x8c,0x88,0x86,0x8a,0x84,0x82,0x80;/* ms级延时子程序*/void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=120;y0;y-);/* DS1302驱动程序部分*/void write_ds1302(uchar add,uchar date) uchar i,temp; RST=0; S
3、CLK=0; RST=1; for(i=0;i=1; SCLK=1; for(i=0;i=1; SCLK=1; RST=0;uchar read_ds1302(uchar add) uchar i,temp,dat,dat1; RST=0; SCLK=0; RST=1; for(i=0;i=1; SCLK=1; for(i=0;i=1; SCLK=0; RST=0; dat=ACC;dat1=dat/16; dat=dat%16; dat=dat+dat1*10; return(dat);/* DS1302初始化*/void init_ds1302() write_ds1302(0x8e,0x
4、00); /禁止写保护 write_ds1302(0x8c,0x11); /年 write_ds1302(0x88,0x11); /月 write_ds1302(0x86,0x14); /日 write_ds1302(0x8A,0x01); /星期 write_ds1302(0x84,0x16); /时 write_ds1302(0x82,0x46); /分 write_ds1302(0x80,0x00); /秒 write_ds1302(0x8e,0x80); /允许写保护/* 读取DS1302各寄存器数据*/void read_time() miao=read_ds1302(0x81);
5、/秒寄存器 fen=read_ds1302(0x83); /分 shi=read_ds1302(0x85); /时 week=read_ds1302(0x8B); /星期 day=read_ds1302(0x87); /日 month=read_ds1302(0x89); /月 year=read_ds1302(0x8d); /年/* LCD1602液晶驱动显示部分*/void write_cmd(uchar cmd) lcdrs=0; /低电平选择指令寄存器 lcdrw=0; lcden=0; P0=cmd; delay(5); lcden=1; lcden=0;void write_dat
6、e(uchar date) lcdrs=1; /高电平选择数据寄存器 lcdrw=0; lcden=0; P0=date; delay(5); lcden=1; lcden=0;void init_lcd() uchar i; write_cmd(0x01);/清屏 write_cmd(0x38);/8位数据位,双行显示,5*7点阵 write_cmd(0x0c);/显示开,光标不显示,不闪烁 write_cmd(0x06);/输入方式从左至右 write_cmd(0x80); for(i=0;i13;i+)write_date(tablei); write_cmd(0xc0); for(i=
7、0;i8;i+)write_date(table1i);/* 数据转换使其正确显示在1602上*/void display_buff(uchar add,uchar date) uchar shi,ge; shi=date/10; ge=date%10; write_cmd(0x80+add); write_date(0x30+shi); write_date(0x30+ge);/* 显示各种数据,年、月、 日、星期、时、分、秒*/void display_time() display_buff(2,year); display_buff(5,month); display_buff(8,da
8、y); display_buff(11,week); display_buff(0x40,shi); display_buff(0x40+3,fen); display_buff(0x40+6,miao);/* 写字符串函数*/void wstring(uchar *s) while(*s) write_date(*s); s+; /* 星期更新*/void week1() write_cmd(0xc0+11); switch(week) case 01:wstring(Mon);break; case 02:wstring(Tus);break; case 03:wstring(Wen);b
9、reak; case 04:wstring(Thu);break; case 05:wstring(Fri);break; case 06:wstring(Sta);break; case 07:wstring(Sun);break; default:break; /* 键盘扫描*/void keyscan() uchar i,temp; if(s1=0) delay(10); if(s1=0) while(!s1); flag+; write_ds1302(0x8e,0x00); /禁止写保护 if(flag=8) flag=0; write_ds1302(0x8e,0x80); /允许写保
10、护 switch(flag) case 1:write_cmd(0x80+3); write_cmd(0x0f);break; case 2:write_cmd(0x80+6); write_cmd(0x0f);break; case 3:write_cmd(0x80+9); write_cmd(0x0f);break; case 4:write_cmd(0x80+12); write_cmd(0x0f);break; case 5:write_cmd(0xc0+1); write_cmd(0x0f);break; case 6:write_cmd(0xc0+4); write_cmd(0x0
11、f);break; case 7:write_cmd(0xc0+7); write_cmd(0x0f);break; default:break; if(s2=0) delay(10); if(s2=0) while(!s2); switch(flag) case 7: miao+; /设置键按动1次,调秒 if(miao=60) miao=0; display_buff(0x40+6,miao); temp=(miao)/10*16+(miao)%10; write_ds1302(0x80,temp); write_cmd(0xc0+7); break; case 6: fen+; if(f
12、en=60) fen=0; display_buff(0x40+3,fen); temp=(fen)/10*16+(fen)%10; write_ds1302(0x82,temp); write_cmd(0xc0+4); break; case 5: shi+; if(shi=24) shi=0; display_buff(0x40,shi); temp=(shi)/10*16+(shi)%10; write_ds1302(0x84,temp); write_cmd(0xc0+1); break; case 4: week+; if(week=8) week=1; display_buff(1
13、1,week); temp=(week)/10*16+(week)%10; write_ds1302(0x8a,temp); week1(); write_cmd(0x80+12); break; case 3: day+; if(day=32) day=1; display_buff(8,day); temp=(day)/10*16+(day)%10; write_ds1302(0x86,temp); write_cmd(0x80+9); break; case 2: month+; if(month=13) month=1; display_buff(5,month); temp=(mon
14、th)/10*16+(month)%10; write_ds1302(0x88,temp); write_cmd(0x80+6); break; case 1: year+; if(year=100) year=0; display_buff(2,year); temp=(year)/10*16+(year)%10; write_ds1302(0x8c,temp); write_cmd(0x80+3); break; default:break; if(s3=0) delay(10); if(s3=0) while(!s3); switch(flag) case 7: miao-; /设置键按
15、动1次,调秒 if(miao=0) miao=59; display_buff(0x40+6,miao); temp=(miao)/10*16+(miao)%10; write_ds1302(0x80,temp); write_cmd(0xc0+7); break; case 6: fen-; if(fen=0) fen=59; display_buff(0x40+3,fen); temp=(fen)/10*16+(fen)%10; write_ds1302(0x82,temp); write_cmd(0xc0+4); break; case 5: shi-; if(shi=0) shi=59
16、; display_buff(0x40,shi); temp=(shi)/10*16+(shi)%10; write_ds1302(0x84,temp); write_cmd(0xc0+1); break; case 4: week-; if(week=0) week=7; display_buff(11,week); temp=(week)/10*16+(week)%10; write_ds1302(0x8a,temp); week1(); write_cmd(0x80+12); break; case 3: day-; if(day=0) day=31; display_buff(8,da
17、y); temp=(day)/10*16+(day)%10; write_ds1302(0x86,temp); write_cmd(0x80+9); break; case 2: month-; if(month=0) month=12; display_buff(5,month); temp=(month)/10*16+(month)%10; write_ds1302(0x88,temp); write_cmd(0x80+6); break; case 1: year-; if(year=0) year=20; display_buff(2,year); temp=(year)/10*16+(year)%10; write_ds1302(0x8c,temp); write_cmd(0x80+3); break; default:break; /* 主函数*/void main() init_lcd(); init_ds1302(); /第一次烧到单片机中不屏蔽,允许DS1302初始化 /第二次烧需要屏蔽,禁止DS1302初始化 while(1) keyscan(); if(flag=0) week1(); read_time(); display_time();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1