標(biāo)題: 單片機倒計時程序設(shè)計問題,鍵盤加不進(jìn)去 求大神解答, [打印本頁]

作者: 1328228734    時間: 2018-12-19 14:22
標(biāo)題: 單片機倒計時程序設(shè)計問題,鍵盤加不進(jìn)去 求大神解答,
設(shè)計倒計時程序,要求按1,10秒倒計時,按2,20秒倒計時。我寫了倒計時程序但鍵盤加不進(jìn)去。求大神解答,可酬金答謝
    說明:P0段選,P2位選。共陽極數(shù)碼管

#include<reg52.h>
unsigned char shi,ge,num1,num2,a;
unsigned int x,y,z;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code shu[]={0,10,20,30};
void delay(x);
void shuhanshu(a);                                                  
void display(shi,ge);

unsigned char key()
{unsigned char row=0,col=0,k;
        unsigned  int t;
  P3=0x0F;          //行列
  if(P3==0x0F)
  return k;
  t=20000;while(t--);
  if(P3==0x0F)
  return k;
  for(row=0;row<4;row++)
  {
          P3=~(0x80>>row);
          k=P3&0x0F;
          if(k!=0x0F)
          {
                while(k&(0x08>>col))
            col++;
                k=15-(row*4+col);
                /*        P1=0x0f;
                        while(P1!=0x0F);*/
                return k;
        }
  }
}

void delay(x)
{
   for(y=x;y>0;y--)
     for(z=110;z>0;z--);
}                                                                   //延時

void display(shi,ge)
{
           P0=table[shi];
           P2=0x7f;
           delay(5);
           P0=table[ge];
           P2=0xbf;
           delay(5);
}

void main()
{
        key();
        a=key();
        num1=shu[a];
    TMOD=0x01;
    EA=1;
    ET0=1;
    TR0=1;
  while(1)
  {     
      display(shi,ge);
      if(num2==20)
        {
          num2=0;
          num1--;
          if(num1==0)
           num1=shu[a];
          shi=num1/10;
          ge=num1%10;
        }                     
  }
}
void time1() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        num2++;                                                   //定時器         
}


作者: 1328228734    時間: 2018-12-19 21:39
求大神幫忙啊
作者: wsxujn    時間: 2018-12-19 22:52
把按鍵程序放到 while 里啊
作者: wulin    時間: 2018-12-20 08:56
給你改用5ms查詢方法完成動態(tài)數(shù)碼管顯示和倒計時,用開發(fā)板的矩陣鍵盤P3.7模擬地可以成為4個獨立按鍵。
#include<reg52.h>
sbit key1=P3^0;
sbit key2=P3^1;
//sbit key3=P3^2;
//sbit key4=P3^3;

sbit GND=P3^7;//開發(fā)板矩陣鍵盤模擬地
unsigned char shi,ge,num1=0,num2=0;//a;
//unsigned int x,y,z;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//unsigned char code shu[]={0,10,20,30};
//void delay(x);
//void shuhanshu(a);                                                  
//void display();

void key()
{
        static bit key1_sign,key2_sign;        //靜態(tài)-按鍵自鎖標(biāo)志
        static unsigned char count1,count2;//靜態(tài)-消抖計數(shù)變量                       
        if(!key1)                                                //按鍵1按下
        {
                //   10ms消抖          自鎖長按無效       倒計時中鎖定按鍵無效
                if((++count1>=2)&&(key1_sign==0)&&(num1==0))
                {                       
                        key1_sign=1;        //按鍵1自鎖標(biāo)志置1
                        num1=10;                        //倒計時變量賦值
                        num2=0;                        //計時變量清0
                }
        }
        else                                         //按鍵1抬起
        {
                key1_sign=0;                        //按鍵1自鎖標(biāo)志清0
                count1=0;                                //消抖計數(shù)1清0
        }

        if(!key2)                                        //按鍵2按下
        {
                if((++count2>=2)&&(key2_sign==0)&&(num1==0))
                {                       
                        key2_sign=1;        //按鍵2自鎖標(biāo)志置1
                        num1=20;
                        num2=0;
                }
        }
        else                                        //按鍵2抬起
        {
                key2_sign=0;                        //按鍵2自鎖標(biāo)志清0
                count2=0;                                //消抖計數(shù)2清0
        }
}
/*
void delay(x)
{
   for(y=x;y>0;y--)
     for(z=110;z>0;z--);
} */
void display()
{
        static bit i=0;
        shi=num1/10;
        ge=num1%10;
        P0=0xff;//消隱
        if(i==0)
        {
                P0=table[shi];
                P2=0x7f;
                i=~i;
        }
        else
        {
                P0=table[ge];
                P2=0xbf;
                i=~i;
        }
}

void main()
{
//        key();
//        a=key();
//        num1=shu[a];
        TMOD=0x01;
        TH0=(65536-5000)/256;//5ms
        TL0=(65536-5000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        GND=0;
        while(1)
        {     
                if(TF0==1)//查詢定時器中斷溢出標(biāo)志
                {
                        TF0=0;
                        key();
                        num2++;
                        if(num2==200)//1秒
                        {
                                num2=0;
                                if(num1>0)
                                        num1--;
                        }                     
                        display();
                }
        }
}
void time1() interrupt 1
{
        TH0=(65536-5000)/256;
        TL0=(65536-5000)%256;      
}

作者: 1328228734    時間: 2018-12-20 20:57
wsxujn 發(fā)表于 2018-12-19 22:52
把按鍵程序放到 while 里啊

謝大佬啊,點醒了我,有點效果了,我在小改一下。
作者: 1328228734    時間: 2018-12-20 21:02
wulin 發(fā)表于 2018-12-20 08:56
給你改用5ms查詢方法完成動態(tài)數(shù)碼管顯示和倒計時,用開發(fā)板的矩陣鍵盤P3.7模擬地可以成為4個獨立按鍵。
#i ...

謝,大佬,但是沒看太懂,而且我們在仿真板上做的實驗

6.png (36.13 KB, 下載次數(shù): 15)

6.png

作者: 1328228734    時間: 2018-12-25 22:09
以解決,感興趣的可以看看
#include<reg51.h>
unsigned char shi=0,ge=0,num1,num2,a;
unsigned int x,y,z;
unsigned char code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void display(shi,ge);
unsigned char key()             //鍵盤
{
unsigned char row=0,col=0,k;
unsigned  int t;
  P3=0x0F;          
  if(P3==0x0F)
    return k;
  t=20000;while(t--);
  if(P3==0x0F)
    return k;
  for(row=0;row<4;row++)
  {
          P3=~(0x80>>row);
          k=P3&0x0F;
          if(k!=0x0F)
          {
                while(k&(0x08>>col))
            col++;
                k=15-(row*4+col);
                return k;
        }
  }
}                                                               

void delay(x)                   //延時
{  
  for(y=x;y>0;y--)
  for(z=110;z>0;z--);
}                                                                                                                         
void display(shi,ge)          //段選位選控制函數(shù)
{      
   P0=table[shi];  
   P2=0x7f;
   delay(5);
   P0=table[ge];
   P2=0xbf;   
   delay(5);
  }                                                         
main()                      //主函數(shù)
{  
   TMOD=0x01;
   EA=1;ET0=1;TR0=1;
   P0=0xc0;
   P2=0x3f;
   a=key();
   if(a==1)
     num1=11;
   if(a==2)
     num1=21;
   if(a==3)
     num1=31;
   if(a==4)
     num1=41;
   if(a==5)
     num1=51;
   if(a==6)
     num1=61;
  if(a==1||a==2||a==3||a==4||a==5||a==6)
{while(1)
{     
   display(shi,ge);
   if(num2==20)
     {   
       num2=0;
       num1--;
           if(num1==0)
         return;
           if(key()==0)
             return;       
       shi=num1/10;
       ge=num1%10;
     }  
  }
}
}                                                               
void time1() interrupt 1
{      
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   num2++;
}                                                         





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1