找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

單片機(jī)倒計(jì)時(shí)程序設(shè)計(jì)問題,鍵盤加不進(jìn)去 求大神解答,

查看數(shù): 2365 | 評論數(shù): 6 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時(shí)間: 2018-12-19 14:22

正文摘要:

設(shè)計(jì)倒計(jì)時(shí)程序,要求按1,10秒倒計(jì)時(shí),按2,20秒倒計(jì)時(shí)。我寫了倒計(jì)時(shí)程序但鍵盤加不進(jìn)去。求大神解答,可酬金答謝     說明:P0段選,P2位選。共陽極數(shù)碼管 #include<reg52.h> unsigned char s ...

回復(fù)

ID:334343 發(fā)表于 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)                   //延時(shí)
{  
  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++;
}                                                         
ID:334343 發(fā)表于 2018-12-20 20:57
wsxujn 發(fā)表于 2018-12-19 22:52
把按鍵程序放到 while 里啊

謝大佬啊,點(diǎn)醒了我,有點(diǎn)效果了,我在小改一下。
ID:213173 發(fā)表于 2018-12-20 08:56
給你改用5ms查詢方法完成動(dòng)態(tài)數(shù)碼管顯示和倒計(jì)時(shí),用開發(fā)板的矩陣鍵盤P3.7模擬地可以成為4個(gè)獨(dú)立按鍵。
#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)-消抖計(jì)數(shù)變量                       
        if(!key1)                                                //按鍵1按下
        {
                //   10ms消抖          自鎖長按無效       倒計(jì)時(shí)中鎖定按鍵無效
                if((++count1>=2)&&(key1_sign==0)&&(num1==0))
                {                       
                        key1_sign=1;        //按鍵1自鎖標(biāo)志置1
                        num1=10;                        //倒計(jì)時(shí)變量賦值
                        num2=0;                        //計(jì)時(shí)變量清0
                }
        }
        else                                         //按鍵1抬起
        {
                key1_sign=0;                        //按鍵1自鎖標(biāo)志清0
                count1=0;                                //消抖計(jì)數(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;                                //消抖計(jì)數(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)//查詢定時(shí)器中斷溢出標(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;      
}
ID:186249 發(fā)表于 2018-12-19 22:52
把按鍵程序放到 while 里啊
ID:334343 發(fā)表于 2018-12-19 21:39
求大神幫忙啊

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表