微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于1602时钟的问题

关于1602时钟的问题

时间:10-02 整理:3721RD 点击:
用1602做了一个时钟显示,前几秒显示正常,大概9s后,就开始一分多钟才走一秒。怎么会这样?

这是代码
#include<reg51.h>
#define uchar unsigned char
#define GPIO_LCD P0
uchar F,M,S;
uchar code discode[]={"0123456789:"};
uchar Realtime[3];
sbit LCD_E=P2^7;
sbit LCD_RS=P2^6;
sbit LCD_WR=P2^5;
uchar Count;
void delay1ms(uchar);
void LCD_write_command(uchar);                         //写命令
void LCD_write_data(uchar);                                //写数据
void LCD_set_xy(uchar,uchar);
void LCD_init();
void DisPlay_Time();
void SHIJIAN();
void main()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        TR0=1;                                                         
        ET0=1;
        LCD_init();
        LCD_set_xy(4,0);
        S=10;
        F=5;
        M=25;
//        DisPlay_Time();       
        while(1)
        {
                LCD_set_xy(4,0);
                SHIJIAN();
//                DisPlay_Time();
                LCD_write_command(0x02);
        }
}
void LCD_write_command(uchar com)
{
        LCD_RS=0;
        LCD_WR=0;
        GPIO_LCD=com;
        delay1ms(10);
        LCD_E=1;
        delay1ms(10);
        LCD_E=0;               
}
void LCD_write_data(uchar dat)
{
        LCD_RS=1;
        LCD_WR=0;
        GPIO_LCD=dat;
        delay1ms(10);
        LCD_E=1;
        delay1ms(10);
        LCD_E=0;
}
void delay1ms(uchar n)   //误差 0us
{
    unsigned char a,b,c;
    for(c=n;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
void LCD_init()
{
        LCD_write_command(0x38);
        LCD_write_command(0x0c);
        LCD_write_command(0x06);
        LCD_write_command(0x01);
        LCD_write_command(0x80);
}
void LCD_set_xy(uchar x,uchar y)
{
        uchar address;
        if(y==0)
                address=0x80+x;
        else
                address=0x0c+x;
        LCD_write_command(address);
}                                       
void DisPlay_Time()
{
        //秒
        LCD_write_data(discode[S/10]);
        LCD_write_data(discode[S%10]);
        LCD_write_data(discode[10]);
        //分
        LCD_write_data(discode[F/10]);
        LCD_write_data(discode[F%10]);
        LCD_write_data(discode[10]);
        //时
        LCD_write_data(discode[M/10]);
        LCD_write_data(discode[M%10]);
}
void enter() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;       
        Count++;
}
void SHIJIAN()
{
        if(Count==20)
        {
                Count=0;
                M++;
                if(M==60)       
                {
                        M=0;
                        F++;
                        if(F==60)
                        {
                                F=0;
                                S++;
                                if(S==24)
                                {
                                        S=0;
                                }
                        }
                }               
        }
        DisPlay_Time();
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top