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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請大家幫忙分析一下這段鍵盤掃描單片機程序的執行過程

[復制鏈接]
跳轉到指定樓層
樓主
ID:476725 發表于 2019-5-21 19:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 Neighbor_John 于 2019-5-22 00:21 編輯

我學習到的鍵盤掃描是逐行或逐列掃描,而這段程序確不需要這么繁瑣。但是我感覺這段程序有很大的邏輯錯誤,因為假設按得第一個鍵,P1應為0xee,然而※那一段代碼得出的P1為0xfe,因此這段程序不可能實現,可我用仿真軟件實驗后證實程序是可行的,而且這段程序也沒有檢測按鍵是否放開的部分,可仿真出來沒有任何問題,求大神看看這程序究竟怎么解釋。

單片機源程序如下:
  1. void key()         //獨立按鍵程序
  2. {
  3.         static uchar key_new = 0,key_l;
  4.         key_can = 20;                   //按鍵值還原
  5.         P1 = 0x0f;                                       
  6.         if((P1 & 0x0f) != 0x0f)      
  7.         {
  8.                 delay_1ms(1);                     //按鍵消抖動
  9.                 if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  10.                 {                                                //確認是按鍵按下
  11.                         key_new = 0;
  12.                         key_l= (P1 | 0xf0);
  13.                 ※      P1 = key_l ;  
  14.                         switch(P1)
  15.                         {
  16.                                 case 0xee:  key_can = 1;  break;  //得到按鍵值
  17.                                 case 0xde:  key_can = 4;  break;   //得到按鍵值
  18.                                 case 0xbe:  key_can = 7;  break;   //得到按鍵值
  19.                                 case 0x7e:  key_can = 10;  break;   //得到按鍵值        

  20.                                 case 0xed:  key_can = 2;  break;  //得到按鍵值
  21.                                 case 0xdd:  key_can = 5;  break;   //得到按鍵值
  22.                                 case 0xbd:  key_can = 8;  break;   //得到按鍵值
  23.                                 case 0x7d:  key_can = 0;  break;   //得到按鍵值

  24.                                 case 0xeb:  key_can = 3;  break;  //得到按鍵值
  25.                                 case 0xdb:  key_can = 6;  break;   //得到按鍵值
  26.                                 case 0xbb:  key_can = 9;  break;   //得到按鍵值
  27.                                 case 0x7b:  key_can = 11;  break;   //得到按鍵值
  28.       
  29.                                 case 0xe7:  key_can = 15;  break;  //得到按鍵值
  30.                                 case 0xd7:  key_can = 14;  break;  //得到按鍵值
  31.                                 case 0xb7:  key_can = 13;  break;   //得到按鍵值
  32.                                 case 0x77:  key_can = 12;  break;  //得到按鍵值  
  33.                         }                       
  34.                                 beep = 0;
  35.                                 delay_1ms(20);
  36.                                 beep = 1;
  37.                  }
  38.         }
  39.                 else
  40.                 {
  41.                         key_new = 1;
  42.                  }                       
  43.       
  44. }
復制代碼


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

使用道具 舉報

沙發
ID:213173 發表于 2019-5-22 07:57 | 只看該作者
void key()         //不是獨立按鍵程序,是4*4矩陣按鍵掃描程序
{
        static uchar key_new = 0,key_l;
        key_can = 20;                   //按鍵值還原
        P1 = 0x0f;  
        if((P1 & 0x0f) != 0x0f)
        {
                delay_1ms(1);                     //按鍵消抖動
                //key_new是按鍵自鎖變量,防止按鍵重復響應,并做松手檢測
                if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
                {                                 //確認是按鍵按下
                        key_new = 0;
                        //假設按下第1鍵,此時讀取P1狀態是0000 1110
                        //P1|0xf0 邏輯運算后保留低4位不變,高4位置1
                        key_l= (P1 | 0xf0);//將結果保存在臨時變量中1111 1110
                        P1 = key_l ;  //將1111 1110賦值P1
                        switch(P1)        //此時讀取P1值為1110 1110 即0xee,其它鍵以此類推
                        {//提示:端口寄存器由于接受外部控制信號,讀取的狀態不一定是賦值的狀態!
                                case 0xee:  key_can = 1;  break;  //得到按鍵值
                                case 0xde:  key_can = 4;  break;   //得到按鍵值
                                case 0xbe:  key_can = 7;  break;   //得到按鍵值
                                case 0x7e:  key_can = 10;  break;   //得到按鍵值
                                ......
回復

使用道具 舉報

板凳
ID:476725 發表于 2019-5-25 14:07 | 只看該作者
wulin 發表于 2019-5-22 07:57
void key()         //不是獨立按鍵程序,是4*4矩陣按鍵掃描程序
{
        static uchar key_new = 0,key_l;

感謝解答。意思就是SWITCH語句判斷P1時不是根據P1的賦值是吧,那key_l的存在是不是沒什么意義,而且最后是怎么得到0xee的呢(如果按第一個鍵),我就是對這里很不明白。
回復

使用道具 舉報

地板
ID:511890 發表于 2019-5-25 16:03 | 只看該作者
Neighbor_John 發表于 2019-5-25 14:07
感謝解答。意思就是SWITCH語句判斷P1時不是根據P1的賦值是吧,那key_l的存在是不是沒什么意義,而且最后 ...

key_l是用來保持P1口的值的。按鍵一般是按下后就放開,也就是一瞬間的值。如果想要在按鍵松開后還要用到這個值的話,就要用一個變量來保存。
回復

使用道具 舉報

5#
ID:155507 發表于 2019-5-26 10:04 | 只看該作者
Neighbor_John 發表于 2019-5-25 14:07
感謝解答。意思就是SWITCH語句判斷P1時不是根據P1的賦值是吧,那key_l的存在是不是沒什么意義,而且最后 ...

4*4矩陣按鍵
       4  5  6  7
       |  |  |  |
3------+--+--+--+---
2------+--+--+--+---
1------+--+--+--+---
0------+--+--+--+---
       1  4  7  10 鍵

如果按第一個鍵, P1.0與P1.4連接,將1111 1110賦值P1,此時讀取P1值為1110 1110 即0xee,  因為P1.0與P1.4已經連接。
回復

使用道具 舉報

6#
ID:476725 發表于 2019-5-29 15:15 | 只看該作者
angmall 發表于 2019-5-26 10:04
4*4矩陣按鍵
       4  5  6  7
       |  |  |  |

明白了,謝謝
回復

使用道具 舉報

7#
ID:476725 發表于 2019-5-29 15:16 | 只看該作者
幻劍心 發表于 2019-5-25 16:03
key_l是用來保持P1口的值的。按鍵一般是按下后就放開,也就是一瞬間的值。如果想要在按鍵松開后還要用到 ...

明白了,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二区三区视频播放 | 中文欧美日韩 | 国产免费自拍 | 综合久久网 | yiren22 亚洲综合 | 久久精品久久久久久 | 在线视频 欧美日韩 | 国产精品一区二区av | 午夜成人在线视频 | 欧美11一13sex性hd | 国产精品视频在线观看 | 欧美性久久 | 九九热精品视频 | 在线观看视频福利 | 色婷婷综合久久久久中文一区二区 | 一区二区亚洲 | 五月天国产视频 | 五月婷婷丁香婷婷 | 国产精品一区一区三区 | 国产伦精品一区二区三区高清 | 欧美黑人巨大videos精品 | 精品成人av | av网站免费看| 国产你懂的在线观看 | 国产精品成人一区二区 | 欧美日韩国产一区二区三区 | 精品久久国产老人久久综合 | 91久久国产综合久久91精品网站 | 天天摸天天看 | 欧美成人一区二免费视频软件 | 欧美一区成人 | 久久久久久久一区二区 | 嫩呦国产一区二区三区av | 中文字幕不卡在线88 | 日本精品免费在线观看 | 国产a区| 亚洲精品9999久久久久 | 午夜爽爽爽男女免费观看影院 | 宅男伊人 | 美女视频久久 | 一区二区免费在线观看 |