求基于AT89C52,LCD1602的电子钟设计(一定要C语言的) 常见问题
#include #define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar code table[]="2000:01:01Week:W";//uchar code table1[]="T:00:00:00#00:00";sbit lcd_rs=P2^6;//定义LCD端口sbit lcd_rw=P3^6;sbit lcd_en=P2^5;sbit k1=P3^2;//菜单键光标位sbit k2=P3^3;//加键sbit k3=P3^4;//减键sbit k4=P3^5;//退出键//sbit werr=P3^2;sbit DUAN=P2^0;//数码管段sbit WEI=P2^1;//数码管位void yue31();//大月void yue30();//小月void yue29();//闰天void yue28();//平月//void timing();//void Timing();void week7();void wei_1(){WEI=1;P0=0;WEI=0;}void duan_1(){DUAN=1;P0=0;DUAN=0;}uchar count, k1num;//声明秒的变量char shi,fen,miao;//声明时分秒uint nian, yue,ri,week;//声明年月日星期uchar f,s,n;//定时器/void delay(uchar z)//延时函数{uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//lcd写指令{lcd_rs=0;lcd_rw=0;lcd_en=0;P0=com;delay(5);lcd_en=1;delay(5);lcd_en=0;}void write_data(uchar date)//lcd写数据{lcd_rs=1;lcd_rw=0;lcd_en=0;P0=date;delay(5);lcd_en=1;delay(5);lcd_en=0;}void write_week(uchar add,uchar date)//计算星期显示位{uchar ge;ge=date/1;write_com(0x80+0x00+add);write_data(0x30+ge);}void write_tim(uchar add,uchar date){uchar ge;ge=date/1;write_com(0x80+0x40+add);write_data(0x30+ge);}void write_fsm(uchar add,uchar date)//计算时分秒位{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_nyr(uchar add,uchar date)//计算月日位{uint shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x00+add);write_data(0x30+shi);write_data(0x30+ge);}void write_nian(uchar add,uchar date)//计算年位,年是百位{uint bai,shi,ge;bai=date/100%10;shi=date/10;ge=date%10;write_com(0x80+0x00+add);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);}void jiaxian()//设置键盘加显{if(k1num!=0){if(k2==0){delay(5);if(k2==0){while(!k2);if(k1num==1){miao++;if(miao==60)miao=0;write_fsm(8,miao);write_com(0x80+0x40+8);}if(k1num==2){fen++;if(fen==60)fen=0;write_fsm(5,fen);write_com(0x80+0x40+5);}if(k1num==3){shi++;if(shi==24)shi=0;write_fsm(2,shi);write_com(0x80+0x40+2);}if(k1num==4){ri++;if(ri==31)ri=1;write_nyr(8,ri);write_com(0x80+0x00+8);}if(k1num==5){yue++;if(yue==12)yue=1;write_nyr(5,yue);write_com(0x80+0x00+5);}if(k1num==6){nian++;if(nian==999)nian=0;write_nian(1,nian);write_com(0x80+0x00+1);}if(k1num==7){week++;if(week>7)week=1;write_week(15,week);write_com(0x80+0x00+15);}if(k1num==8){s++;if(s==24)s=0;write_fsm(11,s);write_com(0x80+0x40+11);}if(k1num==9){f++;if(f==59)f=0;write_fsm(14,f);write_com(0x80+0x40+14);}if(k1num==10){n++;if(n==3)n=1;write_tim(0,n);write_com(0x80+0x40+0);}}}}}void jianxian()//设置键盘减显{if(k1num!=0){if(k3==0)//K3设置delay(5);if(k3==0){while(!k3);if(k1num==1){miao--;if(miao==-1)miao=59;write_fsm(11,miao);write_com(0x80+0x40+11);}if(k1num==2){delay(5);fen--;if(fen==-1)fen=59;write_fsm(8,fen);write_com(0x80+0x40+8);}if(k1num==3){shi--;if(shi==-1)shi=23;write_fsm(5,shi);write_com(0x80+0x40+5);}}}}void keyk4()//K4是锁定{if(k4==0){delay(5);if(k4==0)TR0=1;{while(!k4);k1num=0;write_com(0x0c);}}}void keyk1()//菜单光标设置{if(k1==0){delay(5);if(k1==0){while(!k1);k1num++;TR0=0;if(k1num==1){write_com(0x80+0x40+8);write_com(0x0f); }if(k1num==2){write_com(0x80+0x40+5);}if(k1num==3){write_com(0x80+0x40+2);}if(k1num==4){write_com(0x80+0x00+8);}if(k1num==5){write_com(0x80+0x00+5);}if(k1num==6){write_com(0x80+0x00+1);}if(k1num==7){write_com(0x80+0x00+18);}if(k1num==8){write_com(0x80+0x40+11);}if(k1num==9){write_com(0x80+0x40+14);}if(k1num==10){write_com(0x80+0x40+0);}}}jiaxian();//jianxian();keyk4();}void init()//启动 LCD初始化数据{uchar num;lcd_rs=0;lcd_en=0;shi=0;fen=0;miao=0;nian=0000;week=0x27;yue=1;ri=1;s=06;f=10;n=1;write_com(0x38);//不监察忙信号write_com(0x0c);//显示开光标设置write_com(0x06);//显示光标移动设置write_com(0x01);//显示清屏write_com(0x80);//数据指针write_com(0x80+0x00);for(num=0;num<16;num++)//延时15ms{write_data(table[num]);//年月日的数据延时delay(5);}write_com(0x80+0x40);for(num=0;num<16;num++){write_data(table1[num]);//时的延时delay(5);}//时钟初始化设置TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(){if(count==18)//是秒是的时间{count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;week++;}if(week>7){week=1;}//计算星期日if(yue==2){if((nian%4==0&&nian%100!=0)|(nian%400==0))//计算闰年{yue29();}else {yue28();}}else if((yue==4)|(yue==6)|(yue==9)|(yue==11))//计算大小月{yue30();}else{yue31();}if(yue>12){yue=1;nian++;}{if(nian>999)nian=0;write_nian(1,nian);}{write_nyr(5,yue);}{write_nyr(8,ri);}write_fsm(2,shi);}write_fsm(5,fen);}write_fsm(8,miao);{write_week(15,week);}{write_fsm(11,s);}{write_fsm(14,f);}{write_tim(0,n);}}}void yue31()//大月变量{if(ri>31){ri=1;yue++;}}void yue30()//小月变量{if(ri>30){ri=1;yue++;}}void yue29()//闰天变量{if(ri>29){ri=1;yue++;}}void yue28()//平月变量{if(ri>28){ri=1;yue++;}}void week7(){if(week==7)week=0x27;}void main()//主函数{wei_1();duan_1();init();while(1){keyk1();display();week7();//Timing();}}void time0() interrupt 1//中断子函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;//时钟}void Timing()//定时闹钟设置。{ /*if(n==1){if(shi==s&&fen==f)//werr=0;//else //werr=1;}if(n==2){if(shi==s&&fen==f)//werr=1;} */} 我也是网上找来的,忘记是在哪个博客了...