单片机/MCU论坛
直播中

利是封

4年用户 5经验值
私信 关注
[问答]

51单片机数码管显示电子时钟这个程序什么意思?

#include
#include

unsigned char data dis_digit;
unsigned char key_s, key_v;   
unsigned char sec100; //定义这个是干什么的?

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;


***it        K1 = P3^4;
***it        K2 = P3^5;
***it    dula=P2^6;
***it    wela=P2^7;
bit scan_key();      //子函数什么意思
void proc_key();     //子函数什么意思
void inc_sec();
void inc_min();
void inc_hour();
//void display();
void delay(unsigned char ms);
void display1(unsigned char a1,unsigned char a2,unsigned char a3,unsigned char a4,unsigned char a5,unsigned char a6);
void main(void)
{
        P0 = 0xff;
        P2 = 0xff;
        TMOD = 0x11;
        TH1 = 0xdc;
        TL1 = 0;

        TH0 = 0xFC;
        TL0 = 0x17;
       
        hour = 12;
        min = 00;
        sec = 00;

        sec100 = 0;
       
        dis_buf[0] = hour / 10;       
        dis_buf[1] = hour % 10;       
        dis_buf[3] = min / 10;       
        dis_buf[4] = min % 10;
dis_buf[6] = sec / 10;
        dis_buf[7] = sec % 10;
//        dis_buf[2] = 0xbf;       
//        dis_buf[5] = 0xbf;
                       
        dis_digit = 0xfe;
        dis_index = 0;
       
        TCON = 0x01;
        IE = 0x8a;
        TR1 = 1;

        key_v = 0x03;

        while(1)
        {
                if(scan_key())
                {
                        delay(10);
                        if(scan_key())
                        {
                                key_v = key_s;
                                proc_key();
                        }
                }
                display1(dis_buf[0],dis_buf[1],dis_buf[3],dis_buf[4],dis_buf[6],dis_buf[7]);       
        }
}

bit scan_key()
{
        key_s = 0x00;
        key_s |= K2;
        key_s <<= 1;
        key_s |= K1;
        return(key_s ^ key_v);       
}

void proc_key()
{
        EA = 0;
        if((key_v & 0x01) == 0)                // K1
        {
                inc_hour();
        }
        else if((key_v & 0x02) == 0)        // K2
        {
                min++;
                if(min > 59)
                {
                        min = 0;
                }
                dis_buf[3] = min / 10;
                dis_buf[4] = min % 10;
        }

        EA = 1;
}

void timer1() interrupt 3
{
        TH1 = 0xdc;
       
        sec100++;
       
        if(sec100 >= 100)
        {
                sec100 = 0;
                inc_sec();
        }
}

void inc_sec()
{
        sec++;
        if(sec > 59)
        {
                sec = 0;
                inc_min();
        }
        dis_buf[6] = sec / 10;
        dis_buf[7] = sec % 10;
}

void inc_min()
{
        min++;
        if(min > 59)
        {
                min = 0;
                inc_hour();
        }
        dis_buf[3] = min / 10;
        dis_buf[4] = min % 10;
}

void inc_hour()
{
        hour++;
        if(hour > 23)
        {
                hour = 0;
        }
        if(hour > 9)
                dis_buf[0] = hour / 10;
        else
                dis_buf[0] = 0x00;
        dis_buf[1] = hour % 10;

}


void delay(unsigned char ms)       

{                                               
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

void display1(unsigned char a1,unsigned char a2,unsigned char a3,unsigned char a4,unsigned char a5,unsigned char a6)
{
   dula=0;
   P0=table[a1];                //œ‘ æ∞ŸŒª
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay(1);

   dula=0;
   P0=table[a2];                //œ‘ æ ÆŒª
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay(1);

   P0=table[a3];                //œ‘ æ∏ˆŒª
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay(1);

   P0=table[a4];                //œ‘ æ∏ˆŒª
   dula=1;
   dula=0;

   P0=0x77;
   wela=1;
   wela=0;
   delay(1);

   P0=table[a5];                //œ‘ æ∏ˆŒª
   dula=1;
   dula=0;

   P0=0xef;
   wela=1;
   wela=0;
   delay(1);

   P0=table[a6];                //œ‘ æ∏ˆŒª
   dula=1;
   dula=0;

   P0=0xdf;
   wela=1;
   wela=0;
   delay(1);

}

回帖(2)

杨众

2020-3-5 23:56:57
sec是用来计数的,数到100为1秒,bit scan_key()函数是用来判断是否有按键按下的,无论K1或K2按下,或者两个按键一起按下都会返回1,但是这个函数不能判断具体是哪个按键被按下,所以需要void proc_key()函数来判断具体是哪个按键被按下,若K1被按下执行inc_hour()一次,小时hour 被加一,若K2被按下执行分钟min被加一。
举报

TreeOS系统

2020-3-6 08:51:59
计时使用的,定时器中断次数,统计定时器是否中断100次。100次后重新统计。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分