【哈爾濱工業大學】《單片機原理》(建議收藏) P25 - 25. 10.1-AT89S51與輸入輸出外部設備的接口(1)

长安书院_
146粉絲
1 次觀看·2026年9月10日
AI 生成·可能包含錯誤
今天我們介紹第十章
就是單片機和輸入輸出設備的接口設計
接口設計包括兩部分
一部分是軟件設計
一部分是硬件設計
首先大家要注意什麼叫輸入輸出設備
外設
這個就是我們常見的鍵盤顯示器打印機
就是人機對話接口
另外呢
結果顯示
大多數的單片運營系統
都要配置輸入輸出設備
輸入設備有什麼呢
鍵盤
BCD碼
撥盤
輸出有什麼呢
LED數碼管
LCD
就液晶顯示器
還有打印機
所以這一張呢
就介紹單片機
如何與這些輸入外設輸出外設的接口設計
還有軟件編程
首先我們看一下
單片機呢
最常接的外部設備是什麼呢
就輸出設備是LED數碼管
那麼LED是什麼意思呢
是發光RG管的縮寫
那麼LED數碼管呢
實際上它就由一個一個發光RG管構成的
首先我們看一下
LED數碼管的結構
常見的LED數碼管呢
是這樣的
八字形的
這個我們大家經常見到
你比如說
十字交通路口的那個剩餘時間
還有一些
你比如時鐘顯示
這都用的八字形的
它的形狀這是八
大家還要注意啊
這個地方
這個地方有小數點
小數點實際上也是一個發光RG管
所以常用的LED數碼管
大家注意
它是八字形的
一共八段
八段裏面包含小數點那一段
每一段都對應一個發光RG管
有兩種
一種是共陰極的
一種是共陽極的
好
這個就是
大家注意
它的共陰極連在一起
這個是共陰極的
那麼這些就各個段的符號
大家每一段
你比如數碼管A段B段C段D段E段F段G段
那麼對應的就A段B段C段D段
一直到G段
不要忘記啊
還有個小數點這一段
這個是共陰極的
就陰極點在一起
這個是共陽極的
它的陽極點在一起
大家想想
如果我想讓一個數碼管顯示不同的字符
你只要給這些各個段上
加上相應的電頻
控制發光二極管量
對應段的二極管量
就可以顯示不同的字符
大家看一看啊
如果我要讓它顯示四的話
F段量
G段量
B段量
C段量
所以一個LED數碼管
它實際上分爲兩種
一種共陰極
一種共陽極
然後給各個段加上相應的電頻
讓相應的發光二極管點亮
這樣就構成了不同的字符
這裏大家一定要清楚啊
八段指的是包括小數點也含在內
如果是七段的話
這個LED數碼管呢
就沒有這個小數點這一段
好
共陽極
共陰極
這個內部結構
大家都看清楚了
大家想一想啊
我只要用一個字節的數據
加到各個段
大家加到各個段的上面
控制相應發光二極管量
就可以顯示相應的字符
那麼如果我想顯示相應的字符符號和數字
就要把其中的某些二極管點亮
實際上就要讓你爲數碼管呢
提供相應的段碼
我們也把它叫做字形碼
因爲它是顯示不同字形的
另外大家要注意
這個數碼管一共八段
正好用一個字節
你比如輸出端口有八位
我送一個字節的數據
然後加到這八段上
那麼一般情況下
大家一定要注意啊
一般都以習慣上
以A段對應的那個段字節爲最低位
那麼各個段與字節當中對應的關係
字節當中各位對應的關係
最低位A段
次高位G段
就是ABCDEFG
小數點呢
一般都放在最高位
那麼這一個字節的數據
我們把去控制發光二極管點
就是顯示某一字符
那麼就需要給發光LED數碼管呢
加一個段碼啊
這個就是段碼
這裏大家一定要記住啊
一般習慣上A段對應的是最低位
那麼顯示各個不同字符的段
這個段碼是
我們看這個表啊
對於共陽
共陰極的顯示0的段碼
它是3F
共陰極顯示0的段碼是C0H
大家注意實際上就是
他們低起位是反的關係
對吧
最高位就小數點了啊
所以大家要這個表呢
大家要熟知就可以了
知道就可以了啊
這個表在我們以後軟件設計當中非常非常有用啊
好
那麼顯示0123456789
ABCDEFG
UTYHL或者不亮等等
那麼共陽級共陰極的段碼在這
所以你要控制LED數碼管顯示的時候呢
只要給它各個段加上相應的段碼
然後呢
那個公共段呢
你可以用軟件來控制
也可以接一個固定電瓶啊
所以這個LED段碼呢
大家要清楚
它實際上是控制數碼管顯示不同字符的一個字節的代碼
使用的時候呢
就要送到段碼端啊
控制LED數碼管顯示的段碼端
當然剛纔那個表我們只是列出了其中一部分的段碼
用戶都要根據裏面的根據你要顯示的字符自己來確定這個段碼啊
有可能不是表中的那些字符
除了剛纔說的八段的LED數碼管以外
還有呢
正負一型的
還有米字型的
大家看看米字型的
可以顯示26個英文字符啊
另外還有點陣型的啊
點陣型的
這是八乘八點陣
好
我們這一章主要以八段數碼管啊
八段數碼管爲例來進行介紹
單片機怎麼來控制LED數碼管顯示不同的字符
下面我們就看一下LED數碼管
你讓它顯示
那麼怎麼來控制它
就說控制數碼管的工作原理啊
大家看這是一個四位LED數碼管的這個結構原理圖
大家注意看啊
四位LED數碼管
每一個數碼管都有相應的
都有相應的那七段控制端
這個用單片機的IO口
或者你闊的IO接口芯片的IO口啊
來對段進行控制
讓它顯示不同的字符
至於說我讓哪一個量
可以對它的公共端進行控制
要不你可以直接
你比如供陽極的直接把陽極接到正午
也可以呢
用一個IO口輸出低電瓶高電瓶來控制
所以這個就是位選鍵
選擇哪一位量也叫位控端
好
這個是控制哪一個LED數碼管量與面
對應的各個數碼管那八段
控制這個數碼管顯示什麼字符
好
那麼這數碼管顯示有動態和靜態兩種
什麼叫靜態顯示呢
實際上就是把八段接到一個IO口
一般IO口的輸出都有鎖存功能
那我單片機網的IO口送一個段碼
送一個段碼
一個字節段碼
那麼這IO口有一代鎖存
送一次我就不管了
那麼這樣的話呢
這發光二級管呢
就一直LED數碼管一直都可以亮
那麼靜態顯示呢
大家注意
我儘管控制多個LED數碼管
它實際上都處於同時顯示狀態
實際上是我事先把要顯示這個段碼呢
送到IO口那
IO口有鎖存功能
那麼這些數碼管呢
當然同時在亮
送一次就行
送一次
好
那麼靜態顯示方式實際上就是把各個功能連在一起
然後呢
段碼線和一個8V的IO鎖存
大家知道單片機的P1口
就是最典型的IO口
帶鎖存的
或者我們上一張講的8255
那個ABC口都是帶鎖存的
實際上
每個數碼管的段碼分別和一個8位的IO端口相連
由於8位IO端口具有鎖存功能
所以呢
你單片機送到各個IO口的那個段碼
直接控制的這個發光二級管的LED數碼管顯示
同時總在那保持
原因就是那個IO口有鎖存功能
除非過了一會兒你再送一個新的
字符的段碼位置
所以你靜態顯示一個最大的特點呢
就是一個IO端口控制一個數碼管
然後送一次
往這個IO口送一次段碼
由於它具有鎖存功能
所以它一直在顯示那個字符
那麼靜態顯示方式的特點是什麼呢
它顯示沒有閃爍
你直接往裏一送就行
亮度當然是比較高的
另外呢
軟件編寫比較容易
因爲你控制的是靜態顯示
送一次段碼
讓它顯示字符
你就不用再送
因爲帶鎖存功能
好
那麼我們下面看一下
對靜態顯示的一個例子
它公共端
這供氧級的
公共端實際上已經接到正五足了
如果是供銀級的話呢
這一端接到D
那麼四個LED數碼管
每一個數碼管都有八段
分別連到一個IO口上
大家知道IO口都有鎖存功能
你用軟件往這個IO口裏面分別寫入
控制這個數碼管顯示的段碼
那麼就可以點亮這個LED數碼管
這個就是一個四位數碼管
靜態顯示的電路
實際上大家可以看到
這個電路特點是什麼呢
每一個數碼管都佔用一個八位的IO端口
這樣如果顯示的位數比較多
佔用的IO端口也就比較多
大家一定要注意這個
那麼這裏我們也可以體會到
我們第九章講的
單片機擴展IO接口芯片的
爲什麼要擴展IO接口芯片
我們這裏就能體會到
擴展IO接口芯片的意義
那麼靜態顯示
你只要每一個數碼管和IO口一連
IO口帶鎖存的
我單片機往那一送
某一個段碼
它就顯示相應的字符
這是一個四位靜態顯示的例子
那麼大家注意
這個靜態顯示方式編程非常簡單
往那端口送一個數據
但是呢
佔用的IO端口的口徑比較多
比較多
那麼另外呢
大家注意
如果你要是顯示的數碼管比位數比較多
大家想公共端實際上是各個
每一個數碼管裏面有八個LED
八個LED管
如果比較多的數碼管
這時候所需要的電流就比較大
這時候你設計電源的時候呢
就要考慮一下
那麼如果位數比較多
一般都採用動態顯示方式
就不採用靜態
下面我們介紹一下LED動態顯示
這個動態顯示啊
實際上就是在任何時刻
只有一個LED數碼管處於顯示狀態
其他各個發光管實際上都是處於滅的狀態
它是一個動態的
動態的
它實際上是單片機採用掃描工作方式來控制各個數碼管輪流點亮
下面我們大家看一個例子
看這個例子
這是微控轉
四個發光轉
實際上
我讓某一個數碼管顯示某一個字符
靠什麼來控制呢
靠斷碼
這個斷碼控制端怎麼連的呢
四個LED數碼管
它們的相應的段都是並聯的
然後連到一個八位的L端口
任意時刻
大家知道啊
單片機的L口
我用軟件指令往這L口寫
只能寫一個字節的斷碼
那這個斷碼呢
由於大家斷碼線都是並聯的
所以同時加到數碼管各個段上
那麼哪一個數碼管
我讓它亮呢
哪一個數碼管讓它亮呢
關鍵要考慮怎麼進行位控
所以這個就位控線
也叫位選線
我只讓其中的一位點亮
一位點亮
你就看這個共用端是共陽級
共陰級的
你要是共陽級的
你就接正午浮電源
你要是共陰級的就接地
好
那麼控制這個四個數碼管
我每次只亮一位
大家想想
我用眼睛同時看它們是在亮的話
那怎麼辦
你這個掃描速度就得快
一會兒讓第一個亮
一會兒讓第二個亮
它反覆來回掃描
當掃描的頻率足夠高的時候
由於發光2D管的餘暉效應
和人的眼睛的視覺轉流線
那麼你就會感覺到
這四個發光LED數碼管
同時在亮
但是呢
你得掃描頻率比較高
怎麼來進行掃描呢
你比如說這是共陰級的
我先讓這位危機電瓶
其他位高電瓶
然後下一個時刻呢
再讓它危機
其他三個位高
任意時刻只讓其中的一位危機電瓶
那麼你怎麼來控制
一個危機電瓶
其他位高電瓶呢
就用軟件
用程序來控制
很容易實現
當你掃描的速度非常快的時候
反覆這麼來回掃
你眼睛看起來
看這四個數碼管
就好像在同時顯示
但是大家注意啊
第一次你比如掃描
先讓它亮
怎麼辦呢
我加一個段碼
加到段碼呢
實際上這個段碼
同時加到數碼管的各個段上
四個數碼管上
但是我只讓這一位
你比如說共陰級的
讓它接地
用軟件控制
把它接一個L口線上
讓它危機電瓶
那麼只有它才能亮
其他就都不亮
下一次我再送一個段碼
就讓它顯示的段碼
那讓它危機電瓶
其他都爲高電瓶
那麼結果就它
一個數碼管亮
再下一次呢
再送一個段碼
讓它亮
顯示某一個字符
然後呢
這個加地電瓶
其他都爲高電瓶
那麼大家看一看啊
如果顯示的位數比較多
只需要增加位控線就可以了
段碼線呢
實際上大家都並聯的啊
這樣的話
動態顯示呢
它動態顯示方式
佔用的IO端口少
IO端口少啊
好
那麼佔用的IO端口少
大家注意
實際上是利用什麼呢
人的視覺暫留效應和
發光器管的移灰效應
那麼這些字符
雖然是在不同時刻出現
那麼你要快速掃描的話呢
就可以使人的眼睛看起來
好像它們同時在亮
當然這個掃描頻率
就是掃描的間隔呢
要根據實際情況來定
如果顯示位數比較多的話呢
這樣的話你要用軟件來控制的話
就佔用大量單片機時間
實際上大家注意啊
動態掃描的顯示實質
是以犧牲單片機的時間
來換取IO端口的減少
大家知道IO端口
我們單片機有限
如果越多的話呢
會需要外擴啊
下面看一個例子
下面這個圖呢
就是利用單片機控制八個LED數碼管
動態顯示2009.10.10
就是2009年10月10號
好
大家注意看一下啊
這是12345678
顯示2009年10月10號
具體呢
它是2009.10.10
那麼大家注意
它動態掃描過程是什麼樣呢
是這樣
它先讓它顯示0
0的話呢
大家注意
斷碼
這個是供應力的啊
3F
未控碼
大家注意
這是控制這八個LED數碼管的
是通過一個IO端口的輸出來控制的
你給那個未控的那個端口送個FE
FE就最低位零
那麼它就亮了
它就亮了
實際上這時候給那個最右邊那位數碼管
加一個未選通信號
是爲低
有效
它亮完了
再顯示1
那麼斷碼呢
06
那麼它的未控碼呢
送到IO端口的未控碼是FD
實際上就是讓它顯示1
再下一個應當顯示0點
大家注意
0點和0呢
就不一樣了
差了那個小數點啊
差了那個小數點
然後呢
再顯示0點
再下一時刻呢
顯示1
它是06H
再下一時刻呢
顯示9點
9點
大家注意
那就是它的斷碼呢
除了9以外
還要控制那個小數點
也要減量
好了
它掃描過程是什麼呢
不斷的讓它亮
再讓它亮
每一時刻只有一位亮
再讓它亮
掃描的速度比較快的話
你的眼睛就看着八個數碼管
好像同時在亮
好
那麼這種動態顯示的優點什麼呢
硬線電路比較簡單
大家看到剛纔那個斷板控制斷
實際上大家都並聯的
連到一個IO口
那麼你數碼管越多呢
你越節省了IO短口
但是缺點什麼呢
由於你是一位一位點亮
大家注意
一位一位點亮
只有那一瞬間點亮了
這樣的話呢
它的顯示亮度不如靜態顯示的亮度高
但是你要如果想讓這一位顯示的時間長點
你想讓它更亮一點
那麼掃描頻率就會低
掃描頻率會出現什麼情況呢
會出現閃爍現象
所以動態掃描和靜態掃描
這個大家要了解它的優缺點
設計一個系統的時候
往往你要外接LED數碼管
你這方案一定要考慮好
一定要考慮好
下面我們講鍵盤它的接口原理
我們剛纔講了LED數碼管的接口原理
那麼那是輸出設備
鍵盤的是常用的輸入設備
那麼我們用戶使用這個鍵盤呢
經常像單片機輸入數據呀
輸入個命令啊
實際上它是人與單片機人機對話的主要手段
好
下面我們就開始介紹鍵盤的工作原理和工作方式
那第一個問題
首先我們要明確鍵盤輸入應當解決哪些問題
也就是說鍵盤的任務是什麼
鍵盤的任務有三項
鍵盤的接口電路啊
第一
你要判別有沒有鍵按下去
如果有就進入第二步
沒有還在這步兜圈
那麼如果有鍵按下去
一定要識別出是哪一個鍵按下去
並且求出相應的鍵值
也就是說鍵號
然後第三步根據按下鍵的鍵號
跳到相應的這個鍵值或鍵號的處理程序入口
這個就是鍵盤接口所要解決的問題啊
這是鍵盤的任務啊
我們設計這個鍵盤接口呢
軟件要統一考慮
好
那麼鍵盤輸入有什麼特點
我按下這個鍵
要產生什麼樣的信號
大家要注意啊
首先我們先了解一下我們常見的鍵盤
有哪
有觸摸式的
這個現在大家都知道
摸摸鍵盤
還有按鍵式的鍵盤
一般的單片機系統裏面用的最多的是按鍵式的鍵盤
這個按鍵式的鍵盤
十指就是一個開關
大家看這個圖啊
這是鍵盤的航線
列線
然後這一個按鍵開關呢
連在航線和列線之間
如果按下去的話
航線和列線就短路
如果松開的話
航線和列線就沒有連接
那麼大家注意
要看一下
這時候啊
這時候
我們再看一下
如果列線接地
航線鍵按下去
或者沒按下去
它的信號是什麼樣
好
這個圖呢
是鍵盤的航線輸出電壓
那麼大家注意
航線現在接高電瓶
接高電瓶
列線呢
接地
如果按鍵沒有按下去
按鍵這時候就斷開
大家注意
這時候是高電瓶
航線的輸出是高電瓶
如果按下去
這時候航線的輸出
按下去以後呢
列線航線短路
它鍵壁和輸出爲低電瓶
如果這個鍵再鬆開
它又爲高電瓶
航線又爲高電瓶
航線電瓶
但是有一個什麼問題呢
這裏面
由於這個按鍵是鍵盤食指就開關
這實際上屬於一種機械式的按鍵開關
一摁
並不一定摁得死死的
就摁的話呢
由於它有機械觸點的斷開和閉合
那麼這個就抖動
就抖動
注意
當然有些同學說
我多吃一點食使勁
一使勁
就不要讓它有這個抖動
這也是由它的機械特性決定的
有這個抖動
反過來
你摁完以後
你再鬆開
它還是有一個抖動
所以大家注意
鍵盤這個地方出力的話
最關鍵問題
怎麼樣躲開這個抖動
否則容易造成誤判
爲什麼呢
因爲當鍵沒有按下去
它航線是高電瓶
鍵按下去以後呢
航線輸出電量爲低電瓶
但是在抖動這細節
一會兒高一會兒低
弄好一判斷
容易判斷錯了
容易造成錯判
所以呢
大家注意鍵盤這個工作原理
這裏最關鍵的
大家要知道
它有抖動
主要是由於它的觸點特性決定
好
大家看一看
這一段時間是T0
這抖動期是T1
這個抖動期呢
是T3
所以大家一定要知道鍵盤按下去
再鬆開
有兩個抖動
T1和T3
好
我們的鍵盤實驗
它就是一個
一鍵開關
那麼下面一個問題就是
我鍵按下去
我怎麼判別
然後呢
你判別確實有鍵按下去了
那麼鍵號
鍵號是多少
鍵號
所以呢
大家注意
我們要想正確的判斷出按鍵鍵號
一定得想辦法消除剛纔那個抖動區
抖動區T1和T3的影響
那麼現在問題就我們怎麼消除這個按鍵抖動
第一個辦法
就是軟件驗識
第二種辦法採用硬件的
驗識電路
就是去抖動電路
或者是採用專用的鍵盤顯示器芯片
專用鍵盤顯示器芯片
我們後面要介紹
那麼一般情況下
我們鍵盤比較簡單的時候
這時候去抖動採用軟件驗識
大家注意
它的基本思想是那樣
如果檢測到有鍵按下去
並且呢
這個鍵所對應的航線爲低電平
那麼你要經過十毫秒的驗識
大家注意
剛纔我們看到的這個波形
這一段時間
大概是五到十毫秒
這一段也是五到十毫秒
那好了
比如說我首先
判一下它爲低
航線輸出電量爲低
我驗識五到十毫秒
一般都驗識十毫秒
然後呢
再判這航線電平是不是爲低
如果仍爲低
說明這個鍵確實是按
如果不爲低
說明剛纔這個
你瞬間檢測到的低電平
有可能是外界干擾
對這個航線的干擾把它拉低
所以大家一定要注意這個問題
那麼第一種鍵盤去抖動的方法呢
就是
軟件驗識
那好了
它的基本思想
我檢測到爲低了
航線爲低
我軟件驗識十毫秒以後
再檢測這航線仍爲低
說明這個鍵確實已經按下去
反過來鬆開
也採用這種思路
也就是躲過那兩個抖動期
T1和T3
當然
你要採用專用的鍵盤顯示器芯片
一般有時候我們處理的鍵數比較多
你比如說六四個鍵
而且呢
控制的送拉管顯示也比較多
這時候你要考慮用專用的鍵盤顯示器
接口電路芯片
那麼專用的這個接口電路芯片呢
它裏面有去抖動的硬件邏輯
也就是說
有相應的去抖動的硬件聯絡
好
鍵盤的工作原理是這樣的
它分兩種
一種是非編碼鍵盤
一種是編碼鍵盤
非編碼鍵盤呢
實際上就是我們常見的剛纔那種方案
只要是把這個鍵盤的航線直接和IO口線相連
然後呢
根據要用軟件來判斷出是哪一個按鍵按下去
這是非編碼鍵盤
並不能直接得到按一下鍵的鍵號
這個大家一定要清楚
那麼
當然這非編碼鍵盤大多數都用在按鍵數量相對比較少的場合
那麼非編碼鍵盤呢
就說一下得不到編碼
但是你需要用軟件來判斷
你的鍵盤數目比較少
一般都採用這種非編碼鍵盤
那麼按鍵的信息是通過軟件來獲取的
你要編軟件
非編碼鍵盤我們先來介紹一下
它是兩種結構
一種是獨立式的鍵盤
一種是矩陣式的鍵盤
獨立式鍵盤呢
就一個鍵對應一根線IO口線
那麼各個鍵都是相互獨立的
實際上我們大家做的那個
給大家留的綜合性大作業系統裏面
都是採用的獨立式鍵盤
實際上你就檢測這IO口線
電瓶是高還是低
這樣的話呢
很容易判斷是哪個按鍵按下去
下面大家看這個例子
這是最常見的
當你外接的鍵盤少於八個的時候
這是最常採用的鍵盤接口方案
那大家看一看啊
這是八個按鍵
構成了一個八鍵盤
八個鍵的鍵盤
大家注意啊
每一個按鍵的一端
通過一個上拉電阻接到正五足
那麼大家注意
是爲了保證這個口線上
有一個穩定的高電瓶
按鍵沒有按下去
它就高電瓶
如果按鍵按下去的話呢
它就爲低電瓶
那我就判斷這IO口線的電瓶高和低
就可以判斷這個IO口線
就是這個鍵按不按下去
是不是
所以這個是最常見的
獨立式鍵盤接口電路
大家注意啊
這個地方一定用上拉電阻連到正五足上
是爲了保證這個電瓶航線的
電瓶穩定
一定要注意啊
就是對航線電瓶的穩定
鍵盤比較少就採用這種方案
那這個軟件編程呢
也比較簡單
大家看一看
剛纔那接口電路
我們看怎麼來編這個軟件
大家看一下
Move FF送到P1口
這什麼意思呢
讓P1口作爲輸入
剛纔那八根航線接到什麼
接到P1口
讓P1口作爲輸入
我要讀這八個航線的狀態
來判斷鍵按按鍵
Move P1送到A
大家注意
然後呢
大家看一下
把A裏面實際上也是高電瓶
高電瓶什麼意思呢
就FF
就比較一下
如果八個鍵裏面沒有任何一個鍵按鍵
它就FF
那這條指定呢
把P1口的狀態和FF相比
如果不相等的話
不相等的話
就跳到去走動
這個標號
不相等什麼意思
你沒有鍵按鍵
FF
有鍵按鍵
就不是FF
當然不相等
那這個地方呢
就跳到去走動
這個地方進行處理
爲什麼呢
你有可能它不是FF
某一根線被外界干擾
干擾成低電瓶了
它就不是FF
那麼要躲過那走動區
去走動
然後大家看
Move A狀態送到R3
A那是什麼
你剛纔大家注意
把P1口的內容讀到A裏面
實際上它反映的是P1口的狀態
A送到R3裏面
然後大家注意看
這比較關鍵
軟件驗識十毫秒
怎麼編驗識程序
我們在第四章介紹了一個驗識程序
驗識十毫秒
躲過那個走動區
然後大家注意
再把P1口的狀態讀到A裏面
然後大家注意
這條指令
看一下
這一次讀的狀態
和上次讀的狀態相不相等
如果相等
因爲已經躲過
驗識十毫秒
躲過那個抖動區了
如果相等的話
大家注意
如果不相等
跳到Return
說明是抖動引起的
如果相等的話
就往下執行
然後你就得判
是哪一個鍵按下
那麼先把P1.0那個音角讀進來
放到C裏面
然後大家注意
有這條未判指令
判未
它是0還是1
實際上就判P1.0音角
是否爲高
如果它爲高
說明這個鍵肯定沒有按下
再判下一個鍵
如果
大家注意
如果爲高
跳到下一個鍵
不會高
爲0
有可能大家注意
有可能這個鍵就按下去
按下去以後
要跳到PK0
什麼意思呢
這個鍵按下去了
要跳到鍵處理程序
P1.0對應的鍵按下去
那P1.0沒按下去
我們就跳到P1.1
這個對應的按鍵狀態
因爲P1.1外邊連着按鍵
然後讀到C裏面
然後判一下是否爲1
如果P1.1爲高
就跳到KY2
就是下一個再判下一個
爲高的話就那鍵沒有按
不會高的話
大家注意
就跳到這個P1.1
對應這個鍵處理程序
鍵處理
好
照貓二話虎
我們下面這些都可以看出來
一直到最後那個鍵
大家注意
P1.7
大家看
P1.7讀進來
然後如果爲高
返回
說明沒有鍵
如果不爲高
就跳到對應的P1.7
對應的按鍵
它的處理程序
然後最後只成爲返回
大家注意
這種簡單的鍵盤
接口電路方案和軟件
是我們最常用
當你鍵比較少的時候
最常用的接口電路方案
所以大家注意
一個接口電路設計兩部分
硬件怎麼連接
軟件怎麼設計
這個是獨立式鍵盤
那麼大家下面再看一下
如果鍵盤多於八個
少於等於16個
這時候一般最常用的是矩陣式鍵盤
矩陣式鍵盤
也叫行列式鍵盤
這個一般用於八到十六鍵的場合
九鍵到十六鍵
這個大家要注意
這個按鍵數比較多
這時候
這按鍵與口線連接方式是不一樣的
它是一個矩陣式的
行列式的
大家注意看
大家看這個接口電路
這是一個16鍵的鍵盤
四層次的
然後這是行線
這是列線
四行四列
每一個鍵都連在一行和一列的行線列線交叉點上
如果這個鍵按下去
對應的這個行線和列線就短路了
就連接
這個我們把它叫做矩陣式鍵盤
也叫行列式鍵盤
在你鍵盤
對四層次的來說
有的人說還可以用八層八嗎
可以
那就要佔用兩個IO口
八個行線佔用一個IO口
四層次
但是如果鍵超過16個
大多數的設計方案
都採用專用的鍵盤顯示器接口芯片
對吧
那麼這是四層次
那麼他這種連接方式
是佔用了四行四列
正好一個IO端口
大家想想
如果這16個鍵都是前面的IO接口
就是獨立式鍵盤
那種接口方式
IO接口方式
那要佔用兩個IO端口
所以大家一定要牢記
IO端口實際上在單面系統裏面
是非常寶貴的資源
那麼採用這個方案
就只用一個IO端口就夠了
這個是矩陣式
行列式
那麼這裏就有一個問題
我怎麼來判斷按下鍵的鍵號
這個就不能簡單的像前面的
獨立式的鍵盤接口
那種軟件編程判斷
是哪個鍵按下去的
那個思想
那麼大家一定要注意
如果這個矩陣當中
沒有鍵按下去
那所有航線肯定都會到電瓶
如果有鍵按下去
大家注意
這時候對應這個鍵的
航線的電瓶狀態
與你這個鍵
就這個航線相連的列線的狀態
它的電瓶來決定
那麼大家注意
如果這按下鍵的列線電瓶爲低
那這航線電瓶就爲低
列線電瓶爲高
這航線電瓶也會高
那麼大家注意這一點
這個就是來判斷
這個矩陣式鍵盤有沒有鍵按下去的
一個最關鍵的因素
大家注意一個問題
這一個鍵是連在航列線的交叉點上
所以你按下去的話
鍵盤按下
航線電瓶就取這個鍵相連的列線電瓶
好
那麼大家注意
這個航列式鍵盤或者叫矩陣式鍵盤
它的航列線是多個鍵共用
你比如說第一航
航線如果爲低的話
有可能0號鍵
有可能1號鍵
有可能2號鍵
有可能3號鍵
當然前提呢
你是讓四個列線
你用軟件控制的全爲低電瓶
所以它的航列線是多鍵共用
所以各個鍵將會互相產生影響
因此
我要想判斷得到按下鍵的鍵號
必須是航列線的信號是相互配合
下面我們就討論這個矩陣式鍵盤
怎麼來識別它的按鍵
第一個掃描法
掃描法呢
第一步先判別有沒有鍵
按一下
第二步
如果有鍵按下去
要識別出按下鍵的具體鍵號
下面我們以剛纔的矩陣式鍵盤的鍵盤
就這個鍵按下去爲例啊
大家看這個
假設這個鍵按下去
大家注意啊
這個鍵的航線是P1.0
這個鍵的列線連的是P1.7
那麼我們怎麼來判斷它的鍵號呢
這個是非常關鍵的啊
第一步
首先要看這個鍵盤總體有沒有鍵按下去
怎麼來判呢
我先用軟件控制列線爲全零
然後讀進航線狀態
大家注意啊
列線狀態全零的話
航線狀態呢
那麼哪個鍵按下去
對應的航線也爲低電平
好
那麼我要判有沒有鍵按下去
我先讓所有列線爲低電平讀航線狀態
如果航線狀態不全爲高電平
肯定有鍵按下去
所以第一步呢
有沒有鍵按下去
來定鍵判
第二步
識別哪個鍵被按下去
哪個鍵按下去
大家注意一行航線爲低電平的話
那一行有四個鍵
有四個鍵
那怎麼辦呢
採用逐列掃描法
大家注意逐列掃描法
大家一定要清楚它的含義
什麼意思呢
我第一步不是判有沒有鍵按下去嗎
有鍵按下去
那麼逐列掃描法呢
我是那樣
先控制列線的電平
我用軟件來控制的
讓這四個線
這根線爲第一
其他的位高
列線其他列線都爲高
然後讀航線的狀態
讀航線的狀態
如果某一行爲低
說明這個行列交叉點的這個按鍵
肯定按下去
那逐列掃描呢
先讓它爲低
然後讀這四行的狀態
如果沒有鍵按下去
再讓這根線爲低
其他列線都爲高
再讀這個航線的狀態
這樣的話呢
就可以判斷出
究竟是哪一個鍵被按下去
逐列掃描法就是
讓它一列一列的爲低
然後讓其中一列爲低讀航線狀態
其中一列爲低讀航線狀態
下面我們看具體怎麼來處理這個問題
大家注意啊
第一步就讓第一列爲低
剛纔說了
第二步呢
讓第二列爲低
然後都讀航線狀態
那麼
某一列爲低
完讀航線
某一行爲低
那麼這行列交叉點那個鍵呢
就一定被按
這個就是逐列掃描法的基本思想
也就是說來識別
矩陣式鍵盤的鍵號的一個基本思想
注意另一種方法
另一種方法
是限翻轉法
剛纔說的那種逐列掃描呢
是那樣第一步讀航線
列輸出全爲低讀航線狀態
不全爲
如果還未高電平的話
全爲高電平
沒有鍵按性
如果不全爲高電平
肯定有鍵按性
然後逐列掃描
限翻轉法呢
大家注意
不需要那麼多掃描
怎麼辦
它就是兩次就可以
所以限翻轉法非常簡略
這個編軟件的時候就比較好編
不管是你這個鍵是出於哪一列
兩步就可以確定出這按鍵所在的航和列的值
你就能得到這個鍵的鍵號
那麼下面呢
咱們看一下這個矩陣式鍵盤圖10-10
這個矩陣式鍵盤
它的判斷鍵按下去
並且得到鍵號的基本思想
大家先把這圖看明白
這是一個矩陣式鍵盤
P1.4 1.5 1.6 1.7是航線
P1.0 1.1 1.2是列線
大家注意列線平時爲高電平
因爲它通過上拉電阻接到正弧上
然後列線
大家注意看
列線爲高電平
航線在沒有鍵
按下去的時候也爲高電平
這是沒有鍵按下去
它們航列線的初始狀態
那麼限翻轉法是靠什麼來判斷
只需要兩次
就可以得到鍵值的
大家看
首先第一步
讓航線
你用軟件控制
都爲輸入線
列線爲輸出線
這時候
讓輸出線爲全迪
然後讀航線
讓列線全迪讀航線
你這一下就能知道
列線爲迪
航線
你能不能找出航線爲迪的那一行
下一步
正相反
讓航線爲輸出
列線爲輸入
事先要變成初始化
航線爲輸出
列線爲輸入
然後
航線爲全迪電平
然後讀列線的狀態
換是列線爲零
或者是爲迪電平那一列
就是對應的那一列
那個按鍵按下去
所以經過兩次
就可以得出按一下鍵的位置
是什麼呢
航爲零
列爲零的
那個交叉點的那個鍵
那麼這需要兩步
兩步就可以
就可以得到這個成績
就是鍵的鍵號
按一下鍵的鍵號
好
那麼大家注意啊
行列式鍵盤呢
它的接法差在哪呢
大家看一看
這個行列式鍵盤是採用線反轉法的
行列都接到高電平
通過上拉電阻
那麼大家看一看這個
這個矩陣式鍵盤接口
這一種是航線通過上拉電阻
接到正軌
列線是用軟件來控制
所以大家注意
我們一會給出這個接口方案的軟件
你要把它讀懂
將來肯定要用
線反轉法的那個程序沒給
大家如果有時間的話
課後應當好好編一點
這線反轉法的
兩步就可以弄出來
得到鍵的鍵號
下面我們討論一個問題
就是鍵盤的工作方式
大家知道一個單片機系統
要隨時掃描這個鍵盤
鍵不知道什麼時候摁下去
是隨機的
但是單片機不能光幹這點事
一般常常是忙於其他任務
然後利用空閒時間來掃描鍵盤
怎麼樣兼顧鍵盤的輸入
那麼這個問題擺在我面前
這個主要取決於什麼呢
你鍵盤採用什麼樣的工作方式
你要保證能夠
響應這個按鍵的操作
又能夠呢
把其他任務都處理好
不過多的佔用單片機的時間
所以大家知道
單片機運行的時候
你不能總在這兒監視鍵盤
還要幹其他活
所以呢
這個就是我們要討論的
鍵盤的工作方式
第一個工作方式變成掃描
這個實際上就是查詢方式
什麼意思呢
單片機空閒的時候就去掃描鍵盤
看有沒有鍵按鍵
那麼這個時候呢
他把鍵盤掃描做成一個紙層去
反覆掃描
但是有一個問題
你要查詢頻率過高
雖然能及時響應鍵盤的輸入
但是會影響其他的任務的進行
對吧
你掃描總去掃描鍵盤
老去查詢
有沒有鍵按鍵
那這個問題呢
就會影響單片機的工作效果
但是你如果查詢的頻率太低
有可能你按一下一個鍵盤
你沒有去查
把它漏掉了
就漏盤
所以這個問題呢
要引起大家的注意
就是說你採用編程掃描的方法
來實驗就查詢法
要注意這個問題
第二種鍵盤的工作方式呢
是定時掃描
你就把定時器呢
定成一個時間
一到那時間就中斷
一中斷的話
就進入鍵盤掃描紙上去
那麼這樣的話
有什麼
要注意什麼問題呢
這時候定時中斷的週期呢
小於一百毫秒
你要大於一百毫秒
容易產生鍵盤漏盤
你比如按一下鍵一下漏了
沒有檢測到
你得比如說
小於一百毫秒掃描一次
定時掃描
你把定時器編成爲定時中斷
好
這是第三種方法呢
是採用這種方式
中斷掃描
你要鍵盤沒有鍵按下去
我不理你
有鍵按下去
發出一箇中斷請求
然後呢
我主程序停下來
來進行鍵盤掃描
那麼這種中斷方式呢
是隻有在有鍵按下去的時候
纔會發出中斷請求信號
單片機呢
才能顯示中斷
如果沒有鍵按下去呢
單片機就不理採這個鍵盤
沒有鍵按下去
你理它幹嘛
那麼這個
這種工作方式
好的
就它優點在什麼地方
只有按鍵按下去
才能進行處理
纔去處理按鍵
這樣的話呢
它的實時性強
工作效率比較高
實際上大家注意啊
現在採用現成的那種鍵盤顯示器
器接口啊
就那現成的鍵盤顯示器
接口芯片
它採用的都是中斷方式
就是編碼鍵盤
就是編碼鍵盤的
專用顯示器鍵盤的芯片
所以這種中斷方式呢
是最理想的
最理想的
工作效率比較高
好
大家看一下
採用現反轉法的這個矩陣鍵盤的接口電路
大家注意啊
這常用的74LS30
這是一個8輸入的什麼呢
預飛門
大家看啊
這個是反向器
一反一反
就邏輯還是沒有變
大家注意
每一行的航線都通過上拉電阻
接到正弧
對吧
然後大家注意
列線通過這鍵盤開關接到D
如果這八個鍵有一個鍵按下去
大家想想
其中的一根線是不是爲低
爲低的話
他是不是就一定爲高
他爲高的話
再經過反
他一定爲低
然後就這個中斷請求
產生一箇中斷請求
中斷請求信號
加到單片機的外中斷的輸入端INT0
又發出一個外中斷請求
對吧
然後呢
就進入中斷程序
然後呢
應當把這航線的狀態馬上讀進來
判一下是哪個鍵按
如果你好幾年也不按這個鍵盤
他一直在那運行
他也不會影響你漏盤按鍵的問題
對不對
那麼這個電路呢
我們大家可以看看我們的實驗教材裏面
有一道題
就是搶答器
搶答器
你八個選手按鍵呢
完全可以用這個
你要八個選手都不會這道題
都不按的話呢
也不會引起中斷
對吧
就沒有鍵按也可以
也就這塊沒有中斷信號
對吧
你要採用查詢方式
不採用中斷
那可麻煩了
得不斷的去查這八根線的狀態
看有沒有鍵按
所以這種中斷方式呢
是非常
再一種中斷方式呢
就我說的
你採用專用鍵盤顯示接口芯片
他這種專用鍵盤芯片呢
可以處理八乘八矩陣
64個鍵
你要有鍵按
它會向單片機發出一箇中斷請求信號
道理和它是一樣的
所以鍵盤的工作方式
大家一定要不要小瞧
你要這個問題考慮不好
容易造成鍵盤的漏派
就是你要掃描
總去查詢
你不採用正確的鍵盤工作方式
所以大家將來設計的話
你整個程序那部分
一定要考慮鍵盤的工作方式
一共就三種
查詢
還有一種的最效率最高的
就是這個中斷方式
還有一種是定時掃描
定時掃描
那就不講究效率了
不管有沒有鍵盤按下去
你也得定時去到那時候就中斷
然後就查一查
看有沒有鍵按
所以呢
大家要把這個鍵盤的工作方式
從整個單片機的程序要綜合考慮
好休息五分鐘
