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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機講義12:矩陣按鍵

[復制鏈接]
跳轉到指定樓層
樓主
第12講 矩陣按鍵
知識點:
1、 單片機程序的一般結構
2、 keil 基本使用
3、 單片機識別按鍵的注意點
4、 識別矩陣按鍵的一種方法


一、單片機程序的一般結構
1、前后臺結構 前后臺結構是最常用的結構。所謂前后臺結構就是主循環+中斷的方式,主
循環稱為后臺,前臺就是中斷程序。主循環用 while(1)或其它死循環結構輪詢
任務,而前臺負責處理實時性要求較高的任務,或者外部中斷任務,一般把按鍵 掃描、顯示掃描放在定時中斷里。
2、占用式程序與非占用式程序
凡是用 while、for 等循環語句實現的程序都稱為占用式程序。占用式程序的特 點是 CPU 必須執行完所有的循環任務才能退出,除非有中斷發生,比如我們做的 獨立按鍵處理程序就是占用式程序。在單片機程序設計中要盡量避免設計占用式 程序。與其相對應的是非占用式程序,非占用式程序能提高 CPU 的使用效率,讓 所有的任務都能及時得到響應。
二、keil 基本使用
1、點擊工程文件圖標,進入源代碼編輯區。
2、保存、編譯、生成 hex 文件
3、下載、運行

三、單片機識別按鍵的注意點
識別哪個鍵被按下(通過讀取鍵碼的方式)、識別按鍵所處的狀態(有效方 式),常用的有效方式:抬起有效、按下有效、組合有效、長按有效等

四、識別矩陣按鍵的一種方法
矩陣式按鍵接法,是利用單片機的IO 口組成行與列,在行與列的每一個 交點處連接按鍵。故也稱為矩陣式按鍵。電路結構如下所示:
file:///Z:/TEMP/msohtmlclip1/01/clip_image002.jpg
這種按鍵的識別方法,我們會在第 5 個知識點上詳細講解。


五、單片機識別按鍵的一般思路:

一般情況下,單片機識別按鍵的目的是識別當前按鍵的狀態,意 思就是說,一要識別是哪個鍵動作了(鍵碼),還要識別當前按鍵 是何狀態,也稱為有效方式,當然了這里的狀態大多是與時間有關的,并執行相應的動作。比如,開發板上獨立式按鍵實驗,當按鍵

按下并抬起時,LED 被點亮。這是最簡單的識別。因為是一支按鍵,所以不用識別是哪個鍵被按下,只需識別按鍵的狀態。一般的按鍵 狀態有以下幾種:按下,抬起,長按,組合,長按多長時間等等。

一個完整的按鍵動作必須包含下面四個階段: 按鍵按下-à按下消抖-à按鍵抬起-à抬起消抖 在單片機與按鍵接口程序中,往往先進行按下消抖,而對按鍵狀態的 判斷就是指按鍵處理了。這里的按鍵處理不是執行相應的動作,而是 區分按鍵此刻處于何種狀態,并改變相應狀態變量的值,以便程序其 它地方通過檢測相應的按鍵狀態變量去執行相應的動作。比如,我們可以把按下并抬起的短按點亮 LED,改成長按一段時間點亮 LED。總的來講,單片機識別按鍵就分為三個階段:按鍵消抖---按鍵處理---


按鍵執行。這個思路適用于所有形式的按鍵。至于為什么要消抖?是 因為我們在操作按鍵時,不可能立即按下或抬起,機械式按鍵接觸面 不是立刻就接觸或斷開的,而單片機的檢測速度特別快,這樣往往會 發生誤判,因此,我們要等待電平穩定了,再去處理按鍵。消抖的方 式很簡單,就是利用延時,等待一個穩定電平的到來。

六、識別行列式按鍵的一種方法
H:表示行;L:表示列;


  L0 P13
  L1 P12
  L2 P11
  L3 P10
   
  H0  P17
  0
  1
  2
  3
   
  H1  P16
  4
  5
  6
  7
   
  H2  P15
  8
  9
  10
  11
   
  H3  P14
  12
  13
  14
  15
   






我們先測試列,測試列時,把行控 IO 設置為 0,列空IO 設置為 1
即:P1 = 0X0F;此時若有按鍵被按下,我們可以得到 4 組編碼:
0X07,0X0B,0X0D,0X0E;每一組又對應列的四個按鍵。然后我們再測試行:P1 = 0XF0;又可以得出四個按鍵編碼,這樣就可以判斷是哪個鍵被按下了。這里依然是抬起有效。




這是以前給小學生培訓單片機做的一套講義,盡可能的做到了通俗易懂,現分享給大家,絕對的純原創資料.
全部資料下載地址(共15章,pdf格式):http://www.zg4o1577.cn/bbs/dpj-98524-1.html









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

使用道具 舉報

沙發
ID:435312 發表于 2018-12-2 19:01 | 只看該作者
學習一下
回復

使用道具 舉報

板凳
ID:508017 發表于 2019-5-11 19:56 | 只看該作者
給小學生培訓的,,慚愧啊
回復

使用道具 舉報

地板
ID:887908 發表于 2021-3-3 09:50 | 只看該作者
怎樣下載學習一下呢?
回復

使用道具 舉報

5#
ID:1017814 發表于 2022-4-16 15:02 | 只看該作者
我的按鍵掃描程序如下,講老大們給于評判。
unsigned char key_scan()
{
        hang1=0;
        hang2=1;
        hang3=1;
        hang4=1;
        if(lie1==0)                                //right         15
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'R'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //up                14
        {
                 key_delay();
                if(lie2==0)
                {
                   return 'U'+'\0';
                }
                while(lie2==0);
        }
        if(lie3==0)                                //down           13
        {
                 key_delay();
                if(lie3==0)
                {
                   return 'D'+'\0';
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //left           12
        {
                 key_delay();
                if(lie4==0)
                {
                   return 'L'+'\0';
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=0;
        hang3=1;
        hang4=1;
        if(lie1==0)                                //ok
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'Y'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //9
        {
                 key_delay();
                if(lie2==0)
                {
                   return 9;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //3
        {
                 key_delay();
                if(lie3==0)
                {
                   return 3;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //6
        {
                 key_delay();
                if(lie4==0)
                {
                   return 6;
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=1;
        hang3=0;
        hang4=1;
        if(lie1==0)                                //0
        {
                 key_delay();
                if(lie1==0)
                {
                   return 0;
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //8
        {
                 key_delay();
                if(lie2==0)
                {
                   return 8;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //2
        {
                 key_delay();
                if(lie3==0)
                {
                   return 2;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //5
        {
                 key_delay();
                if(lie4==0)
                {
                   return 5;
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=1;
        hang3=1;
        hang4=0;
        if(lie1==0)                                //ESC
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'N'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //7
        {
                 key_delay();
                if(lie2==0)
                {
                   return 7;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //1
        {
                 key_delay();
                if(lie3==0)
                {
                   return 1;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //4
        {
                 key_delay();
                if(lie4==0)
                {
                   return 4;
                }
                while(lie4==0);
        }
        return 0xff;                   
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久看片 | 亚洲成人精品在线观看 | 国产91在线 | 中日 | 日本精品久久久久久久 | 亚洲五码在线 | 欧美精品被 | 午夜视频大全 | 色婷婷av一区二区三区软件 | 亚洲 欧美 日韩 在线 | 亚洲电影一级片 | 天堂视频一区 | 日韩精品av一区二区三区 | 一区二区三区亚洲 | 欧美一区二区三区电影 | 亚洲综合视频一区 | 亚洲小视频在线观看 | 国产91在线 | 亚洲 | 欧美性受xxx| 91视频网址 | 天天色官网 | 一区二区三区国产好的精 | 夜夜爽99久久国产综合精品女不卡 | 日韩精品一区二区三区中文字幕 | 午夜一区二区三区视频 | 国产成人在线播放 | 欧美三级视频 | 欧美一区二区大片 | 福利视频一区二区 | 一区二区成人 | 韩国主播午夜大尺度福利 | 在线国产中文字幕 | 国产91中文| 精品日韩欧美一区二区 | 日韩欧美在线观看一区 | 日韩精品久久一区二区三区 | 精品国产免费人成在线观看 | 欧美日批 | 中文字幕第一页在线 | 一级全黄视频 | 天天干天天操天天射 | 亚洲精久 |