1、 /DS1302片选sbit DIO=P31; /DS1302数据信号sbit SCLK=P30; /DS1302时钟信号sbit key0=P32; /功能键sbit key1=P33; /增大键sbit key2=P34; /减小键 sbit beep=P10; /蜂鸣器sbit ACC7=ACC7;sbit ACC0=ACC0; unsigned char READ_1302(unsigned char addr);char hour,minute,second,week,day,month,year,tem;unsigned char num,flag,count,wendu;unsi
2、gned char str1= 20 - - ;unsigned char str2= :void delay(unsigned char z);void INITIAL_1302();void WRITE_1302(unsigned char addr,unsigned char date);void LCD_WRITE_COM(unsigned char com);void LCD_WRITE_DATA(unsigned char date);void LCD_WRITE_SFM(unsigned char addr,unsigned char date);void LCD_WRITE_N
3、YR(unsigned char addr,unsigned char date);void LCD_WRITE_WEEK(unsigned char week);void LCD_INITIAL();void keyscan();void INITIAL_TEMER0();void w1602c(uchar com);void w1602d(uchar data01);void write_temp(uchar add,uchar date);void main() LCD_INITIAL(); /液晶初始化 INITIAL_1302(); /DS1302初始化 INITIAL_TEMER0
4、(); /定时器初始化 beep=0;/蜂鸣器长响一次 delay(1000); beep=1; while(1) keyscan(); /按键扫描 if(flag=0) /当标志位为0,允许读取DS1302数据,将数据送入液晶显示 second=READ_1302(0x81); LCD_WRITE_SFM(8,second); minute=READ_1302(0x83); LCD_WRITE_SFM(5,minute); hour=READ_1302(0x85); LCD_WRITE_SFM(2,hour); week=READ_1302(0x8b); LCD_WRITE_WEEK(wee
5、k); day=READ_1302(0x87); LCD_WRITE_NYR(9,day); month=READ_1302(0x89); LCD_WRITE_NYR(6,month); year=READ_1302(0x8d); LCD_WRITE_NYR(3,year); wendu=ReadTemperature();/将18b2头文件运行返回的函数结果送到变量wendu中,用于显示 write_temp(11,wendu);/显示温度,从第二行第12个字符后开始显示 /*1602部份*/void delay(unsigned char z) /1602de延时函数 unsigned c
6、har x,y; for(x=z;x0;x-) for(y=110;yy-);void LCD_WRITE_COM(unsigned char com)/1602四线控制,将数据高四位和低四位分两次写入 LCD_RS=0; LCD_E=1; delay(1); P1=(P1&0x0f)|(com&0xf0);/将com的高四位送到P1的高四位,并保持P1的低四位不变 delay(2); LCD_E=0; delay(5); com=4;/将com的原低四位移到高四位,准备送到P1的高四位void LCD_WRITE_DATA(unsigned char date) LCD_RS=1;0x0f)
7、|(date& datevoid LCD_WRITE_SFM(unsigned char addr,unsigned char date) unsigned char shi,ge; shi=date/10; ge=date%10; LCD_WRITE_COM(0x80+0x40+addr); LCD_WRITE_DATA(0x30+shi); LCD_WRITE_DATA(0x30+ge); void LCD_WRITE_NYR(unsigned char addr,unsigned char date) char shi,ge; LCD_WRITE_COM(0x80+addr);void
8、LCD_WRITE_WEEK(unsigned char week) LCD_WRITE_COM(0x80+12); switch(week) case 1: LCD_WRITE_DATA(M);delay(5);O LCD_WRITE_DATA(N1break; case 2:TUE2 case 3:WD3 case 4:H4 case 5:FRI5 case 6:SA6 case 7:7void LCD_INITIAL() unsigned char i; LCD_WRITE_COM(0x28);/0x28=0010 1000,将液晶设置为16*2显示,5*7点阵,4位数据口 /显示方式设
9、置 LCD_WRITE_COM(0x0c); /设置开显示,不显光标 LCD_WRITE_COM(0x06); /默认(0x06)写入新数据后光标右移 屏幕不移动 LCD_WRITE_COM(0x01); /显示清0,数据指针清0 LCD_WRITE_COM(0x80); for(i=0;ii-) SCLK=0; ACC=addr; DIO=ACC0; addr=1; SCLK=1; ACC=date; dateunsigned char READ_1302(unsigned char addr) unsigned char i,date1,date2; ACC7=DIO; ACC date1
10、=ACC; date2=date1/16; date1=date1%16; date1=date1+date2*10; return(date1) ;void INITIAL_1302() WRITE_1302(WRITE_SECOND,READ_1302(READ_SECOND)&0x7f); /启动DS1302/*键盘扫描部分*/void keyscan() if(key0=0)/确认功能键按下 delay(20); if(key0=0)/去抖 beep=0; delay(200); while(!key0);/释放 num+; switch(num) flag=1; /修改时间,禁止从D
11、S1302读数据 TR0=0; /定时器关 LCD_WRITE_COM(0x0f); /光标开始闪烁 LCD_WRITE_COM(0x80+3);/第一次按下,光标定位到年位置 break; case 2: LCD_WRITE_COM(0x80+6);/第二次按下,光标定位到月位置 break; case 3: LCD_WRITE_COM(0x80+9);/第三次按下,光标定位到日位置 case 4:/第四次按下,光标定位到星期位置 case 5: LCD_WRITE_COM(0x80+0x40+2);/第五次按下,光标定位到时位置 case 6: LCD_WRITE_COM(0x80+0x4
12、0+5);/第六次按下,光标定位到分位置 case 7: LCD_WRITE_COM(0x80+0x40+8);/第七次按下,光标定位到秒位置 break; case 8: num=0;/第八次按下,记录清零 LCD_WRITE_COM(0x0c);/不显示光标 WRITE_1302(WRITE_PROTECT,0x00); /允许写操作 WRITE_1302(0x80,(second/10*16)+second%10);/将调节后的秒写入DS1302 WRITE_1302(0x82,(minute/10*16)+minute%10);/将调节后的分写入DS1302 WRITE_1302(0x
13、84,(hour/10*16)+hour%10);/将调节后的时写入DS1302 WRITE_1302(0x8a,(week/10*16)+week%10);/将调节后的星期写入DS1302 WRITE_1302(0x86,(day/10*16)+day%10);/将调节后的日写入DS1302 WRITE_1302(0x88,(month/10*16)+month%10);/将调节后的月写入DS1302 WRITE_1302(0x8c,(year/10*16)+year%10);/将调节后的年写入DS1302 WRITE_1302(WRITE_PROTECT,0x80); /开写保护 flag
14、=0; /时间修改完毕,允许液晶从DS1302读数据 TR0=1; if(num!=0) if(key1=0)/确认增大键按下 if(key1=0)/增大键确实按下 beep=0; while(!key1); switch(num) case 1: year+;/调节年 if(year=100)year=0; LCD_WRITE_NYR(3,year);/将调节后的年送入液晶显示 LCD_WRITE_COM(0x80+3);/光标回到指定处 break; case 2: month+;/调节月 if(month=13)month=0; LCD_WRITE_NYR(6,month);/将调节后的
15、月送入液晶显示 LCD_WRITE_COM(0x80+6); case 3: day+;/调节日 if(day=32)day=0; LCD_WRITE_NYR(9,day);/将调节后的日送入液晶显示 LCD_WRITE_COM(0x80+9); case 4: week+; if(week=8)week=0; LCD_WRITE_WEEK(week);/将调节后的星期送入液晶显示 LCD_WRITE_COM(0x80+12); case 5: hour+; if(hour=24)hour=0; LCD_WRITE_SFM(2,hour);/将调节后的小时送入液晶显示 LCD_WRITE_CO
16、M(0x80+0x40+2); case 6: minute+; if(minute=60)minute=0; LCD_WRITE_SFM(5,minute);/将调节后的分送入液晶显示 LCD_WRITE_COM(0x80+0x40+5); case 7: second+; if(second=60)second=0; LCD_WRITE_SFM(8,second);/将调节后的秒送入液晶显示 LCD_WRITE_COM(0x80+0x40+8); default: if(key2=0)/确认减小键按下 if(key2=0)/减小键确实按下key2); year-; if(year=-1)y
17、ear=99; LCD_WRITE_NYR(3,year); LCD_WRITE_COM(0x80+3); month-; if(month=-1)month=12; LCD_WRITE_NYR(6,month); LCD_WRITE_COM(0x80+6); day-; if(day=-1)day=31; LCD_WRITE_NYR(9,day); LCD_WRITE_COM(0x80+9); week-;/调节星期 if(week=0)week=7; LCD_WRITE_WEEK(week); LCD_WRITE_COM(0x80+12); hour-;/调节时 if(hour=-1)hour=23; LCD_WRITE_SFM(2,hour); LCD_WRITE_COM(0x80+0x40+2); minute-;/调节分 if(minute=-1)minute=59; LCD_WRITE_SFM(5,minute); LCD_WRITE_COM(0x80+0x40+5); second-;/调节秒 if(second=-1)second=59; LCD_WRITE_SFM(8,second); LCD_WRITE_COM(0x80+0x40+8); default: /*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1