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条回答
dingzy_2002
1楼-- · 2019-03-25 21:03
程序中e%2==1是什么含义?未看到e%2的定义
木瓜舟舟
2楼-- · 2019-03-25 23:48
 精彩回答 2  元偷偷看……
strong161
3楼-- · 2019-03-26 03:46
本帖最后由 strong161 于 2017-10-3 14:21 编辑

代码要这样贴更能看清楚
  1. /*********PIC16F54控制数码管显示,电机调速**********/
  2. #include <pic.h>
  3. __CONFIG(HS&WDTDIS);

  4. #define DAT RB3
  5. #define CLK RB1

  6. #define S2  RA0
  7. #define S5  RB4
  8. #define S6  RB0
  9. #define S7  RB7
  10. #define S4  RA2
  11. #define S3  RA1
  12. #define OUT RB5

  13. unsigned char time_num;
  14. unsigned char speed_num;
  15. unsigned char display_flag;
  16. unsigned char start;
  17. unsigned char e;
  18. unsigned int  x;
  19. unsigned int  B;
  20. long  A;
  21. // 显示0~9,由于此数码管管脚与74HC164 Q0-Q7管脚不是一一对应的,所以此码与正常的共阳极码表不一致
  22. unsigned char const tab[]={0x04,0x1f,0x48,0x0a,0x13,0x22,0x20,0x0f,0x00,0x02};
  23. //****1MS延时函数********
  24. void Delay(unsigned char us) //5,7,9
  25. { while(--us); }
  26. void DelayMS(unsigned int iMs)
  27. {
  28.    unsigned int i,j;
  29.   for(i=0;i<iMs;i++)
  30.      for(j=0;j<65;j++)
  31.      {
  32.         Delay(1);
  33.       }
  34. }

  35. void senddata (unsigned char dd)
  36. {
  37.   unsigned char c;
  38.   CLK = 0;
  39.     for(c=0;c<8;c++)
  40.     {
  41.       CLK = 0;
  42.       if(dd&0x80)
  43.           DAT = 1;
  44.        else
  45.           DAT = 0;
  46.       CLK =1;
  47.       dd = dd<<1;
  48.     }
  49.     DAT = 0;
  50. }

  51. void page1()
  52. {
  53. senddata(0xfb);
  54. senddata(0xfb);
  55. }

  56. void page2()
  57. {
  58.   senddata(tab[time_num/10]);
  59.   senddata(tab[time_num%10]);
  60. }

  61. void page3()
  62. {
  63.   senddata(tab[0]);
  64.   senddata(tab[speed_num]);
  65. }
  66. void Ready_key()
  67. {
  68. if(S2==0)
  69.   {
  70.      DelayMS(80);
  71.      if(S2==0)
  72.        {
  73.           e++;
  74.           if(e%2==1)
  75.           {
  76.               start=1;
  77.               display_flag=2;
  78.            //  page2();
  79.            }         
  80.            else  
  81.             {
  82.                start=0;              
  83.             }
  84.           while(!S2);           
  85.         }
  86.    }
  87. if(start==1)
  88.   {
  89.     if(S3==0)
  90.     {
  91.        DelayMS(80);
  92.        if(S3==0)
  93.           {
  94.                display_flag=2;

  95.                time_num++;

  96.                if(time_num>=15)
  97.                     time_num=15;
  98.                 //page2();

  99.           }
  100.     }


  101.    if(S4==0)
  102.     {
  103.        DelayMS(80);
  104.        if(S4==0)
  105.           {
  106.                display_flag=2;
  107.                if(time_num>1)
  108.                     time_num--;
  109.                if(time_num<=1)
  110.                     time_num=1;
  111.                 //page2();

  112.           }
  113.     }
  114.    if(S7==0)
  115.     {
  116.        DelayMS(80);
  117.        if(S7==0)
  118.           {
  119.                display_flag=3;
  120.                speed_num++;
  121.                if(speed_num>=9)
  122.                     speed_num=9;
  123.               // page3();

  124.           }
  125.     }
  126.   if(S6==0)
  127.     {
  128.        DelayMS(80);
  129.        if(S6==0)
  130.           {   
  131.               display_flag=3;
  132.                 if(speed_num>0)
  133.                speed_num--;
  134.                if(speed_num<=0)
  135.                     speed_num=0;
  136.               // page3();

  137.           }
  138.     }
  139.   }
  140. }
  141. void display()
  142. {
  143.    switch(display_flag)
  144.    {
  145.       case 2:  page2(); break;
  146.       case 3:  page3(); break;
  147.    }
  148. }
  149. void main()
  150. {
  151.   TRISA=0xff;      //初始化RA5-RA0的输入输出方向
  152.   TRISB=0xd5;      //初始化RB7-RB0的输入输出方向
  153.   PORTA=0xff;      //初始化RA5-RA0数值
  154.   PORTB=0xd5;      //初始化RB7-RB0的数值
  155.    DelayMS(300);
  156.    speed_num=0;
  157.    time_num=15;
  158.     page1();
  159.   while(1)
  160.    {
  161.      Ready_key();
  162.      display();
  163.    }
  164. }
复制代码
strong161
4楼-- · 2019-03-26 04:15
没有用过PIC,你的程序好像就是直接输出高电平后,直接读的。直接应该来说很简单呀,你先单独试一下按健程序吧!
木瓜舟舟
5楼-- · 2019-03-26 05:33
木瓜舟舟 发表于 2017-10-3 11:00
您好,e%2==1,判断开关键按下是开还是关,一个按键控制开关两个状态

/*********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 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)
   {
     f(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();

          }
    }
  }
     switch(display_flag)
   {
      case 2:  page2(); break;
      case 3:  page3(); break;
   }
   }
}
木瓜舟舟
6楼-- · 2019-03-26 08:37
我把子程序里边的内容全写到主函数里,不在在主函数里调用子程序,按键就正常了,就是反应比较慢

一周热门 更多>