课堂作业三

发布时间 2023-09-23 14:43:00作者: LYoungH

 

//contributed by LiuYuhang 2021010905023 

#include <reg52.h>

unsigned char DispBuf[8];

sbit SS = P2^6;                
sbit CS = P2^7;           

sbit LED1 = P1^0;            
sbit BUZZER = P2^3;      

sbit KEY1 = P3^4;        
sbit KEY2 = P3^5;        
sbit KEY3 = P3^6;         

code unsigned char Tab[] =
    {
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
        0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
    };


int sec_right = 0;    
bit timer_start_flag = 1;      
bit flag_alarm = 0;
int cnt = 10;


void T1INTSVC() interrupt 3    
{
    code unsigned char com[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};   
    static unsigned char n = 0;                       
    static unsigned int counter_01ms = 0;    
        static unsigned int counter_alarm = 0; 
    
    TR1 = 0;
    TH1 = 0xFC;
    TL1 = 0x66;
    TR1 = 1;
        
    P0 = 0xFF;        
    CS = 1;
    CS = 0;
    P0 = DispBuf[n];    
    SS = 1;
    SS = 0;
    P0 = ~com[n];    
    CS = 1;
    CS = 0;
    n++;                       
    n &= 0x07;

    
    if (timer_start_flag)
    {
        counter_01ms ++;    
        if (counter_01ms == 10)
        {
            counter_01ms = 0;            
            
                        sec_right ++;            
                    
                        if(sec_right == 2000)
                            sec_right = 0;
                    
                        DispBuf[0] = Tab[sec_right %10];
                        DispBuf[1] = Tab[sec_right /10 %10];            
            DispBuf[2] = Tab[sec_right / 100 % 10] | 0x80;    
            DispBuf[3] = Tab[sec_right / 1000];
                        
            if (sec_right >= cnt*100)
                {
                    if (counter_alarm <=9)
                    {
                        flag_alarm = 1;
                        counter_alarm ++;
                    }
                    else if (counter_alarm == 39 )
                    {
                        flag_alarm = 0;
                        counter_alarm =0;
                    }
                    else
                    {
                        flag_alarm = 0;
                        counter_alarm ++;
                    }
                }
            if (flag_alarm)
            {
                LED1 = 0;
                BUZZER = 0;
            }
            else
            {
                LED1 = 1;
                BUZZER = 1;
            }
    }

}
        else
        {
                LED1 = 1;
                BUZZER = 1;
        }
        
        }


void DispClear()
{
    unsigned char i;
    for (i=0; i<8; i++)
    {
        DispBuf[i] = 0x00;    
    }
}


void Delayms(unsigned int t)
{
    unsigned int us_ct;
    for (;t > 0;t --)        
        for (us_ct = 113;us_ct > 0;us_ct --);    
}



unsigned char KeyScan()
{
    unsigned char k = '\0';

    if ( KEY1 == 0 ) k = '+';
    if ( KEY2 == 0 ) k = '-';
    if ( KEY3 == 0 ) k = '~';

    return k;
}


void SysInit()
{
    DispClear();   

    TMOD = 0x11;    
    EA = 0;
    TH1 = 0xFC;       
    TL1 = 0x66;
    ET1 = 1;        
    EA = 1;            
    TR1 = 1;        
}

void main()
{

    unsigned char k;            //定义键值变量


    SysInit();                    //系统初始化

//    DispBuf[7] = Tab[1];           //在8位数码管上显示“12345678”字样
//    DispBuf[6] = Tab[2];
//    DispBuf[5] = Tab[3];
//    DispBuf[4] = Tab[4];
//    DispBuf[3] = Tab[5];
//    DispBuf[2] = Tab[6];
//    DispBuf[1] = Tab[7];
//    DispBuf[0] = Tab[8];
//    Delayms(2000);                    //保留2s
    

    DispClear();                //清除显示(数码管上的显示内容全部熄灭
    DispBuf[7] = Tab[cnt / 10];
    DispBuf[6] = Tab[cnt % 10];
    while(1)
    {
        Delayms(20);                //扫描延时20ms,也做按键后延消抖
        k = KeyScan();            //扫描按键

        if ( k != '\0')            //首次检测到按键按下
        {
            Delayms(20);                    //延时20ms,按键前沿消抖
            k = KeyScan();            //再次读取按键状态


                while( KeyScan() != '\0');        //等待松开按键
                        if ( k != '\0')            //确认按键按下后处理按键
            {
                if ( k == '+') 
                {
                    if ( cnt < 12 ) cnt++;
                }
                if ( k == '-')
                {
                    if ( cnt > 8 ) cnt--;
                }
                if ( k == '~' )
                {
                    timer_start_flag = ~timer_start_flag;
                }
                
                DispBuf[7] = Tab[cnt / 10];
                DispBuf[6] = Tab[cnt % 10];
            }
        }
    }
}