找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2112|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

大佬幫我看看單片機(jī)按鍵程序 為啥我的加一按鍵按下后,不受控制瘋狂加一

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:982620 發(fā)表于 2021-11-19 19:26 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
主程序:
  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. 按鍵識(shí)別子程序
  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); //延時(shí)消抖
  37.      if(0==key1)  //再次判斷按鍵是否按下
  38.      {
  39.       KeyNum=1;   //對按鍵賦值,此時(shí)不做功能處理
  40.      } while(0==key1);//按鍵的松手等待
  41.    }
  42.         

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

  60.          if(0==key4)      //判斷是否有按鍵按下
  61.   {
  62.      DelayXms(10); //延時(shí)消抖
  63.      if(0==key4)  //再次判斷按鍵是否按下
  64.      {
  65.       KeyNum=4;   //對按鍵賦值,此時(shí)不做功能處理
  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. 數(shù)碼管顯示程序:
  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};//共陽極數(shù)碼管顯示的從0~c,即段碼,最后一個(gè)表示全滅
  88. unsigned char  LEDBuf[]={8,8,8,8};//數(shù)據(jù)顯示緩沖區(qū)
  89. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位選的數(shù)組,同時(shí)放在rom存儲(chǔ)器

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:86926 發(fā)表于 2021-11-20 08:21 | 只看該作者
調(diào)用Key_Scan()函數(shù)先清零KeyNum再去獲取鍵值就好了,KeyNum定義的是static,這個(gè)變量會(huì)一直保持原來的值,并不會(huì)被清零。所以每次調(diào)用掃描函數(shù)即使沒有按鍵按下KeyNum都會(huì)有鍵值。
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2021-11-20 11:11 | 只看該作者

  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};//共陽極數(shù)碼管顯示的從0~c,即段碼,最后一個(gè)表示全滅
  9. unsigned char  LEDBuf[]={8,8,8,8};//數(shù)據(jù)顯示緩沖區(qū)
  10. unsigned char  code PLACE_CODE[]={0x01,0x02,0x04,0x08};//存放位選的數(shù)組,同時(shí)放在rom存儲(chǔ)器
  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. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

地板
ID:964308 發(fā)表于 2021-11-22 14:58 來自觸屏版 | 只看該作者
本來還以為是沒消抖來著,原來是變量的問題,你的keynum用的是static靜態(tài)變量,如果你已經(jīng)按下了,keynum=1,而你的函數(shù)又是while,所以即使沒按下按鍵,也會(huì)一直讀取到keynum=1,然后就會(huì)瘋狂加了,建議return后keynum=0或者換個(gè)變量類型
回復(fù)

使用道具 舉報(bào)

5#
ID:964308 發(fā)表于 2021-11-22 15:00 來自觸屏版 | 只看該作者
建議是清零,換變量類型一個(gè)不小心就出錯(cuò)
回復(fù)

使用道具 舉報(bào)

6#
ID:982620 發(fā)表于 2021-12-1 22:08 | 只看該作者
回復(fù)

使用道具 舉報(bào)

7#
ID:982620 發(fā)表于 2021-12-1 22:40 | 只看該作者
dzc3458 發(fā)表于 2021-11-22 14:58
本來還以為是沒消抖來著,原來是變量的問題,你的keynum用的是static靜態(tài)變量,如果你已經(jīng)按下了,keynum= ...

哇,明白了
回復(fù)

使用道具 舉報(bào)

8#
ID:783421 發(fā)表于 2021-12-12 10:40 | 只看該作者
變量的問題
回復(fù)

使用道具 舉報(bào)

9#
ID:883242 發(fā)表于 2021-12-12 14:49 | 只看該作者
在Key_Scan()函數(shù)內(nèi)部,變量定義后面,任何實(shí)體語句之前加一句KeyNum=0;
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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