久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2013|回復: 8
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
主程序:
  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. }
復制代碼


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

使用道具 舉報

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

使用道具 舉報

板凳
ID:213173 發表于 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};//共陽極數碼管顯示的從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或者換個變量類型
回復

使用道具 舉報

5#
ID:964308 發表于 2021-11-22 15:00 來自手機 | 只看該作者
建議是清零,換變量類型一個不小心就出錯
回復

使用道具 舉報

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

使用道具 舉報

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

哇,明白了
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区日韩 | 人人爽日日躁夜夜躁尤物 | 99精彩视频 | 欧美视频精品 | 一级大片免费 | 国产精品1| av毛片在线免费观看 | 在线色 | 亚洲韩国精品 | 国产高清视频一区 | 久久青青| 日韩中文字幕2019 | 国产高清在线观看 | 日韩中文一区二区三区 | 天堂一区二区三区四区 | 欧美精三区欧美精三区 | 成人动漫视频网站 | 欧美激情一区二区 | 精品一区二区三区免费视频 | 韩国av一区二区 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 天堂在线www| 午夜精品久久久久久久久久久久久 | 久久99精品久久久久久 | 国产一区中文 | 欧洲一区在线观看 | 日韩小视频| 毛片一级黄色 | 亚洲啪啪| 日韩成人精品一区 | av入口 | 欧美日韩精品一区二区三区四区 | 久久久精品视频一区二区三区 | 久久国内精品 | 精品久久国产 | 狠狠涩 | 亚洲免费视频网站 | 亚洲免费在线 | 老外几下就让我高潮了 | 91免费视频 | av中文字幕在线观看 |