用51 单片机做的时钟运用的知识点:
1、定时器
2、液晶
3、IIC协议
4、独立按键
实现的功能:
1、可以通过按键调节秒、分、时、日、月、年,按键可加可减,可确认
2、任何时候断电可以保存数据,重新上电可以继续运行
3、每月的天数不一样,例如:2月有28天,1月31天;
基于郭天祥视屏写成,有兴趣的同学可以交流下?
- #include
- #define uchar unsigned char
- #define uint unsigned int
- char a,num,miao,shi,fen,ri,yue,setnum,add,flag,temp,edg;
- uint nian;
- uchar code table[]=" 2016-10-22 ";
- uchar code table1[]={"23:59:55"};
- ***it lcdwr=P2^5;
- ***it lcdrs=P2^6;
- ***it lcden=P2^7;
- ***it LED=P2^2;
- ***it key1=P3^0;
- ***it key2=P3^1;
- ***it key3=P3^2;
- ***it key4=P3^3;
- ***it scl=P2^1;
- ***it sda=P2^0;
- void delay(uchar tt)
- {
- uchar x,y;
- for(x=tt;x>0;x--)
- for(y=110;y>0;y--);
- }
- void start()
- {
- sda=1;
- delay(1);
- scl=1;
- delay(1);
- sda=0;
- delay(1);
- }
- void stop()
- {
- sda=0;
- delay(1);
- scl=1;
- delay(1);
- sda=1;
- delay(1);
- }
- void respon()
- {
- uchar i=0;
- scl=1;
- delay(1);
- while((sda==1)&&(i<200))
- i++;
- scl=0;
- delay(1);
- }
- void writiie(uchar date)
- {
- uchar i;
- edg=date;
- for(i=0;i<8;i++)
- {
- scl=0;
- delay(1);
- edg=edg<<1;
- sda=CY;
- scl=1;
- delay(1);
- }
- scl=0;
- delay(1);
- sda=1;
- delay(1);
- }
- char readiie()
- {
- uchar i,k;
- scl=0;
- delay(1);
- sda=1;
- delay(1);
- for(i=0;i<8;i++)
- {
- scl=1;
- delay(1);
- k=(k<<1)|sda;
- scl=0;
- delay(1);
- }
- return k;
- }
- void lcd_com(uchar com)
- {
- lcdrs=0;
- delay(1);
- P0=com;
- delay(1);
- lcden=1;
- delay(5);
- lcden=0;
-
- }
- void lcd_date(uchar date)
- {
- lcdrs=1;
- delay(1);
- P0=date;
- delay(1);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void lcdwr1(uchar adress,uchar date)
- {
- lcd_com(0X80+adress);
- lcd_date(0x30+date/10);
- lcd_date(0x30+date%10);
- }
- void lcdwr2(uchar adress,uint date)
- {
- lcd_com(0X80+adress);
- lcd_date(0x30+date/1000);
- lcd_date(0x30+date/100%10);
- lcd_date(0x30+date/10%10);
- lcd_date(0x30+date%10);
- }
- void iiewritr(uchar add,uchar ss)
- {
- start();
- writiie(0Xa0);
- respon();
- writiie(add);
- respon();
- writiie(ss);
- respon();
- stop();
- }
- void key_set()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- setnum++;
- TR0=0;
- lcd_com(0X0d);
- if(setnum==7)
- {
- setnum=1;
- }
- switch(setnum)
- {
- case 1:
-
- // miao++;
- // lcdwr1(0x40+0X08,miao);
- // lcd_com(0X0d);
- lcd_com(0X80+0X40+0X08);
- break;
- case 2:
- // lcd_com(0X0d);
- lcd_com(0X80+0X40+0X05);
- break;
- case 3:
- // lcd_com(0X0d);
- lcd_com(0X80+0X40+0X02);
- break;
- case 4:
- // lcd_com(0X0d);
- lcd_com(0X80+0X09);
- break;
- case 5:
- // lcd_com(0X0d);
- lcd_com(0X80+0X06);
- break;
- case 6:
- // lcd_com(0X0d);
- lcd_com(0X80+0X01);
- break;
- }
- }
- }
- if(setnum!=0)
- {
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- LED=~LED;
- switch(setnum)
- {
- case 1:
- miao++;
- if(miao==60)
- {
- miao=0;
- }
- // lcd_com(0X80+0X40+0X08);
- iiewritr(1,miao);
- lcdwr1(0x40+0X08,miao);
- lcd_com(0X80+0X40+0X08);
- break;
- case 2:
- fen++;
- if(fen==60)
- {
- fen=0;
- }
- iiewritr(2,fen);
- lcdwr1(0x40+0X05,fen);
- lcd_com(0X80+0X40+0X05);
- break;
- case 3:
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- iiewritr(3,shi);
- lcdwr1(0x40+0X02,shi);
- lcd_com(0X80+0X40+0X02);
- break;
- case 4:
- ri++;
- if(ri>temp-1)
- {
- ri=1;
- }
- iiewritr(4,ri);
- lcdwr1(0X09,ri);
- lcd_com(0X80+0X09);
- break;
- case 5:
- yue++;
- if(yue==13)
- {
- yue=1;
- }
- iiewritr(5,yue);
- lcdwr1(0X06,yue);
- lcd_com(0X80+0X06);
- break;
- case 6:
- nian++;
- lcdwr2(0X01,nian);
- lcd_com(0X80+0X01);
- break;
- }
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- LED=~LED;
- switch(setnum)
- {
- case 1:
- miao--;
- if(miao<0)
- {
- miao=59;
- }
- // lcd_com(0X80+0X40+0X08);
- iiewritr(1,miao);
- lcdwr1(0x40+0X08,miao);
- lcd_com(0X80+0X40+0X08);
- break;
- case 2:
- fen--;
- if(fen<0)
- {
- fen=59;
- }
- iiewritr(2,fen);
- lcdwr1(0x40+0X05,fen);
- lcd_com(0X80+0X40+0X05);
- break;
- case 3:
- shi--;
- if(shi<0)
- {
- shi=23;
- }
- iiewritr(3,shi);
- lcdwr1(0x40+0X02,shi);
- lcd_com(0X80+0X40+0X02);
- break;
- case 4:
- ri--;
- if(ri<=0)
- {
- ri=temp-1;
- }
- iiewritr(4,ri);
- lcdwr1(0X09,ri);
- lcd_com(0X80+0X09);
- break;
- case 5:
- yue--;
- if(yue<0)
- {
- yue=12;
- }
- iiewritr(5,yue);
- lcdwr1(0X06,yue);
- lcd_com(0X80+0X06);
- break;
- case 6:
- nian--;
- lcdwr2(0X01,nian);
- lcd_com(0X80+0X01);
- break;
- }
- }
- }
- if(key4==0)
- {
- delay(5);
- if(key4==0)
- {
- setnum=0;
- lcd_com(0X80+0X05);
- lcd_date(table[5]);
- lcd_com(0X80+0X08);
- lcd_date(table[8]);
- delay(2);
- lcd_com(0X80+0x40+0x04);
- lcd_date(table1[2]);
- lcd_com(0X80+0x40+0x07);
- lcd_date(table1[5]);
- delay(2);
- // lcdwr1(0x40+0X08,miao);
- // lcdwr1(0x40+0X05,fen);
- // lcdwr1(0x40+0X02,shi);
- // lcdwr1(0X09,ri);
- // lcdwr1(0X06,yue);
- // lcdwr2(0X01,nian);
- TR0=1;
- lcd_com(0X0C);
- // lcd_com(0X01);
- }
- }
- }
-
-
-
-
- }
- char iieread(uchar add)
- {
- uchar date;
- start();
- writiie(0Xa0);
- respon();
- writiie(add);
- respon();
- start();
- writiie(0Xa1);
- respon();
- date=readiie();
- respon();
- stop();
- return date;
- }
- void init()
- {
- lcdwr=0;
- delay(1);
- lcden=0;
- lcd_com(0X38);
- lcd_com(0X0C);
- lcd_com(0X06);
- lcd_com(0X01);
- TMOD=0X01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- lcd_com(0X80+0X05);
- lcd_date(table[5]);
- lcd_com(0X80+0X08);
- lcd_date(table[8]);
- delay(2);
- lcd_com(0X80+0x40+0x04);
- lcd_date(table1[2]);
- lcd_com(0X80+0x40+0x07);
- lcd_date(table1[5]);
- delay(2);
- miao=iieread(1);
- if(miao>59)
- miao=0;
- lcdwr1(0x40+0X08,miao);
- fen=iieread(2);
- if(fen>59)
- fen=0;
- lcdwr1(0x40+0X05,fen);
- shi=iieread(3);
- if(shi>23)
- shi=0;
- lcdwr1(0x40+0X02,shi);
- ri=iieread(4);
- if(ri>31||ri<0)
- ri=1;
- lcdwr1(0X09,ri);
- yue=iieread(5);
- if(yue>12||yue<0)
- yue=1;
- lcdwr1(0X06,yue);
- nian=2016;
- lcdwr2(0X01,nian);
- scl=1;
- delay(1);
- sda=1;
- }
- void main()
- {
- init();
- while(1)
- {
- if(yue<=7)
- {
- if(yue%2==0)
- {
- if(yue==2)
- {
- temp=29;
- }
- else
- temp=32;
- }
- if(yue%2!=0)
- {
- temp=32;
- }
- }
- if(yue>7&&yue<13)
- {
- if(yue%2==0)
- {
- temp=32;
- }
- else temp=31;
- }
- // }
- /* lcdwr1(0X06,yue);
- lcdwr1(0X09,ri);
- lcdwr1(0x40+0X02,shi);
- lcdwr1(0x40+0X05,fen);
- lcdwr1(0x40+0X08,miao); */
- key_set();
- }
-
- }
- void time() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- num++;
- if(num==20)
- {
- num=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- ri++;
- LED=~LED;
- flag=1;
- if(ri==temp)
- {
- ri=1;
- yue++;
- if(yue==13)
- {
- yue=1;
- nian++;
- lcdwr2(0X01,nian);
- }
- lcdwr1(0X06,yue);
- iiewritr(5,yue);
- }
- lcdwr1(0X09,ri);
- iiewritr(4,ri);
- }
- lcdwr1(0x40+0X02,shi);
- iiewritr(3,shi);
- }
- lcdwr1(0x40+0X05,fen);
- iiewritr(2,fen);
- }
- lcdwr1(0x40+0X08,miao);
- iiewritr(1,miao);
- }
- //time_lcd();
- }
复制代码
0
|
|
|
|