找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1255|回复: 8
收起左侧

大佬帮我看看单片机按键程序 为啥我的加一按键按下后,不受控制疯狂加一

[复制链接]
ID:982620 发表于 2021-11-19 19:26 | 显示全部楼层 |阅读模式
主程序:
  1. # include <reg51.h>
  2. #include "key.h"
  3. #include "display.h"
  4. #include "delay.h"
  5. void main()
  6. {
  7.         unsigned int Numcon;
  8.         
  9.    while(1)
  10.   {
  11.                 LEDBuf[0]=Numcon/1000;
  12.           LEDBuf[1]=Numcon/100%10;
  13.           LEDBuf[2]=Numcon/10%10;
  14.                 LEDBuf[3]=Numcon%10;
  15.                 switch(Key_Scan())
  16.                 {
  17.                         case 0 :break;
  18.                   case 1 :if(Numcon > 9999) Numcon=0;else Numcon++ ;break;
  19.                   case 2 :Numcon--;if(Numcon > 9999) Numcon=9999; break;
  20.                   case 3 :Numcon=0; break;
  21.                   case 4 :Numcon=88; break;
  22.                         default: break;
  23.                 }
  24.                 Disply();
  25.   }
  26.         
  27. }

  28. 按键识别子程序
  29. #include "key.h"
  30. #include "delay.h"
  31. unsigned char  Key_Scan()
  32. {
  33. static KeyNum=0;
  34.   /* if(0==key1)      //判断是否有按键按下
  35.   {
  36.      DelayXms(10); //延时消抖
  37.      if(0==key1)  //再次判断按键是否按下
  38.      {
  39.       KeyNum=1;   //对按键赋值,此时不做功能处理
  40.      } while(0==key1);//按键的松手等待
  41.    }
  42.         

  43.          if(0==key2)      //判断是否有按键按下
  44.   {
  45.      DelayXms(10); //延时消抖
  46.      if(0==key2)  //再次判断按键是否按下
  47.      {
  48.       KeyNum=2;   //对按键赋值,此时不做功能处理
  49.      } while(0==key2);//按键的松手等待
  50.    }
  51. if(0==key3)      //判断是否有按键按下
  52.   {
  53.      DelayXms(10); //延时消抖
  54.      if(0==key3)  //再次判断按键是否按下
  55.      {
  56.       KeyNum=3;   //对按键赋值,此时不做功能处理
  57.      } while(0==key3);//按键的松手等待
  58.    }
  59.         

  60.          if(0==key4)      //判断是否有按键按下
  61.   {
  62.      DelayXms(10); //延时消抖
  63.      if(0==key4)  //再次判断按键是否按下
  64.      {
  65.       KeyNum=4;   //对按键赋值,此时不做功能处理
  66.      } while(0==key4);//按键的松手等待
  67.    }*/
  68.          if(!key1||!key2||!key3||!key4)
  69.          {
  70.                  DelayXms(10);
  71.          if(!key1||!key2||!key3||!key4)
  72.                 {
  73.                  if(!key1)
  74.                    KeyNum=1;
  75.                  if(!key2)
  76.                    KeyNum=2;
  77.                  if(!key3)
  78.                    KeyNum=3;
  79.                  if(!key4)
  80.                    KeyNum=4;
  81.           }while(!key1||!key2||!key3||!key4);
  82.    }
  83.   return KeyNum;

  84. 数码管显示程序:
  85. #include "display.h"
  86. #include "delay.h"

  87. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  88. unsigned char  LEDBuf[]={8,8,8,8};//数据显示缓冲区
  89. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器

  90. void Disply()
  91. {
  92.         unsigned char i;
  93.         //送位选
  94.         DPIO_PLACE=PLACE_CODE[i];
  95.         //送段码
  96.         DPIO_DIG =LED[LEDBuf[i]];
  97.         //延时
  98.         DelayXms(1);
  99.         //消影
  100.         i++;
  101.         if(N==i)
  102.         i=0;
  103. }
复制代码


回复

使用道具 举报

ID:86926 发表于 2021-11-20 08:21 | 显示全部楼层
调用Key_Scan()函数先清零KeyNum再去获取键值就好了,KeyNum定义的是static,这个变量会一直保持原来的值,并不会被清零。所以每次调用扫描函数即使没有按键按下KeyNum都会有键值。
回复

使用道具 举报

ID:213173 发表于 2021-11-20 11:11 | 显示全部楼层
无标题.jpg
  1. #include <reg51.h>

  2. #define DPIO_DIG P0
  3. #define DPIO_PLACE P2

  4. sbit key1=P3^0;
  5. sbit key2=P3^1;
  6. sbit key3=P3^2;
  7. sbit key4=P3^3;

  8. unsigned char  code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0x39,0xff};//共阳极数码管显示的从0~c,即段码,最后一个表示全灭
  9. unsigned char  LEDBuf[]={8,8,8,8};//数据显示缓冲区
  10. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位选的数组,同时放在rom存储器
  11. unsigned char KeyNum=0;
  12. unsigned int  Numcon=0;

  13. void DelayXms(unsigned int t)
  14. {
  15.         unsigned int i,j;
  16.         for(i=t;i>0;i--)
  17.                 for(j=120;j>0;j--);
  18. }

  19. void Key_Scan()
  20. {
  21.         static unsigned char i;
  22.         static bit sign=0;
  23.         if(!key1||!key2||!key3||!key4)
  24.         {       
  25.                 if(++i>=10 && sign==0)
  26.                 {
  27.                         sign=1;
  28.                         if(!key1)KeyNum=1;
  29.                         if(!key2)KeyNum=2;
  30.                         if(!key3)KeyNum=3;
  31.                         if(!key4)KeyNum=4;
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 i=0;
  37.                 sign=0;
  38.         }
  39. }

  40. void Disply()
  41. {
  42.         static unsigned char i;
  43.         DPIO_DIG=0xff;//消隐       
  44.         DPIO_PLACE=PLACE_CODE[i];//送位选       
  45.         DPIO_DIG =LEDBuf[i];//送段码
  46.         i=++i%4;
  47. }
  48. void main()
  49. {

  50.         while(1)
  51.         {
  52.                 Key_Scan();
  53.                 switch(KeyNum)
  54.                 {
  55.                         case 1 :if(Numcon<9999)Numcon++;KeyNum=0;break;
  56.                         case 2 :if(Numcon>0)Numcon--;KeyNum=0;break;
  57.                         case 3 :Numcon=0;KeyNum=0;break;
  58.                         case 4 :Numcon=88;KeyNum=0;break;
  59.                 }
  60.                 LEDBuf[0]=LED[Numcon/1000%10];
  61.                 LEDBuf[1]=LED[Numcon/100%10];
  62.                 LEDBuf[2]=LED[Numcon/10%10];
  63.                 LEDBuf[3]=LED[Numcon%10];
  64.                 Disply();
  65.                 DelayXms(1);
  66.         }
  67. }
复制代码



回复

使用道具 举报

ID:964308 发表于 2021-11-22 14:58 来自手机 | 显示全部楼层
本来还以为是没消抖来着,原来是变量的问题,你的keynum用的是static静态变量,如果你已经按下了,keynum=1,而你的函数又是while,所以即使没按下按键,也会一直读取到keynum=1,然后就会疯狂加了,建议return后keynum=0或者换个变量类型
回复

使用道具 举报

ID:964308 发表于 2021-11-22 15:00 来自手机 | 显示全部楼层
建议是清零,换变量类型一个不小心就出错
回复

使用道具 举报

ID:982620 发表于 2021-12-1 22:08 | 显示全部楼层
回复

使用道具 举报

ID:982620 发表于 2021-12-1 22:40 | 显示全部楼层
dzc3458 发表于 2021-11-22 14:58
本来还以为是没消抖来着,原来是变量的问题,你的keynum用的是static静态变量,如果你已经按下了,keynum= ...

哇,明白了
回复

使用道具 举报

ID:783421 发表于 2021-12-12 10:40 | 显示全部楼层
变量的问题
回复

使用道具 举报

ID:883242 发表于 2021-12-12 14:49 | 显示全部楼层
在Key_Scan()函数内部,变量定义后面,任何实体语句之前加一句KeyNum=0;
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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