PIC16F54按键扫描没反应

2019-03-25 18:43发布

我用PIC16F54做了个按键扫描切换数码管显示的程序,数码管采用74HC164驱动,显示程序测试过了,单独的每一页都能正常显示,但一加按键程序就没反应了,朋友们,帮忙看看到底是哪的问题。
/*********PIC16F54控制数码管显示,电机调速**********/
#include <pic.h>
__CONFIG(HS&WDTDIS);

#define DAT RB3
#define CLK RB1

#define S2  RA0
#define S5  RB4
#define S6  RB0
#define S7  RB7
#define S4  RA2
#define S3  RA1
#define OUT RB5



unsigned char time_num;
unsigned char speed_num;
unsigned char display_flag;
unsigned char start;
unsigned char e;
unsigned int  x;
unsigned int  B;
long  A;
// 显示0~9,由于此数码管管脚与74HC164 Q0-Q7管脚不是一一对应的,所以此码与正常的共阳极码表不一致
unsigned char const tab[]={0x04,0x1f,0x48,0x0a,0x13,0x22,0x20,0x0f,0x00,0x02};

//****1MS延时函数********

void Delay(unsigned char us) //5,7,9
{ while(--us); }

void DelayMS(unsigned int iMs)
{
   unsigned int i,j;
  for(i=0;i<iMs;i++)
     for(j=0;j<65;j++)
     {
        Delay(1);
      }
}

void senddata (unsigned char dd)
{
  unsigned char c;
  CLK = 0;
    for(c=0;c<8;c++)
    {
      CLK = 0;
      if(dd&0x80)
          DAT = 1;
       else
          DAT = 0;
      CLK =1;
      dd = dd<<1;
    }
    DAT = 0;
}

void page1()
{
senddata(0xfb);
senddata(0xfb);
}

void page2()
{
  senddata(tab[time_num/10]);
  senddata(tab[time_num%10]);
}

void page3()
{
  senddata(tab[0]);
  senddata(tab[speed_num]);
}
void Ready_key()
{
if(S2==0)
  {
     DelayMS(80);
     if(S2==0)
       {
          e++;
          if(e%2==1)
          {
              start=1;
              display_flag=2;
           //  page2();
           }         
           else  
            {
               start=0;              
            }
          while(!S2);           
        }
   }
if(start==1)
  {
    if(S3==0)
    {
       DelayMS(80);
       if(S3==0)
          {
               display_flag=2;

               time_num++;

               if(time_num>=15)
                    time_num=15;
                //page2();

          }
    }


   if(S4==0)
    {
       DelayMS(80);
       if(S4==0)
          {
               display_flag=2;

               if(time_num>1)
                    time_num--;
               if(time_num<=1)
                    time_num=1;
                //page2();

          }
    }
   if(S7==0)
    {
       DelayMS(80);
       if(S7==0)
          {
               display_flag=3;

               speed_num++;
               if(speed_num>=9)
                    speed_num=9;
              // page3();

          }
    }
  if(S6==0)
    {
       DelayMS(80);
       if(S6==0)
          {   
              display_flag=3;

                if(speed_num>0)
               speed_num--;
               if(speed_num<=0)
                    speed_num=0;
              // page3();

          }
    }


  }
}
void display()
{
   switch(display_flag)
   {
      case 2:  page2(); break;
      case 3:  page3(); break;
   }
}
void main()
{
  TRISA=0xff;      //初始化RA5-RA0的输入输出方向
  TRISB=0xd5;      //初始化RB7-RB0的输入输出方向
  PORTA=0xff;      //初始化RA5-RA0数值
  PORTB=0xd5;      //初始化RB7-RB0的数值

   DelayMS(300);


   speed_num=0;
   time_num=15;
    page1();
  while(1)
   {

     Ready_key();

     display();

   }
}































































友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
邱海涛qht
1楼-- · 2019-03-26 14:06
消抖的延时太长导致的,消抖80ms程序死循环在此处。试试用时间片轮来代替延时。
tiankai001
2楼-- · 2019-03-26 15:59
 精彩回答 2  元偷偷看……
tianle1010
3楼-- · 2019-03-26 21:22
可以考虑IO口中断啊。
chenbingjy
4楼-- · 2019-03-26 23:53
感觉延时20ms就可以了

一周热门 更多>