由于课程设计需要,本人做了一个基于51单片机控制的lcd1602d显示的电子时钟电子设计产品。可以显示万年历,星期。
本来还想加上温湿度的检测,发现屏幕空间不够用了。。有需要可以再另外共享那个设计。第一次
单片机源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit rs=P1^0;
- sbit rw=P1^1;
- sbit en=P1^2;
- sbit key_set=P3^4;
- sbit key_up=P3^5;
- sbit key_down=P3^6;
- uchar code table1[]="2017/04/18 Aiice:";
- uchar code table2[]="00:00:00 ";
- uchar num,aa,sec,min,hou,week,day,mon,year,key_num;
- void write_week(uchar week);
- void delay(uint z)
- {
- uint x,y;
- for (x=z;x>0;x--)
- {
- for(y=250;y>0;y--);
- }
- }
- void write_dat(uchar); //
- void write_com(uchar); //
- void init();
- void display_1(uchar add,uchar acc);
- void display_2(uchar add,uchar acc); //
- void write_week(uchar week)
- {
- write_com(0x80+0x40+12);
- switch(week)
- {
- case 1: write_dat('M');delay(5); write_dat('O');delay(5);write_dat('N');break;
- case 2: write_dat('T');delay(5);write_dat('U');delay(5);write_dat('E');break;
- case 3: write_dat('W');delay(5);write_dat('E');delay(5);write_dat('D');break;
- case 4: write_dat('T');delay(5);write_dat('H');delay(5);write_dat('U');break;
- case 5: write_dat('F');delay(5);write_dat('R');delay(5);write_dat('I');break;
- case 6: write_dat('S');delay(5);write_dat('A');delay(5);write_dat('T');break;
- case 7: write_dat('S');delay(5);write_dat('U');delay(5);write_dat('N');break;
- }
- }
- void keyscan() //
- {
- if(key_set==0)
- {
- delay(5);
- if(key_set==0)
- {
- while(!key_set);
- key_num++;
- if(key_num==1) //定位到秒
- {
- TR0=0;
- write_com(0x80+0x40+7);
- write_com(0x0f);
- if(key_up==0)
- {
- delay(5);
- if(key_up==0)
- {
- while(!key_up);
- //up_num++;
-
-
- sec++;
- if(sec==60)
- { sec=0;min=min+1;}
- display_2(7,sec);
- write_com(0x80+0x40+7);
-
- }
- }
- }
- //////////////////////////////////////
-
- if(key_num==2) //定位到分
- {
- TR0=0;
- write_com(0x80+0x40+4);
-
- }
- if(key_num==3) //定位到时
- {
- TR0=0;
- write_com(0x80+0x40+1);
- }
- if(key_num==4) //定位到日
- {
- TR0=0;
- write_com(0x80+9);
- }
- if(key_num==5) //定位到月
- {
- TR0=0;
- write_com(0x80+6);
- }
-
- if(key_num==6) //定位到年
- {
- TR0=0;
- write_com(0x80+3);
- }
- if(key_num==7) //保存设置
- {
- //TR0=0;
- key_num=0;
- write_com(0x0c);//取消闪烁
- TR0=1;
- }
-
- }
- }
- if(key_num!=0)
- {
- if(key_up==0)
- {
- delay(5);
- if(key_up==0)
- {
- while(!key_up);
- if(key_num==1)
- {
- sec++;
- if(sec==60)
- { sec=0;min=min+1;
- display_2(3,min);
- write_com(0x80+0x40+4);
- }
- display_2(6,sec); //6表示十位数字的位置,则各位数字在7.(大发现!!!)
- write_com(0x80+0x40+7);//光标闪烁的位置(在个位)
- }
- if(key_num==2)
- {
- min++;
- if(min==60)
- {
- min=0;hou=hou+1;
- display_2(0,hou);
- write_com(0x80+0x40+1);
- }
- display_2(3,min);
- write_com(0x80+0x40+4);
- }
- if(key_num==3)
- {
- hou++;
- if(hou==24)
- {
- hou=0;day=day+1;week++;
- display_1(8,day);
- write_com(0x80+9);
- }
- display_2(0,hou); //时针的十位数字在屏幕的左边第一个位置
- write_com(0x80+0x40+1);
- }
- if(key_num==4)
- {
- day++;
- //week++;
- if(day==30)
- {
- day=0;mon=mon+1;
- display_2(5,mon);
- write_com(0x80+6);
- }
- display_1(8,day);
- write_com(0x80+9);
- }
- }
-
- }
- if(key_down==0)
- {
- delay(5);
- if(key_down==0)
- {
- while(!key_down);
- if(key_num==1)
- {
- sec--;
- if(sec==-1)
- { sec=59;min=min-1;
- display_2(3,min);
- write_com(0x80+0x40+4);
- }
- display_2(6,sec);
- write_com(0x80+0x40+7);
- }
- if(key_num==2)
- {
- min--;
- if(min==-1)
- {
- min=59;hou=hou-1;
- display_2(0,hou);
- write_com(0x80+0x40+1);
- }
- display_2(3,min);
- write_com(0x80+0x40+4);
- }
- if(key_num==3)
- {
- hou--;
- if(hou==-1)
- {hou=23;week--;}//星期还没加入
- display_2(0,hou);
- write_com(0x80+0x40+1);
- }
- }
- }
- }
-
- }
- void main()
- {
- init();
- write_week(week); //送到液晶屏显示
- while(1)
- {
- keyscan();
- if(aa==20)
- {
- aa=0;
- sec++;
- if(sec==60)
- {
- sec=0;
- min++;
- if(min==60)
- {
- min=0;
- hou++;
- if(hou==24)
- {
- hou=0;
- }
- display_2(1,hou);
- }
- display_2(3,min);
- }
- display_2(6,sec);//在秒钟那个位置开始加一
- }
- }
- }
- void write_com(uchar com)
- {
- rs=0;
- en=1;
- P0=com;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void write_dat(uchar dat)
- {
- rs=1;
- en=1;
- P0=dat;
- delay(5);
- en=1;
- delay(5);
- en=0;
- }
- void init()
- {
- key_set=key_up=key_down=1;
- week=3;
- rw=0;
- en=0;
- delay(50);
- write_com(0x38); //
- delay(1);
- write_com(0x0c); // s
- delay(1);
- write_com(0x06); //
- delay(1);
- write_com(0x80); //
- delay(1);
- write_com(0x01); //
- delay(1);
- for(num=0;num<16;num++)
- {
- write_dat(table1[num]);
- delay(1);
- }
- write_com(0x80+0x40); //左边第二行第一个位置开始写,往右(16个数据)
- for(num=0;num<14;num++)
- {
- write_dat(table2[num]);
- delay(1);
-
- }
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1602test03.7z
(436.38 KB, 下载次数: 225)
|