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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

51單片機(jī)C語(yǔ)言程序位置的不對(duì),導(dǎo)致的意外問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是個(gè)矩陣按鍵,按下任意一個(gè)按鍵,數(shù)碼管顯示從0-F的值。
單片機(jī)C語(yǔ)言源程序如下:
  1. #include<reg52.h>

  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. sbit KeyIn_1 = P2^7;
  8. sbit KeyIn_2 = P2^6;
  9. sbit KeyIn_3 = P2^5;
  10. sbit KeyIn_4 = P2^4;
  11. sbit KeyOut_1 = P2^3;
  12. sbit KeyOut_2 = P2^2;
  13. sbit KeyOut_3 = P2^1;
  14. sbit KeyOut_4 = P2^0;

  15. unsigned char code LedChar[16] = {                                         //數(shù)碼管真值表
  16.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  17.                 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  18. };

  19. unsigned char keyStatus[4][4] = {                                          //全部矩陣按鍵當(dāng)前的狀態(tài)
  20.     {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
  21. };


  22. void main(){
  23.     unsigned char i,j;
  24.     unsigned char cnt = 0;
  25.     unsigned char backUp[4][4] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}}; //按鍵狀態(tài),保存前一次的值

  26.     EA = 1;
  27.     ENLED = 0;
  28.     ADDR3 = 1;
  29.     ADDR2 = 0;
  30.     ADDR1 = 0;
  31.     ADDR0 = 0;
  32.     TMOD = 0x01;
  33.     TH0 = 0xFC;
  34.     TL0 = 0x67;
  35.     ET0 = 1;
  36.     TR0 = 1;
  37.         P0 = LedChar[cnt];
  38.                         
  39.     while(1){
  40.         for(i = 0; i < 4; i++){
  41.             for(j = 0;j < 4; j++){
  42.                 if(backUp[i][j] != keyStatus[i][j]){
  43.                     if(backUp[i][j] == 0){ //按鍵抬起
  44.                     cnt++;
  45.                     if(cnt >= 16){
  46.                         cnt = 0;
  47.                     }
  48.                     P0 = LedChar[cnt];
  49.                     }
  50.                     backUp[i][j] = keyStatus[i][j];
  51.                 }
  52.             }
  53.                 }   
  54.         }
  55. }
  56. /*T0中斷服務(wù)函數(shù),判斷按鍵狀態(tài)并消抖*/
  57. void interruptTimer0() interrupt 1{
  58.     unsigned char i;
  59.     static unsigned char keyOut = 0;
  60.     static unsigned char keyBuff[4][4] = {
  61.         {0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}          //矩陣按鍵掃描緩沖區(qū)
  62.     };  

  63.     TH0 = 0xFC;
  64.     TL0 = 0x67;
  65.     keyBuff[keyOut][0] = (keyBuff[keyOut][0] << 1) | KeyIn_1;  //按位與,將KeyIn_1的最后一位移入緩沖區(qū)。按位與的結(jié)果:最后1位是0就移入0,是1就移入1。
  66.     keyBuff[keyOut][1] = (keyBuff[keyOut][1] << 1) | KeyIn_2;  //按位與,將KeyIn_2的最后一位移入緩沖區(qū)。按位與的結(jié)果:最后1位是0就移入0,是1就移入1。
  67.     keyBuff[keyOut][2] = (keyBuff[keyOut][2] << 1) | KeyIn_3;  //按位與,將KeyIn_3的最后一位移入緩沖區(qū)。按位與的結(jié)果:最后1位是0就移入0,是1就移入1。
  68.     keyBuff[keyOut][3] = (keyBuff[keyOut][3] << 1) | KeyIn_4;  //按位與,將KeyIn_4的最后一位移入緩沖區(qū)。按位與的結(jié)果:最后1位是0就移入0,是1就移入1。
  69.     //更新消抖狀態(tài)
  70.     for(i = 0; i <= 3 ; i++){
  71.         if((keyBuff[keyOut][i] & 0x0F) == 0x00){
  72.             keyStatus[keyOut][i] = 0;
  73.         }
  74.         else if((keyBuff[keyOut][i] & 0x0F) == 0x0F){
  75.             keyStatus[keyOut][i] = 1;
  76.         }
  77.     }
  78.     //執(zhí)行下一次的掃描輸出
  79.     keyOut++;
  80.     if(keyOut > 4){
  81.         keyOut = 0;
  82.     }
  83.     //根據(jù)索引keyOut,釋放當(dāng)前輸出引腳,拉低下次的輸出引腳。
  84.     switch(keyOut){
  85.         case 0: KeyOut_4 = 1; KeyOut_1 = 0; break;
  86.         case 1: KeyOut_1 = 1; KeyOut_2 = 0; break;
  87.         case 2: KeyOut_2 = 1; KeyOut_3 = 0; break;
  88.         case 3: KeyOut_3 = 1; KeyOut_4 = 0; break;
  89.         default: break;
  90.     }

  91. }
復(fù)制代碼


問(wèn)題:其中這段代碼放在switch的前面,有一排按鍵按下,數(shù)碼管就一直在累加。
雖然keyOut初始值為0,++一次為1,錯(cuò)過(guò)了keyOut為0的判斷,但是KeyOut加到4的時(shí)候,就置0了,下一輪,case0就可以覆蓋的到。

  1. //執(zhí)行下一次的掃描輸出
  2. keyOut++;
  3. if(keyOut > 4){
  4. keyOut = 0;
  5. }
復(fù)制代碼

這段代碼放到switch后就ok了,但是邏輯上我 實(shí)在不明白為什么放在前面就不可以。求各位大神給指點(diǎn)一下,答疑解惑!


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

使用道具 舉報(bào)

沙發(fā)
ID:1034164 發(fā)表于 2022-6-12 19:17 | 只看該作者
為了方便格式化 閱讀,我生成了代碼的圖片

回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2022-6-13 06:05 | 只看該作者
xcopter 發(fā)表于 2022-6-12 19:17
為了方便格式化 閱讀,我生成了代碼的圖片

發(fā)生錯(cuò)誤的根本原因是代碼錯(cuò)誤,改變代碼位置只是改變發(fā)生錯(cuò)誤的矩陣行。
錯(cuò)誤:if(keyOut > 4)
正確:if(keyOut >= 4) 或 if(keyOut > 3)
回復(fù)

使用道具 舉報(bào)

地板
ID:688692 發(fā)表于 2022-6-13 09:02 | 只看該作者
轉(zhuǎn)成就成圖看看

回復(fù)

使用道具 舉報(bào)

5#
ID:979299 發(fā)表于 2022-6-13 11:54 | 只看該作者
條件表達(dá)式語(yǔ)句,動(dòng)作里面沒(méi)有包括switchy語(yǔ)句,放到前后都沒(méi)有作用。
這個(gè)格式是java語(yǔ)言寫(xiě)法吧
| 這個(gè)管道符在這里是按位或啊
回復(fù)

使用道具 舉報(bào)

6#
ID:275826 發(fā)表于 2022-6-13 15:53 | 只看該作者
這個(gè)程序代碼長(zhǎng),內(nèi)存大,不好
回復(fù)

使用道具 舉報(bào)

7#
ID:428114 發(fā)表于 2022-6-13 17:52 | 只看該作者
// 執(zhí)行下一次的掃描輸出
        keyOut++;
        
       if(keyOut > 4)
       {
            keyOut = 0;
        }
=======================
這個(gè)是要給下一次掃描處理的吧?


    switch(keyOut)
   {
    ....
   }
====================
這個(gè)switch處理的是keyOut當(dāng)前值


要先處理當(dāng)前的,然后再考慮下一個(gè),邏輯要清楚啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本在线小视频 | 男女污污动态图 | 红桃视频一区二区三区免费 | 亚洲一av | 欧州一区二区 | 一区二区三区亚洲 | 国产成人福利在线 | 一片毛片 | 午夜精品一区 | 亚洲综合在线视频 | 日韩精品一区二区三区免费视频 | 日韩三级在线 | 91免费观看 | 成人免费视频网站在线看 | 日韩精品久久一区二区三区 | 日本小电影在线 | 久久99精品久久久久 | 亚洲97 | 在线观看精品视频网站 | 午夜激情视频在线 | 在线观看中文字幕dvd播放 | 日韩国产精品一区二区三区 | 成人免费视频一区 | 久久99精品久久久久久国产越南 | 午夜丁香视频在线观看 | 一区二区三区韩国 | 91精品国产综合久久久密闭 | 日本视频在线 | 夜夜草| 一级欧美一级日韩片免费观看 | 欧美精品日韩精品国产精品 | 亚洲视频在线观看 | 亚洲高清一区二区三区 | 免费在线观看黄网站 | 亚洲一区二区三 | 黑人一级片视频 | 丁香婷婷在线视频 | 国产成人99久久亚洲综合精品 | 亚洲欧美国产精品久久 | 成年人在线视频 | 精品国产一区二区久久 |