1、 writetime_ds1302(0x8e,0x00); /write enable for(i=0;i7;i+) /set time-second,munite,hour,day,month,week,year writetime_ds1302(0x80+i*2,timei); writetime_ds1302(0x8e,0x80); /write protect/从DS1302中一次读出所有的数据并存在数组time7当中void gettime_ds1302()i+) /get time-second,munite,hour,day,month,week,year timei=readt
2、ime_ds1302(0x81+i*2);/往DS1302的地址ds1302_add处写入ds1302_cmd数据或命令void writetime_ds1302(uchar ds1302_add,uchar ds1302_cmd)/ ds1302_rst=0;/ ds1302_clk=0; ds1302_rst=1; writebyte_ds1302(ds1302_add); writebyte_ds1302(ds1302_cmd);/ ds1302_clk=1; ds1302_rst=0;/从DS1302的地址DS1302_ADD处读出时间值uchar readtime_ds1302(uc
3、har ds1302_add) uchar temp_data; temp_data=readbyte_ds1302(); return temp_data;/从DS1302中读出一字节并返回uchar readbyte_ds1302() i1)|0x80; else temp_data=1;*/ /*以上被注释部分的代码也可以用,实际测试过* if(ds1302_io) temp_data|=(1i); /如果读到高电平,则置位相应位 temp_data&=(10;i-) ds1302_io=temp_data&0x01;/将读到的时间显示在六个数码管上,该子程序只显示分秒时。void ti
4、me_display()=2; numdis(timei&0x0f ,i*2 ,20); numdis(timei&0xf0)4),i*2+1,20);/数码管显示子程序,将一个数num显示到某一位weixuan数码管void numdis(uchar num,uchar weixuan,uchar brightness ) while(brightness-)LED=num*0x10+weixuan*0x01; LED=LED_OFF;MS1602的读写时序*void Write(uchar tempdata) DB0_DB7=tempdata;RS=0;RW=0;E=0;nop;E=1;C
5、heckBusy();void WriteDDR(uchar tempdata)RS=1;void CheckBusy()DB0_DB7=0xff;RW=1;do nop; TEMP=DB0_DB7;while(TEMP&0x80)=0x80);二、#include sbit SCK=P36;sbit SDA=P34;sbit RST=P35;/ DS1302复位sbit set=P30;/定义按键端口sbit s1=P31;sbit s2=P32;sbit s3=P33;/*液晶口定义*/sbit RS=P24;/RS为数据/指令选择1/0sbit RW=P25;/读写sbit E=P26;
6、/E为使能信号bit flag;/是否读取时间的标志位uchar setn=0;/复位键、增加键、减少键按下次数uchar code time0=DATE: - - ;uchar code time1=TIME: : uchar l_tmpdate7=0,55,16,22,8,6,9;/秒分时日月周年/ 可随时更改uchar code write_add7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 写的寄存器地址uchar code read_add7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; /秒分时日月周年 读的
7、寄存器地址uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /共阴数码管 0-9加-熄灭表void delay(uint z) while(-z);void write_com(uchar com)/液晶写命令函数 RS=0;/写命令使能 RW=0;/写 delay(5000);/*在高脉冲下命令输入*/ E=0; P0=com; delay(500); E=1;void write_data(uchar dat)/液晶写数据函数 RS=1;/写数据使能/*在高脉冲下数据输入*/ P0=dat;vo
8、id init()/液晶初始化 uchar num; write_com(0x38);/显示模式设置 write_com(0x08);/显示关闭 write_com(0x01);/显示清屏 write_com(0x06);/光标移动设置整屏不移动 write_com(0x0c);/屏幕开、光标不闪(0)不显示(0) write_com(0x80); for(num=0;num /右移一位 SCK=1; /*/void Write_Ds1302(uchar add,uchar dat )/向寄存器写数据 RST=0; _nop_(); RST=1;/启动 Write_Ds1302_Byte(ad
9、d); /发送地址 Write_Ds1302_Byte(dat); /发送数据 /恢复uchar Read_Ds1302_Byte()/读一个字节 uchar i,temp=0x00;i+) /循环8次 读取数据 if(SDA) temp|=0x80; /每次传输低字节 return(temp);uchar Read_Ds1302(uchar address )/从寄存器读数据 uchar date; Write_Ds1302_Byte(address); date=Read_Ds1302_Byte(); /以下为DS1302复位的稳定时间 SDA=0; SDA=1; return (date
10、);/*/void Read_RTC(void) /读取日历 uchar i,*p; p=read_add; /读的地址传递i+) /分7次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+;/*/void Set_RTC(void) /设定日历 uchar i,*p,tmp; /BCD处理,将十六进制转换成十进制 tmp=l_tmpdatei/10; l_tmpdatei=l_tmpdatei%10; l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0x8E,0X00);/关闭写保护 p=write_add;/传要写的寄存
11、器地址 i+) /7次写入秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); Write_Ds1302(0x8E,0x80);/打开写保护void write_lcd() static uchar i,temp2; switch(i) case 0: write_com(0x80+0x40+0x0b);break;/秒 case 1: write_com(0x80+0x40+8);/分 case 2: write_com(0x80+0x40+5);/时 case 3: write_com(0x80+0x0b);/日 case 4: write_com(0x80+8);/月
12、 case 5: write_com(0x80+0x0e);/星期 case 6: write_com(0x80+5);/年 temp0=l_tmpdatei/16;/数据的转换 temp1=l_tmpdatei&0x0f; write_data(0x30+temp0); write_data(0x30+temp1); i+; if(i=7) i=0;uchar change(uchar x)/十进制转换成十六进制 uchar tep,y; y=x; tep=y/16; y=y%16; y=y+tep*10; return y;void keyscan() uchar tem2,tp,Flag
13、;/存储要更改的时间数据 if(set=0) flag=1;/时间停止/去键盘按下抖动 while(!set);/去键盘抬起时抖动 setn+; if(setn=1) write_com(0x80+0x40+12);/将光标移动到秒个位 write_com(0x0f);/显示光标并且闪烁 if(setn=2) write_com(0x80+0x40+9);/将光标移动到分个位 if(setn=3) write_com(0x80+0x40+6);/将光标移动到时个位 if(setn=4) write_com(0x80+15); if(setn=5) write_com(0x80+12); if(
14、setn=6) write_com(0x80+9); if(setn=7) write_com(0x80+6); if(setn=8) setn=0; Write_Ds1302(write_add0,l_tmpdate0); flag=0;/时钟正常运行/光标停止闪烁 if(setn!=0)/更改时间 if(s1=0)/增加时间 if(s1=0)s1); l_tmpdate0=change(l_tmpdate0); l_tmpdate0+; if(l_tmpdate0=60) l_tmpdate0=0; tp=l_tmpdate0/10; l_tmpdate0=l_tmpdate0%10; l
15、_tmpdate0=l_tmpdate0+tp*16; write_com(0x80+0x40+11); tem0=l_tmpdate0/16; tem1=l_tmpdate0& write_data(0x30+tem0); write_data(0x30+tem1); Flag=1; l_tmpdate1=change(l_tmpdate1); l_tmpdate1+; if(l_tmpdate1=60) l_tmpdate1=0; tp=l_tmpdate1/10; l_tmpdate1=l_tmpdate1%10; l_tmpdate1=l_tmpdate1+tp*16; Write_Ds1302(write_add1,l_tmpdate1); tem0=l_tmpdate1/16; tem1=l_tmpdate1& write_data(0x30+tem
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1