| 以下是我当年设计的希望能给你一些启发                                                                                                                                                        <<        电子闹钟程序 > > //                                                                                                                                                          程序作者:08级电气智能自动控制技术专业----赵永建    CYJMCU@HOTMAIL.COM
 #include <reg52.h>
 #define uint unsigned int
 #define uchar unsigned char
 uchar code tablehige[]="   2010-01-01";
 uchar code tabledown[]="    00:00:00";
 sbit        rs=P3^7;
 sbit        en=P3^6;
 void delay(uint);
 void keyscan();
 void init();
 void com(uchar);
 void date(uchar date);
 void autowritetime(uchar add,uchar time);
 void autowritedate(uchar add,uchar date1);
 char num,sec,min,hour,day,month,year;
 uint count,key1num;
 sbit        key1=P0^7;
 sbit        key2=P0^6;
 sbit        key3=P0^5;
 sbit        keyrs=P0^4;
 
 //======================================================================================================================
 void main()         //主程序
 {
 init();
 while(1)
 {
 keyscan();
 }
 }
 //===========================================================================================================================
 void delay(uint x)                        //延时程序
 {
 uint i,j;
 for(i=x;i>0;i--)
 for(j=110;j>0;j--);
 }
 //-===================================================
 void init()            //上电初始化
 {
 en=0;
 com(0x38);//设置16*2显示,5*7点阵,8位数据接口
 com(0x0e);//设置  开显示 、显示光标
 com(0x06);//设置  当读或写一个字符后地址指针加1,且光标加一 ;
 //当写一个字符时,整屏显示左移(N=1)或右移(N=0),得到光标不动而屏幕移动的效果
 com(0x01);//显示清0,数据指针清0
 //--------------
 com(0x80);//将数据指针定位到第一行第一个字处
 for(num=0;num<13;num++)                                                                //  上半部分显示为        日期    年:月:日
 {
 date(tablehige[num]);
 delay(50);
 }
 //-------------------------------
 com(0x80+0x40);
 for(num=0;num<12;num++)
 {
 date(tabledown[num]);                                                                //显示下半部分为        具体时间        时:分:秒
 delay(50);
 }
 TMOD=0x01;
 TL0=(65536-50000)/256;   //定时器中断
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;
 }
 //=============================================================
 void com(uchar com)        //控制初始化子程序
 {
 rs=0;
 P2=com;
 delay(5);
 en=1;
 delay(5);
 en=0;
 }
 //========================================================
 void date(uchar date)        //数据初始化子程序
 {
 rs=1;
 P2=date;
 delay(5);
 en=1;
 delay(5);
 en=0;
 }
 
 
 //===============================================================
 void time() interrupt 1
 {
 TH0=(65536-50000)/256;                                         //中断子程序
 TL0=(65536-50000)/256;
 count++;
 if(count==18)//*****************************  time min
 {
 sec++; //秒
 count=0;
 
 //----------------------------
 if(sec==60)
 {
 sec=0;
 min++;  //分
 
 //-----------------------
 if(min==60)
 {
 min=0;
 hour++; //时
 
 if(hour==24)
 {
 hour=0;
 day++;  //日
 if(day==31)
 {
 day=0;
 month++;     //月
 if(month==12)
 {
 month=0;
 year++;              //年
 autowritedate(5,year);   // year auto write**
 }
 autowritedate(8,month); //  month auto write **
 }
 autowritedate(11,day);         // day auto write **
 }
 autowritetime(4,hour);   //  hour auto write
 }
 autowritetime(7,min);      //   min auto write
 }
 autowritetime(10,sec);         // sec auto write
 
 }
 }
 //=======================================================
 void autowritetime(uchar add,uchar time)
 {
 uchar shi,ge;                                                                        //下行时间        数据,地址自动写入程序
 shi=time/10;
 ge=time%10;
 com(0x80+0x40+add);
 date(0x30+shi);
 date(0x30+ge);
 }
 //==================================================================
 //          上行   月,日 数据地址自动写入程序           //
 void autowritedate(uchar add,uchar date1)
 {
 uchar yue,ri;
 yue=date1/10;
 ri=date1%10;
 com(0x80+add);
 date(0x30+yue);
 date(0x30+ri);
 
 }
 //======================================================
 /*按键扫描程序段*/
 void keyscan()
 {
 keyrs=0;
 if(key1==0)
 {
 delay(5);
 if(key1==0)     //KEY1选定需要调节的时间
 {
 key1num++;
 while(!key1);
 TR0=0;
 com(0x80+0x40+11); //当前光标闪烁位置为 秒 调节
 com(0x0f);         //主要是使光标闪烁
 }
 //-----------------------------------------------
 if(key1num==2)
 {
 com(0x80+0x40+8);        //当前光标闪烁位置为 分
 }
 //-----------------------------------------
 if(key1num==3)
 {
 com(0x80+0x40+5);        //当前光标闪烁位置为  时
 }
 //---------------------------------------------------
 if(key1num==4)
 {
 com(0x80+12);   //当前光标闪烁位置为  日
 }
 if(key1num==5)
 {
 com(0x80+9);      //当前光标闪烁位置为   月
 }
 if(key1num==6)
 {
 com(0x80+6);     //当前光标闪烁位置为  年
 }
 if(key1num==7)
 {
 key1num=0;
 com(0x0c);                        //光标停止闪烁
 TR0=1;      //定时器启动
 }
 }
 if(key1num!=0)
 {
 //数字递增按键 KEY2//
 if(key2==0)
 delay(5);
 if(key2==0)
 {
 while(!key2);
 if(key1num==1)
 {
 sec++;
 if(sec==60)
 sec=0;
 autowritetime(10,sec);     //秒  ++
 com(0x80+0x40+10);
 }
 if(key1num==2)
 {
 min++;
 if(min==60)
 min=0;
 autowritetime(7,min);        //分  ++
 com(0x80+0x40+7);
 }
 if(key1num==3)
 {
 hour++;
 if(hour==24)
 hour=0;
 autowritetime(4,hour);        //时   ++
 com(0x80+0x40+4);
 }
 if(key1num==4)
 {
 day++;
 if(day==31)
 day=1;
 autowritedate(11,day);     // 日  ++
 com(0x80+12);
 }
 if(key1num==5)
 {
 month++;
 if(month==13)
 month=1;
 autowritedate(8,month); //月  ++
 com(0x80+8);
 }
 if(key1num==6)
 {
 year++;
 if(year==99)
 year=00;
 autowritedate(5,year);     // 年 ++
 com(0x80+5);
 }
 }
 //---------------------------------------------
 //递减功能按键 KEY3//
 if(key3==0)
 delay(5);
 if(key3==0)
 {
 while(!key3);
 if(key1num==1)
 {
 sec--;
 if(sec==-1)
 sec=59;
 autowritetime(10,sec);
 com(0x80+0x40+10);
 }
 if(key1num==2)
 {
 min--;
 if(min==-1)
 min=59;
 autowritetime(7,min);    //分    - -
 com(0x80+0x40+7);
 }
 if(key1num==3)
 {
 hour--;
 if(hour==-1)               //时  - -
 hour=23;
 autowritetime(4,hour);
 com(0x80+0x40+4);
 }
 if(key1num==4)
 {
 day--;
 if(day==0)
 day=31;
 autowritedate(11,day);       // 日  - -
 com(0x80+11);
 }
 if(key1num==5)
 {
 month--;
 if(month==0)
 month=12;
 autowritedate(8,month); // 月  - -
 com(0x80+8);
 }
 if(key1num==6)
 {
 year--;
 if(year==00)
 year=99;
 autowritedate(5,year);     //年 - -
 com(0x80+5);
 }
 
 }
 
 }
 
 }
 //==========================================================================================================================
 
 
 
 //程序说明:核心CPU选为STC89C52,控制1602液晶屏显示时间及其一些功能!!!
 //           key1:功能键                                 key2:增加         key3:减少
 //
 //
 //
 //
 //
 //程序作者 :      08级电气自动化专业     赵永建
 //                                年:year                        月:month                日:day                时:hour                分:min                秒:sec
 CYJMCU@HOTMAIL.COM
 
 当年我设计的闹钟 利用1602液晶屏显示的闹钟
 |