uli123 发表于 2012-10-11 15:59:44

求解大神:24秒倒计时程序设计

按key1启动数码管从24开始倒计时,key2暂停计数,再按一下继续倒计时,当只剩最后5秒时,数码管显示的数字闪烁。按一下key3后,如果再按一下key4,数码管个位数加一;连续按两下key3,再按一下key4,个位数减一;连续按三下key3,再按一下key4十位数加一;连续按四下key3,再按一下key4十位数减一


/*P0控制数码管,P3控制矩阵键盘,P2^5控制蜂鸣器,P2^7,6控制段位*/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code num[]={
                          0xc0,0xf9,0xa4,0xb0,
                        0x99,0x92,0x82,0xf8,
                        0x80,0x90,0x88,0x83,
                        0xc6,0xa1,0x86,0x8e
                                        };        //共阳数码管数字显示
uchar temp,m,n,shi,ge,i,shu,flag=1,y;
uint n1,x,d;
sbit voice=P2^5;
sbit wei=P2^7;
sbit duan=P2^6;
void delay(uint a)        //a毫秒(ms)延时函数(大约)
{
uint i,j;
for(i=a;i>0;i--)
   for(j=110;j>0;j--)
          ;
}
void show()        //显示数码管,no problem
{
        shi=shu/10;
        ge=shu%10;
        P0=num;        //显示"十位"数字
        duan=1;
        duan=0;
        P0=0x80;                //在第一位显示
        wei=1;
        wei=0;
        delay(1);
        P0=num;        //显示"个位"数字
        duan=1;
        duan=0;
        P0=0x40;//在第二位显示
        wei=1;
        wei=0;
        delay(1);
}
void main()
{
        while(1)
        {
                P3=0xfe;//初始赋值,控制矩阵第4行
                temp=P3;                //检测键盘按下
                temp=temp&0xf0;
                              if(temp!=0xf0)
               {
                        delay(5);//延迟5ms
                        temp=P3;
                        temp=temp&0xf0;
                        if(temp!=0xf0)
                          {
                                switch(temp)
                                {
                                case 0x7e:TMOD=0x11;//定时器初始设置
                                       TH0=(65536-45872)/256;
                                       TL0=(65536-45872)%256;
                                       TH1=(65536-45872)/256;
                                                 TL1=(65536-45872)%256;
                                       EA=1;
                                       ET0=1;
                                       ET1=1;
                                       TR0=1;//启动定时器0
                                       TR1=0;
                                       n=0;
                                       shu=24;
                                                                                 break;
                               case 0xbe:n1++;//根据n1的奇偶性,开关闭定时器0,使数码管上数字停止
                                             m=n1/2;
                                             if(m==1)//取整为奇时关定时器
                                             TR0=0;
                                             else
                                             TR0=1;
                                             break;                       
                               case 0xde:P3=0xfe;
                                             TR1=1;                //打开定时器1
                                             while(flag)//标记变量
                                                {
                                                        temp=P3;
                                                        delay(5);
                                                        if(temp==0xee)//寄存key4按键次数
                                                                x++;
                                                        while(temp!=0xee)
                                                               ;
                                                        if(d==40)//到40时为2s,即等待key4连击的时间
                                                        {
                                                                flag=0;//停止x的累加
                                                                TR1=0;
                                                        }
                                               }
                                             break;
               
                               }
                               while(temp!=0xf0)
                               {
                                       temp=P3;
                                        temp=temp&0xf0;
                               }
                          }
               }
                if(x==1)
                        shu++;
                if(x==2)
                        shu--;
                if(x==3)
                     y=shu/10,shu=(++y)*10+shu%10;//shu=(++(shu/10))*10+(shu%10);//十位数字加加,即加10
                if(x==4)
                     y=shu/10,shu=(--y)*10+shu%10;
                flag=1;
                if((shi==0)&&(ge<=5)&&(ge>0))//最后5s时闪烁
                        {
                          delay(400);
                          show();
                        }
                else
                          show();
                if((shi==0)&&(ge==0))//关闭定时器0,不再计时,同时蜂鸣器响
                {
                        TR0=0;
                }
               
        }       
}
void TO_time() interrupt 1
{
        TH0=(65536-45872)/256;                //溢满需50ms
        TL0=(65536-45872)%256;
        n++;                               
        if(n==20)//每1s数码管数字减1
           shu--;
}
void T1_time() interrupt 3                //用于等待接受key4的连击
{
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        d++;
}
页: [1]
查看完整版本: 求解大神:24秒倒计时程序设计