带修改暂停启动的动态数码管时钟

来源:互联网 发布:linux双网卡同时激活 编辑:程序博客网 时间:2024/06/04 21:06
#include <reg52.h>////////////////////////////////////////////////////////////////////////////////////////unsigned char code DIG_PLACE[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制unsigned char DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段选控制   查表的方法控制//0、1、2、3、4、5、6、7、8、9的显示码///////////////////////////////////////////////////////////////////////////////////////char sec,min,hour;unsigned int i = 0,k = 0;unsigned char num = 0;unsigned char local = 0;unsigned char flag = 1;unsigned char KeyScan(void);void Delay(unsigned char t);sbit KEY1 = P1^0;sbit KEY2 = P1^1;sbit KEY3 = P1^2;sbit KEY4 = P1^3;sbit KEY5 = P1^4;sbit KEY6 = P1^5;sbit Beep = P1^6;void main(void){    TMOD = 0x01;    TH0 = 0xfc;    TL0 = 0x18;    EA = 1;    ET0 = 1;    TR0 = 1;    sec = 0;    min = 0;    hour = 0;    while(1)    {         if(sec >= 60)         {            min++;            sec  = 0;         }         if(min >= 60)         {            hour++;            min = 0;         }         if(hour >= 24)         {            hour = 0;            min = 0;            sec = 0;         }         P3 = ~DIG_CODE[local];         num = KeyScan();         if(num == 1)         {            local++;            if(local == 6)            {                local =0;            }            //num = 0;         }         if(num == 2)         {            switch(local)            {                case 5:sec++;                       if(sec >= 60)                       {                            min++;                            sec = 0;                       }break;                case 4:sec += 10;                       if(sec >= 60)                       {                            min++;                            sec = 0;                       }                        break;                case 3:min++;                       if(min >= 60)                       {                           hour++;                           min = 0;                       }break;                case 2:min += 10;                       if(min >= 60)                       {                           hour++;                           min = 0;                       }break;                case 1:hour++;                       if(hour >= 24)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;                case 0:hour += 10;                       if(hour >= 24)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;            }            //num = 0;           }         if(num == 3)         {            switch(local)            {                case 5:sec--;                       if(sec <= 0)                       {                            min--;                            sec = 0;                       }break;                case 4:sec -= 10;                       if(sec <= 0)                       {                            min--;                            sec = 0;                       }break;                case 3:min--;                       if(min <= 0)                       {                           hour--;                           min = 59;                       }break;                case 2:min -= 10;                       if(min <= 0)                       {                           hour--;                           min = 59;                       }break;                case 1:hour--;                       if(hour <= 0)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;                case 0:hour -= 10;                       if(hour <= 0)                       {                           sec = 0;                           min = 0;                           hour = 0;                       }break;            }            //num = 0;           }         if(num == 4)         {            sec = 0;            min = 0;            hour = 0;         }         if(num == 5)         {            flag = 0;         }         if(num == 6)         {            flag = 1;         }         if(sec == 0 && min == 30 && hour == 20)         {            Beep = !Beep;         }    }}void ISR_Timer0(void) interrupt 1{    TH0 = 0xfc;    TL0 = 0x18;    //i++;    if(flag == 1)    {        i++;        if(i == 1000)        {            i = 0;            sec++;        }    }    switch(k)        {            case 0:P0 = DIG_CODE[sec%10];                   P2 = DIG_PLACE[7];                   k = 1;                   break;            case 1:P0 = DIG_CODE[sec/10];                   P2 = DIG_PLACE[6];                   k = 2;                   break;            case 2:P0 = 0x40;                   P2 = DIG_PLACE[5];                   k = 3;                   break;            case 3:P0 = DIG_CODE[min%10];                   P2 = DIG_PLACE[4];                   k = 4;                   break;            case 4:P0 = DIG_CODE[min/10];                   P2 = DIG_PLACE[3];                   k = 5;                   break;            case 5:P0 = 0x40;                   P2 = DIG_PLACE[2];                   k = 6;                   break;            case 6:P0 = DIG_CODE[hour%10];                   P2 = DIG_PLACE[1];                   k = 7;                   break;            case 7:P0 = DIG_CODE[hour/10];                   P2 = DIG_PLACE[0];                   k = 0;                   break;        }}unsigned char KeyScan(void){     if(!KEY1)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY1)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY1);//如果确认按下按键等待按键释放,没有则退出             {                 return 1;             }         }    }    else if(!KEY2)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY2)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY2);//如果确认按下按键等待按键释放,没有则退出             {                 return 2;             }         }    }    else if(!KEY3)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY3)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY3);//如果确认按下按键等待按键释放,没有则退出             {                 return 3;             }         }    }    else if(!KEY4)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY4)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY4);//如果确认按下按键等待按键释放,没有则退出             {                 return 4;             }         }    }    else if(!KEY5)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY5)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY5);//如果确认按下按键等待按键释放,没有则退出             {                 return 5;             }         }    }    else if(!KEY6)  //如果检测到低电平,说明按键按下    {         Delay(10); //延时去抖,一般10-20ms         if(!KEY6)     //再次确认按键是否按下,没有按下则退出         {             while(!KEY6);//如果确认按下按键等待按键释放,没有则退出             {                 return 6;             }         }    }    else         return 0;}void Delay(unsigned char t){    while(t--);}
0 0