找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1732|回复: 6
收起左侧

单片机倒计时程序设计问题,键盘加不进去 求大神解答,

[复制链接]
ID:334343 发表于 2018-12-19 14:22 | 显示全部楼层 |阅读模式
设计倒计时程序,要求按1,10秒倒计时,按2,20秒倒计时。我写了倒计时程序但键盘加不进去。求大神解答,可酬金答谢
    说明:P0段选,P2位选。共阳极数码管

#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++;                                                   //定时器         
}

回复

使用道具 举报

ID:334343 发表于 2018-12-19 21:39 | 显示全部楼层
求大神帮忙啊
回复

使用道具 举报

ID:186249 发表于 2018-12-19 22:52 | 显示全部楼层
把按键程序放到 while 里啊
回复

使用道具 举报

ID:213173 发表于 2018-12-20 08:56 | 显示全部楼层
给你改用5ms查询方法完成动态数码管显示和倒计时,用开发板的矩阵键盘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;//开发板矩阵键盘模拟地
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;        //静态-按键自锁标志
        static unsigned char count1,count2;//静态-消抖计数变量                       
        if(!key1)                                                //按键1按下
        {
                //   10ms消抖          自锁长按无效       倒计时中锁定按键无效
                if((++count1>=2)&&(key1_sign==0)&&(num1==0))
                {                       
                        key1_sign=1;        //按键1自锁标志置1
                        num1=10;                        //倒计时变量赋值
                        num2=0;                        //计时变量清0
                }
        }
        else                                         //按键1抬起
        {
                key1_sign=0;                        //按键1自锁标志清0
                count1=0;                                //消抖计数1清0
        }

        if(!key2)                                        //按键2按下
        {
                if((++count2>=2)&&(key2_sign==0)&&(num1==0))
                {                       
                        key2_sign=1;        //按键2自锁标志置1
                        num1=20;
                        num2=0;
                }
        }
        else                                        //按键2抬起
        {
                key2_sign=0;                        //按键2自锁标志清0
                count2=0;                                //消抖计数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)//查询定时器中断溢出标志
                {
                        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:334343 发表于 2018-12-20 20:57 | 显示全部楼层
wsxujn 发表于 2018-12-19 22:52
把按键程序放到 while 里啊

谢大佬啊,点醒了我,有点效果了,我在小改一下。
回复

使用道具 举报

ID:334343 发表于 2018-12-20 21:02 | 显示全部楼层
wulin 发表于 2018-12-20 08:56
给你改用5ms查询方法完成动态数码管显示和倒计时,用开发板的矩阵键盘P3.7模拟地可以成为4个独立按键。
#i ...

谢,大佬,但是没看太懂,而且我们在仿真板上做的实验
6.png
回复

使用道具 举报

ID:334343 发表于 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)          //段选位选控制函数
{      
   P0=table[shi];  
   P2=0x7f;
   delay(5);
   P0=table[ge];
   P2=0xbf;   
   delay(5);
  }                                                         
main()                      //主函数
{  
   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++;
}                                                         
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表