本帖最后由 liyz 于 2017-4-10 09:01 编辑
我是从95年左右开始玩单片机,还买片TD-II单板机(纯机器代码输入的)那时我还没有电脑,我只学会用汇编,现在已经好多年没玩了,最近突然又想玩玩单片机做个闹钟,汇编语言已经忘得差不多了,那就学学用C语言吧,在网上找到几份学习资料逐渐明白了C语言奥秘。这是参考别人的资料花了好几个星期一步一步增加功能修改出来的,已经做了成品给小孩当闹钟用,增加了语音报时(用yf017语音芯片),存储记忆(24C02),两组闹钟(一组可设置每周工作日响闹,另一组可设置每天响闹或只响一次,还有再响等功能),电路图就懒得画了,纯属业余玩玩给大家参考。
附上不错的C51学习资料:
《51单片机C语言快速上手》.pdf
(4.6 MB, 下载次数: 100)
十天学会单片机实例100.docx
(198.15 KB, 下载次数: 57)
单片机源程序:
- /*******************************************************************************
- *标题: DS1302+DS18B20+LCD1602电子时钟 *
- * *
- ********************************************************************************
- * 添加闹钟时间记忆,闹铃时长,闹钟再响次数,间隔,周闹钟功能,语音整点报时 *
- *
- *
- ********************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #include "24c02.h"
- #include "LCD1602.h"
- #include "DS1302.h"
- #include "DS18B20.h"
- #include "yuyin.h"
- sbit key1=P2^3; //调时钟和闹钟键
- sbit key2=P2^2; //调时加键,正常走时状态语音报时键
- sbit key3=P2^1; //调时减键,闹钟开关
- sbit key4=P2^0; //查看闹铃键
- sbit beep = P2^4; //蜂鸣器控制IO口
- sbit led1 = P1^0; //LED灯,闹铃响标志
- /******************************************************************/
- /* 函数声明 */
- /******************************************************************/
- void Read_RTC(void);
- void temp_to_str();
- void keyscan();
- bit ReadRTC_Flag,Display_Flag,Alarm_Flag,Alarm_Flag1,Aset_Flag,yuyin_flag,zd_baoshi,each,setzx=0; //定义标志位
- uchar miao,fen,shi,ri,yue,week,nian,T,nz_flag,yuyin_shi,yuyin_ge,m=0,n=0,w=0,m1=0;
- uchar set_miao,set_fen,set_shi,set_time,setzx_time,setzx_f,nz_miao,nz_fen,nz_shi,miao_ss;
- char l_tmpdate[7]; //秒分时日月周年
- uchar TempBuffer[5],nz_week[7];
- uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位写位
- uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //秒分时日月周年 最低位读位
- uchar code nz_week_address[7]={0x10,0x11,0x12,0x13,0x14,0x15,0x16};
-
- uchar code table1[]="SUN"; //星期字表
- uchar code table2[]="MON";
- uchar code table3[]="TUE";
- uchar code table4[]="WED";
- uchar code table5[]="THU";
- uchar code table6[]="FRI";
- uchar code table7[]="SAT";
- uchar code tab1[]=" 20 - - ";
- uchar code tab2[]=" : : ";
- uchar code tab3[14]="Set Alarm! ";
- uchar code tab4[16]="w:S M T W T F S ";
- uchar code tab5[]=" *ON *OFF";
- /******************************************************************/
- /* 毫秒级延时函数 */
- /******************************************************************/
- void delay(uchar a)
- {
- uchar i;
- while(a--)
- {
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- void delay1(uchar a)
- {
- uchar i;
- while(a--)
- {
- for(i=0;i<5;i++)
- {}
- }
- }
- /********************************************/
- /* 取出EEPROM时钟参数初始化函数 */
- /*******************************************/
- void Set_read()
- {
- uchar i,*p;
- p=nz_week_address; //地址传递
- for(i=0;i<7;i++) //分7次读取
- {
- nz_week[i]=Read24c02(*p);
- p++;
- }
- set_miao=Read24c02(0x03);
- set_fen=Read24c02(0x02);
- set_shi=Read24c02(0x01);
- set_time=Read24c02(0x05);
- nz_flag=Read24c02(0x06);
- setzx_time=Read24c02(0x07);
- setzx_f=Read24c02(0x08);
- zd_baoshi=Read24c02(0x09);
- yuyin_flag=Read24c02(0x0a);
- nz_miao=Read24c02(0x1a);
- nz_fen=Read24c02(0x1b);
- nz_shi=Read24c02(0x1c);
- each=Read24c02(0x1d);
- }
- /**************************************************
- 初始化函数
- ***************************************************/
- void init()
- {
- uchar i;
- Alarm_Flag=0;
- miao_ss=0;
- led1=1;
- TMOD=0x01; //设置定时器0为工作方式1(0000 0001)
- TH0=(65536-50000)/256; //装初值50ms一次中断
- TL0=(65536-50000)%256; //
- IE=0x82; //开总中断,开定时器0中断
- TR0=0;
- write_lcd1602(0x80,0);
- for(i=0;i<10;i++)
- {
- write_lcd1602(tab1[i],1);
- }
- write_lcd1602(0x80+0x40+1,0);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- }
- /******************************************************************/
- /* 温度数据转换 */
- /******************************************************************/
- void temp_to_str() //温度数据转换成液晶字符显示
- {
- /*TempBuffer[0]=temp_value/100%10+0x30; //十位
- TempBuffer[1]=temp_value/10%10+0x30; //个位
- TempBuffer[2]='.';
- TempBuffer[3]=temp_value%10+0x30;
- TempBuffer[4]=0xdf; //温度符号
- */
- TempBuffer[0]=temp_value/100+0x30; //十位
- TempBuffer[1]=temp_value%100/10+0x30; //个位
- TempBuffer[2]='.';
- TempBuffer[3]=temp_value%10+0x30;
- TempBuffer[4]=0xdf; //温度符号
- }
- /******************************************************************/
- /* 显示星期 */
- /******************************************************************/
- void write_week(uchar xq)
- {
- uchar x;
- write_lcd1602(0x80+12,0);
- switch(xq)
- {
- case 1:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table1[x],1);
- }
- break;
- case 2:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table2[x],1);
- }
- break;
- case 3:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table3[x],1);
- }
- break;
- case 4:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table4[x],1);
- }
- break;
- case 5:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table5[x],1);
- }
- break;
- case 6:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table6[x],1);
- }
- break;
- case 7:
- for(x=0;x<3;x++)
- {
- write_lcd1602(table7[x],1);
- }
- break;
- }
- write_lcd1602(0x80+12,0);
- }
- /*****************************************************/
- /* 显示闹钟1开关标志函数 */
- /*****************************************************/
- void a_lcd()
- {
- if(nz_flag==1)
- {
- write_lcd1602(0x80+0x40,0);
- write_lcd1602('A',1);
- }
- else
- {
- write_lcd1602(0x80+0x40,0);
- write_lcd1602(' ',1);
- }
- }
- /*****************************************************/
- /* 显示ON和OFF函数 */
- /*****************************************************/
- void on_off_lcd(uchar f)
- {
- uchar i;
- write_lcd1602(0x80+0x40+10,0);
- if(f==1)
- {
- for(i=0;i<6;i++)
- {write_lcd1602(tab5[i],1); }
- write_lcd1602(0x80+0x40+13,0);
- }
- else
- {
- for(i=5;i<11;i++)
- { write_lcd1602(tab5[i],1); }
- write_lcd1602(0x80+0x40+13,0);
- }
- }
- /******************************************************************/
- /* 显示函数 */
- /******************************************************************/
- void display()
- {
- uchar i,ww;
- Read_RTC();
- write_sfm(8,miao);
- write_sfm(5,fen);
- write_sfm(2,shi);
- write_nyr(3,nian);
- write_nyr(6,yue);
- write_nyr(9,ri);
- write_week(week);
- write_lcd1602(0x80+15,0);
- if(setzx==1)
- {write_lcd1602(0xf3,1);}
- else
- {
- ww=nz_week[week-1];
- if(ww==1)
- {write_lcd1602(0xeb,1);}
- else
- {write_lcd1602(' ',1);}
- }
- a_lcd();
- ReadTemp();
- temp_to_str();
- write_lcd1602(0x80+0x40+11,0);
- for(i=0;i<5;i++)
- {
- write_lcd1602(TempBuffer[i],1);
- }
- }
- /******************************************************************/
- /* 读时钟数据 */
- /******************************************************************/
- void Read_RTC(void) //读取 日历
- {
- uchar i,*p;
- p=read_rtc_address; //地址传递
- for(i=0;i<7;i++) //分7次读取 秒分时日月周年
- {
- l_tmpdate[i]=Read_Ds1302(*p);
- p++;
-
- miao=((l_tmpdate[0]&0x70)>>4)*10 + (l_tmpdate[0]&0x0f);
- fen =((l_tmpdate[1]&0x70)>>4)*10 + (l_tmpdate[1]&0x0f);
- shi =((l_tmpdate[2]&0x70)>>4)*10 + (l_tmpdate[2]&0x0f);
- ri =((l_tmpdate[3]&0x70)>>4)*10 + (l_tmpdate[3]&0x0f);
- yue =((l_tmpdate[4]&0x70)>>4)*10 + (l_tmpdate[4]&0x0f);
- week=((l_tmpdate[5]&0x70)>>4)*10 + (l_tmpdate[5]&0x0f);
- nian=((l_tmpdate[6]&0x70)>>4)*10 + (l_tmpdate[6]&0x0f);
- }
- }
- /******************************************************************/
- /* 蜂鸣器发声函数 */
- /******************************************************************/
- void di()
- {
- uchar i;
- while(key1==0||key2==0||key3==0||key4==0)
- {
- for(i=0;i<50;i++)
- {
- delay1(4);
- beep=~beep;
- }
- }
- }
- /******************/
- void Abeep()
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- delay(50);
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- delay(50);
- for(i=0;i<250;i++)
- {
- delay1(4);
- beep=~beep;
- led1=~led1;
- }
- }
- /*********************返回正常计时状态程序******************************/
- void R_normal()
- {
- uchar i;
- TR0=0;
- miao_ss=0;
- ReadRTC_Flag=0;
- Display_Flag=0;
- Aset_Flag=0;
- n=0;
- write_lcd1602(0x0c,0);
- if(m!=0||m1!=0||w!=0)
- {
- m=0;
- m1=0;
- w=0;
- write_lcd1602(0x80,0); //清掉Set Alarm
- for(i=0;i<12;i++)
- {
- write_lcd1602(tab1[i],1);
- }
- write_lcd1602(0x80+0x40+1,0);
- for(i=0;i<10;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- }
-
- display();
-
- }
- /******************************************************************/
- /* 闹钟函数 */
- /******************************************************************/
- void alarm()
- {
- uchar tmp,temp;
- if((nz_week[week-1]==1)&&(shi==set_shi)&&(fen==set_fen)&&(miao==set_miao))
- {
- //Read_RTC();
- R_normal();
- tmp=set_time+fen; //计算响铃分钟数
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag=1; //闹铃响标志位
- setzx=1;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- while(Alarm_Flag)
- {
- Abeep();
- delay(500);
- Read_RTC(); //边响边走时
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag=0;
- setzx_f--; //响铃次数减一次
- if(setzx_f!=0)
- {
- temp=setzx_time+fen;
- if(temp>=60)
- {
- temp=temp%60;
- set_shi++;
- if(set_shi>23)
- {set_shi=0;}
- }
- set_fen=temp;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- }
- else
- {
- setzx=0;
- led1=1;
- set_fen=Read24c02(0x02);
- set_shi=Read24c02(0x01);
- setzx_f=Read24c02(0x08);
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- }
- }
- }
- }
- }
- /******************************************************************/
- /* 闹钟1函数 */
- /******************************************************************/
- void alarm1()
- {
- uchar tmp,temp;
- if((nz_flag==1)&&(shi==nz_shi)&&(fen==nz_fen)&&(miao==nz_miao))
- {
- //Read_RTC();
- R_normal();
- tmp=set_time+fen; //计算响铃分钟数
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag1=1; //闹铃响标志位
- setzx=1;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- while(Alarm_Flag1)
- {
- Abeep();
- delay(500);
- Read_RTC(); //边响边走时
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag1=0;
- setzx_f--; //响铃次数减一次
- if(setzx_f!=0)
- {
- temp=setzx_time+fen;
- if(temp>=60)
- {
- temp=temp%60;
- nz_shi++;
- if(nz_shi>23)
- {nz_shi=0;}
- }
- nz_fen=temp;
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- }
- else
- {
- setzx=0;
- led1=1;
- nz_fen=Read24c02(0x1b);
- nz_shi=Read24c02(0x1c);
- setzx_f=Read24c02(0x08);
- if(each==0)
- nz_flag=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报当前时间
- }
- }
- }
- /* tmp=fen+5; //响铃x分钟
- if(tmp>=60)
- {tmp=tmp%60;}
- Alarm_Flag1=1; //闹铃响标志位
- led1=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报闹钟时间
- while(Alarm_Flag1)
- {
- Abeep();
- delay(500);
- Read_RTC(); //边响边走时
- display();
- keyscan();
- if(tmp==fen)
- {
- Alarm_Flag1=0;
- led1=1;
- if(each==0)
- nz_flag=0;
- if(yuyin_flag==1)
- baoshi(shi,fen,week,0); //语音报闹钟时间
- }
- } */
- }
- }
- /******************************************************************/
- /* 键盘扫描函数 */
- /******************************************************************/
- void keyscan()
- {
- uchar i,temp;
- if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
- {
- if(key1==0) //调时功能键
- {
- delay(9);
- if(key1==0)
- {
- di();
- while(!key1); //松手检测
- miao_ss=0;
- if(Display_Flag==0&&m==0&&w==0&&m1==0)
- {
- ++n;
- Aset_Flag=1; //屏蔽调闹铃功能键,进入调时功能
- ReadRTC_Flag=1; //停止走时
- switch(n)
- {
- case 1: on_off_lcd(zd_baoshi); //按一次功能键闪烁
- write_lcd1602(0x0f,0);
- break;
- case 2: write_lcd1602(0x80+0x40+9,0); //按两次功能键秒闪烁
- //Write_Ds1302(0x8e,0x00); //允许写,禁止写保护
- //Write_Ds1302(0x80,((miao/10)*16+miao%10)); //写入DS1302秒位
- //Write_Ds1302(0x8e,0x80); //打开写保护
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //按三次功能键分闪烁
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //按四次功能键时闪烁
- break;
- case 5: write_lcd1602(0x80+10,0); //按五次功能键日闪烁
- break;
- case 6: write_lcd1602(0x80+7,0); //按六次功能键月闪烁
- break;
- case 7:write_lcd1602(0x80+4,0); //按七次功能键年闪烁
- break;
- case 8: write_lcd1602(0x80+12,0); //按八次功能键周闪烁
- break;
- case 9: TR0=0; //按九次功能键开始走时,停止闪烁
- n=0;
- ReadRTC_Flag=0;
- Aset_Flag=0;
- write_lcd1602(0x0c,0);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,((miao/10)*16+miao%10));
- Write_Ds1302(0x82,((fen/10)*16+fen%10));
- Write_Ds1302(0x84,((shi/10)*16+shi%10));
- Write_Ds1302(0x8e,0x80);
- break;
- }
- }
- else
- {
- if(n==0&&w==0&&m1==0&&m>0)
- {
- m++;
- Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
- Alarm_Flag1=0;
- switch(m)
- { case 2: write_lcd1602(0x80+0x40+9,0); //开始设定闹铃,秒位闪烁可调
- write_lcd1602(0x0f,0);
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //分位闪烁可调
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //时位闪烁可调
- break;
- case 5: write_lcd1602(0x80+0x40+14,0); //
- break;
- case 6: write_lcd1602(0x80+15,0); //
- break;
- case 7: write_lcd1602(0x80+12,0); //
- break;
- case 8: write_lcd1602(0x80+0x40+11,0); //
- break;
- case 9:R_normal();
- // display(); //返回时间显示
- break;
- }
- }
- else
- if(n==0&&m==0&&m1==0&&w>0)
- {
- w++;
- Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
- Alarm_Flag1=0;
- switch(w)
- { case 2: write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(0x0f,0); //开始闪烁
- break;
- case 3: write_lcd1602(0x80+0x40+4,0);
- break;
- case 4: write_lcd1602(0x80+0x40+6,0);
- break;
- case 5: write_lcd1602(0x80+0x40+8,0); //
- break;
- case 6: write_lcd1602(0x80+0x40+10,0); //
- break;
- case 7: write_lcd1602(0x80+0x40+12,0); //
- break;
- case 8: write_lcd1602(0x80+0x40+14,0); //
- break;
- case 9: R_normal();
- break;
- }
- }
- else
- {
- if(n==0&&m==0&&w==0&&m1>0)
- {
- m1++;
- Alarm_Flag=0; //初始化闹铃标志位,闹铃不响
- Alarm_Flag1=0;
- switch(m1)
- { case 2: write_lcd1602(0x80+0x40+9,0); //开始设定闹铃,秒位闪烁可调
- write_lcd1602(0x0f,0);
- break;
- case 3: write_lcd1602(0x80+0x40+6,0); //分位闪烁可调
- break;
- case 4: write_lcd1602(0x80+0x40+3,0); //时位闪烁可调
- break;
- case 5: on_off_lcd(each); //
- break;
- case 6:
- nz_flag=1; //开启闹钟检测
- R_normal();
- break;
- }
- }
- }
- }
- }
- }
- }
- if(Alarm_Flag==0&&Alarm_Flag1==0&&setzx==0)
- { if(key4==0) //闹铃功能键
- {
- delay(9);
- if(key4==0)
- {
- di();
- while(!key4);
- if(Aset_Flag==0) //不是调时钟状态就可以进入调闹钟
- {
- miao_ss=0;
- if(m1==0)
- {
- if(w==0)
- {
- m++;
- if(m>1)
- {m=9;}
- Display_Flag=1; //屏蔽调时功能键,进入调闹铃功能
- switch(m)
- {
- case 1: n=0;
- ReadRTC_Flag=0; //开显示
- write_lcd1602(0x0c,0); //停止闪烁
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x80,((miao/10)*16+miao%10));
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80,0); //首行写入Set Alarm!
- write_lcd1602('w',1);
- write_lcd1602(':',1);
- // write_lcd1602(' ',1);
- for(i=3;i<12;i++)
- {
- write_lcd1602(tab3[i],1);
- }
- write_lcd1602(setzx_f/10+'0',1);
- write_lcd1602(setzx_f%10+'0',1);
- write_lcd1602(0xde,1);
- write_lcd1602(setzx_time/10+'0',1);
- write_lcd1602(setzx_time%10+'0',1);
- write_lcd1602(0x80+0x40,0); //第二行写入设定的时间
- write_lcd1602('*',1);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(set_miao/10+'0',1);
- write_lcd1602(set_miao%10+'0',1);
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(set_fen/10+'0',1);
- write_lcd1602(set_fen%10+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(set_shi/10+'0',1);
- write_lcd1602(set_shi%10+'0',1);
- write_lcd1602(0x80+0x40+11,0);
- if(yuyin_flag==1)
- {write_lcd1602('V',1);}
- else
- {write_lcd1602('_',1);}
- write_lcd1602(' ',1);
- write_lcd1602(set_time/10+'0',1);
- write_lcd1602(set_time%10+'0',1);
- write_lcd1602('m',1);
- break;
- case 9:
- m=0; //关闭更更改闹铃时间
- w=1; //
- write_lcd1602(0x0c,0); //停止闪烁
- write_lcd1602(0x80,0); //首行写入星期表
- for(i=0;i<16;i++)
- {
- write_lcd1602(tab4[i],1);
- }
- write_lcd1602(0x80+0x40,0);
- write_lcd1602('*',1);
- write_lcd1602(':',1);
- write_lcd1602(nz_week[0]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[1]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[2]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[3]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[4]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[5]+'0',1);
- write_lcd1602(' ',1);
- write_lcd1602(nz_week[6]+'0',1);
- write_lcd1602(' ',1);
- break;
- }
- }
- else
- {
- w=0;
- m1=1;
- write_lcd1602(0x0c,0); //停止闪烁
- write_lcd1602(0x80,0); //首行写入Set Alarm!
- for(i=0;i<11;i++)
- {
- write_lcd1602(tab3[i],1);
- }
- write_lcd1602('E',1);
- write_lcd1602('.',1);
- write_lcd1602('d',1);
- write_lcd1602('a',1);
- write_lcd1602('y',1);
- write_lcd1602(0x80+0x40,0); //第二行写入设定的时间
- write_lcd1602(' ',1);
- for(i=0;i<7;i++)
- {
- write_lcd1602(tab2[i],1);
- }
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(nz_miao/10+'0',1);
- write_lcd1602(nz_miao%10+'0',1);
- on_off_lcd(each);
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(nz_fen/10+'0',1);
- write_lcd1602(nz_fen%10+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(nz_shi/10+'0',1);
- write_lcd1602(nz_shi%10+'0',1);
- a_lcd();
- }
- }
- else
- {
- R_normal();
- // display(); //返回时间显示*/
-
- }
- }
- else
-
- R_normal();
-
- }
- }
- }
- if(n!=0||m>1||m1>1||w>1) //功能加键
- {
- if(key2==0)
- {
- delay(9);
- if(key2==0)
- {
- di();
- while(!key2);
- miao_ss=0;
- if(Display_Flag==0)
- {
- switch(n)
- {
- case 1:zd_baoshi=~zd_baoshi;
- Write24c02(0x09,zd_baoshi);
- on_off_lcd(zd_baoshi);
- break;
- case 2: miao++;
- if(miao==60)
- miao=0;
- write_lcd1602(0x80+0x40+8,0); //使LCD1602在秒位上显示“加”设好的秒数
- write_lcd1602((miao/10)+'0',1); //十进制转换成LCD1602能显示的字符,显示出来
- write_lcd1602((miao%10)+'0',1);
- T=(miao/10)*16+(miao%10); //十进制转换成DS1302能写的BCD码
- Write_Ds1302(0x8e,0x00); //允许写,禁止写保护
- Write_Ds1302(0x80,T); //写入DS1302
- Write_Ds1302(0x8e,0x80); //打开写保护
- //Read_RTC();
- write_lcd1602(0x80+0x40+9,0); //写完数据后光标自动右移,所以要归位
- break;
- case 3: fen++;
- if(fen==60)
- fen=0;
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602((fen/10)+'0',1);
- write_lcd1602((fen%10)+'0',1);
- T=(fen/10)*16+(fen%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x82,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+0x40+6,0);
- break;
- case 4: shi++;
- if(shi==24)
- shi=0;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602((shi/10)+'0',1);
- write_lcd1602((shi%10)+'0',1);
- T=(shi/10)*16+(shi%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x84,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+0x40+3,0);
- break;
- case 5: ri++;
- if(ri==32)
- ri=1;
- write_lcd1602(0x80+9,0);
- write_lcd1602((ri/10)+'0',1);
- write_lcd1602((ri%10)+'0',1);
- T=(ri/10)*16+(ri%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x86,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+10,0);
- break;
- case 6: yue++;
- if(yue==13)
- yue=1;
- write_lcd1602(0x80+6,0);
- write_lcd1602((yue/10)+'0',1);
- write_lcd1602((yue%10)+'0',1);
- T=(yue/10)*16+(yue%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x88,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+7,0);
- break;
- case 7: nian++;
- if(nian==100)
- nian=0;
- write_lcd1602(0x80+3,0);
- write_lcd1602((nian/10)+'0',1);
- write_lcd1602((nian%10)+'0',1);
- T=(nian/10)*16+(nian%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x8c,T);
- Write_Ds1302(0x8e,0x80);
- write_lcd1602(0x80+4,0);
- break;
- case 8: week++;
- if(week==8)
- week=1;
- write_week(week);
- T=(week/10)*16+(week%10);
- Write_Ds1302(0x8e,0x00);
- Write_Ds1302(0x8a,T);
- Write_Ds1302(0x8e,0x80);
- break;
- }
- }
- else
- if(w==0&&m1==0&&m>1)
- {
- switch(m)
- {
- case 2: set_miao++; //闹钟秒加1
- if(set_miao==60)
- set_miao=0;
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(set_miao/10+'0',1);
- write_lcd1602(set_miao%10+'0',1);
- write_lcd1602(0x80+0x40+9,0);
- Write24c02(0x03,set_miao);
- break;
- case 3: set_fen++; //闹钟分加1
- if(set_fen==60)
- set_fen=0;
- write_lcd1602(0x80+0x40+5,0);
- write_lcd1602(set_fen/10+'0',1);
- write_lcd1602(set_fen%10+'0',1);
- write_lcd1602(0x80+0x40+6,0);
- Write24c02(0x02,set_fen);
- break;
- case 4: set_shi++; //闹钟时加1
- if(set_shi==24)
- set_shi=0;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(set_shi/10+'0',1);
- write_lcd1602(set_shi%10+'0',1);
- write_lcd1602(0x80+0x40+3,0);
- Write24c02(0x01,set_shi);
- break;
- case 5: set_time++; //闹钟响铃时长
- if(set_time==31)
- set_time=1;
- write_lcd1602(0x80+0x40+13,0);
- write_lcd1602(set_time/10+'0',1);
- write_lcd1602(set_time%10+'0',1);
- write_lcd1602(0x80+0x40+14,0);
- Write24c02(0x05,set_time);
- break;
- case 6: setzx_time++; //闹钟再响间隔
- if(setzx_time==31)
- setzx_time=1;
- write_lcd1602(0x80+14,0);
- write_lcd1602(setzx_time/10+'0',1);
- write_lcd1602(setzx_time%10+'0',1);
- write_lcd1602(0x80+15,0);
- Write24c02(0x07,setzx_time);
- break;
- case 7: setzx_f++; //闹钟响铃次数
- if(setzx_f==11)
- setzx_f=1;
- write_lcd1602(0x80+11,0);
- write_lcd1602(setzx_f/10+'0',1);
- write_lcd1602(setzx_f%10+'0',1);
- write_lcd1602(0x80+12,0);
- Write24c02(0x08,setzx_f);
- break;
- case 8: yuyin_flag=~yuyin_flag;
- write_lcd1602(0x80+0x40+11,0);
- if(yuyin_flag==1)
- {write_lcd1602('V',1);}
- else
- {write_lcd1602('_',1);}
- write_lcd1602(0x80+0x40+11,0);
- Write24c02(0x0a,yuyin_flag);
- break;
- }
- }
- else
- if(m==0&&m1==0&&w>1)
- {
- switch(w)
- {
- case 2: //星期日闹钟开关,1为开
- nz_week[0]=1;
- write_lcd1602(0x80+0x40+2,0);
- write_lcd1602(nz_week[0]+'0',1);
- write_lcd1602(0x80+0x40+2,0);
- Write24c02(0x10,nz_week[0]);
- break;
- case 3: //星期一闹钟开关
- nz_week[1]=1;
- write_lcd1602(0x80+0x40+4,0);
- write_lcd1602(nz_week[1]+'0',1);
- write_lcd1602(0x80+0x40+4,0);
- Write24c02(0x11,nz_week[1]);
- break;
- case 4: //星期二闹钟开关
- nz_week[2]=1;
- write_lcd1602(0x80+0x40+6,0);
- write_lcd1602(nz_week[2]+'0',1);
- write_lcd1602(0x80+0x40+6,0);
- Write24c02(0x12,nz_week[2]);
- break;
- case 5: //星期三闹钟开关
- nz_week[3]=1;
- write_lcd1602(0x80+0x40+8,0);
- write_lcd1602(nz_week[3]+'0',1);
- write_lcd1602(0x80+0x40+8,0);
- Write24c02(0x13,nz_week[3]);
- break;
- case 6: //星期四闹钟开关
- nz_week[4]=1;
- write_lcd1602(0x80+0x40+10,0);
- write_lcd1602(nz_week[4]+'0',1);
- write_lcd1602(0x80+0x40+10,0);
- Write24c02(0x14,nz_week[4]);
- break;
- case 7: //星期五闹钟开关
- nz_week[5]=1;
- write_lcd1602(0x80+0x40+12,0);
- write_lcd1602(nz_week[5]+'0',1);
- write_lcd1602(0x80+0x40+12,0);
- Write24c02(0x15,nz_week[5]);
- break;
- case 8: //星期六闹钟开关
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
程序:
电子时钟最终双闹版.rar
(20.54 KB, 下载次数: 166)
|