×
单片机 > 单片机程序设计 > 详情

电子时钟(51单片机定时器,1602液晶)

发布时间:2020-06-18 发布时间:
|

电路图:



代码:

#include  

#include  

#include  

#include  

#define uint unsigned int  

#define uchar unsigned char  

  

uint num,A_num,x=0;  

uint h,m,s,year=2012,month=1,day=22,lcd_x=0,lcd_y=0;  

  

uchar code Zifu[]="0123456789";  

  

sbit beep = P2^3;  

  

sbit LCD_EN = P3^4;  

sbit LCD_RS = P3^5;  

  

sbit duan = P2^6;  

sbit wei = P2^7;  

  

sbit key_A = P3^6;  

sbit key_B = P3^7;  

  

void delay_1ms(uchar x){  

    uchar i,j;  

    for(j=0;j

        for(i=0;i<110;i++);  

}  

  

void write_command(uchar command){  

    LCD_RS = 0;  

    LCD_EN = 0;  

    P0 = command;  

    delay_1ms(2);  

    LCD_EN = 1;         //EN 由1 -- 0 完成 有效数据 的 锁存  

    delay_1ms(2);  

    LCD_EN = 0;  

}  

  

void write_data(uchar fuck){  

    LCD_RS = 1;  

    LCD_EN = 0;  

    P0 = fuck;  

    delay_1ms(2);  

    LCD_EN = 1;  

    delay_1ms(2);  

    LCD_EN = 0;  

}  

  

void lcd_post(int X,int Y){         //0,1表征 第一行 和 第二行  

    write_command(0x80+X*(0x40)+Y);  

}  

  

void init(){  

    h=m=s=0;  

    num=A_num=0;  

  

    LCD_EN=0;  

    write_command(0x38);  

    write_command(0x0c);  

    //write_command(0x06); //写字符后地址指针加一  

    write_command(0x01);  

  

    TMOD = 0x02;  

    TH0 = 6;  

    TL0 = 6;  

    EA = 1;  

    ET0 = 1;  

    TR0 = 1;  

  

/*时分秒*/   

    lcd_post(0,0); write_data(Zifu[h/10]);  

    lcd_post(0,1); write_data(Zifu[h%10]);  

  

    lcd_post(0,2); write_data(':');  

  

    lcd_post(0,3); write_data(Zifu[m/10]);  

    lcd_post(0,4); write_data(Zifu[m%10]);  

  

    lcd_post(0,5); write_data(':');  

  

    lcd_post(0,6); write_data(Zifu[s/10]);  

    lcd_post(0,7); write_data(Zifu[s%10]);  

  

/*年月日*/  

    lcd_post(1,6); write_data(Zifu[year/1000]);  

    lcd_post(1,7); write_data(Zifu[(year%1000)/100]);  

    lcd_post(1,8); write_data(Zifu[(year%100)/10]);  

    lcd_post(1,9); write_data(Zifu[year%10]);  

  

    lcd_post(1,10); write_data('-');  

  

    lcd_post(1,11); write_data(Zifu[month/10]);  

    lcd_post(1,12); write_data(Zifu[month%10]);  

  

    lcd_post(1,13); write_data('-');  

  

    lcd_post(1,14); write_data(Zifu[day/10]);  

    lcd_post(1,15); write_data(Zifu[day%10]);  

}  

  

void di(){  

    beep=0; delay_1ms(100); beep=1;  

}  

  

void keyscan(){  

    if(key_A==0){  

        delay_1ms(3);  

        if(key_A==0){  

            A_num++;      

            di();  

            switch(A_num){  

                case 1:                           //时  

                    TR0=0;                          

                    lcd_post(0,1);  

                    write_command(0x0f);  

                    break;  

                case 2:lcd_post(0,4);break;       //分  

                case 3:lcd_post(0,7);break;       //秒  

  

                case 4:lcd_post(1,6);break;       //年  

                case 5:lcd_post(1,7);break;  

                case 6:lcd_post(1,8);break;  

                case 7:lcd_post(1,9);break;  

  

                case 8:lcd_post(1,12);break;          //月  

                case 9:lcd_post(1,15);break;          //日  

                case 10:  

                    A_num=0;  

                    write_command(0x0c);  

                    TR0=1;  

                    break;  

            }         

        }  

        while(!key_A);  

    }  

    if(A_num!=0){  

        if(key_B==0){  

            delay_1ms(3);  

            if(key_B==0){     

                di();  

                  

                switch(A_num){  

                case 1:  

                    h=(++h)%24;  

                    lcd_post(0,0); write_data(Zifu[h/10]);  

                    lcd_post(0,1); write_data(Zifu[h%10]);  

                    break;        //时  

                case 2:  

                    m=(++m)%60;  

                    lcd_post(0,3); write_data(Zifu[m/10]);  

                    lcd_post(0,4); write_data(Zifu[m%10]);  

                    break;        //分  

                case 3:  

                    s=(++s)%60;  

                    lcd_post(0,6); write_data(Zifu[s/10]);  

                    lcd_post(0,7); write_data(Zifu[s%10]);  

                    break;        //秒  

  

                case 4:           //年  

                    lcd_post(1,6);  

                    write_data(Zifu[(++x)%10]);  

                    break;          

                case 5:  

                    lcd_post(1,7);  

                    write_data(Zifu[(++x)%10]);  

                    break;  

                case 6:  

                    lcd_post(1,8);  

                    write_data(Zifu[(++x)%10]);  

                    break;  

                case 7:  

                    lcd_post(1,9);  

                    write_data(Zifu[(++x)%10]);  

                    break;  

  

                case 8:  

                    month=(++month)%13;  

                    lcd_post(1,11); write_data(Zifu[month/10]);  

                    lcd_post(1,12); write_data(Zifu[month%10]);  

                    break;        //月  

                case 9:  

                    day=(++day)%32;  

                    lcd_post(1,14); write_data(Zifu[day/10]);  

                    lcd_post(1,15); write_data(Zifu[day%10]);  

                    break;        //日  

                case 10:break;  

                }write_command(0x10);         

            }  

            while(!key_B);  

        }  

    }  

}  

  

void main()  

{  

    init();  

    while(1){  

        if(num==3686){  

            num=0;  

            s++;  

            if(s==60){  

                s=0;  

                m++;  

                if(m==60){  

                    m=0;  

                    h++;  

                    if(h==24)h=0;  

                    lcd_post(0,0); write_data(Zifu[h/10]);  

                    lcd_post(0,1); write_data(Zifu[h%10]);  

                }  

                lcd_post(0,3); write_data(Zifu[m/10]);  

                lcd_post(0,4); write_data(Zifu[m%10]);  

            }  

            lcd_post(0,6); write_data(Zifu[s/10]);  

            lcd_post(0,7); write_data(Zifu[s%10]);  

        }  

        keyscan();  

          

    }  

}  

  

void T0_time() interrupt 1  

{  

    num++;  

}  


关键字:电子时钟  51单片机  定时器  1602液晶 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会