ch07 第七章 输入埠实习

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章 输入埠实习
7.1 指拨开关控制LED实习 7.2 按键开关控制LED实习(一) 7.3 按键开关控制LED实习(二) 7.4 矩阵键盘控制LED实习 7.5 矩阵键盘控制4位七段显示器实习
1
7.1 指拨开关控制LED实习
指拨开关控制LED实习
相關知識
如圖 7-1 所示為常用開關如單切開關、按鍵開關、指撥開關、矩陣鍵盤等, 其中指撥開關是將 2 個、4 個或 8 個單切開關包裝成一組使用,而矩陣鍵盤則 是將 12 個或 16 個按鍵開關包裝成一組使用。按鍵開關會有機械彈跳的問題存 在,容易造成誤動作,常用軟體來消除機械彈跳。單切開關沒有機械彈跳的問 題,使用上較按鍵開關容易,有兩種連接方式如圖 7-2 所示。
12
/* 8051 接腳定義 */ /* 按鍵按下後狀態為 1 的次數 */ /* 按鍵按下後狀態為 0 的次數 */ /* 未除彈跳鍵值 */ /* 已除彈跳鍵值 */
/* 按鍵掃描函數 */ /* LED 全暗 */
/* 掃描按鍵 */ /* 按下任何鍵? */ /* 相對 LED 狀態反相 */ /* 清除按鍵值 */
6
/* 8051 接腳定義 */
/* 閃爍速度 */ /* 指撥開關狀態 */ /* 閃爍控制位元 */
/* 設定 P2 為輸入埠 */ /* 閃爍速度視 CPU 速度而異 */ /* 讀取 8 位元指撥開關狀態 */ /* mask=0 時,相對 LED 亮 */
/* mask=1 時,LED 全暗 */ /* 反相 mask */
1 2 3 4 5 6 7 8 L0 L1 L
10uF
220Ω
30P
19
X1
12MHz
10kΩ
30P
18 20
X2 VSS
21 22 23 24 25 26 27 28
10kΩ
9 10 11 12 12 13 13 14 15 16
圖 7-3 指撥開關控制 LED 實習電路
清除one=0
與上次 鍵值相同? 是 zero加1

否 mask =1? 否 是 清除mask=0
存鍵值至 KeyTemp (未消除彈跳 )
zero=5? 是 存鍵值至KeyData (已消除彈跳 )
設定zero=1
否 Key=1? 是 LED右移 (i加1) 否 Key=2? 是 否 i=7? 否 是 重設i=0 i=0? 是 清除鍵值 重設i=7 LED左移 (i減1) one=5? 是 清除zero=0 否 one加1
9
7.2 按键开关控制LED实习(一)
流程圖
開始
按鍵掃描函數 K eyS can() 設定P2為輸入模式 並讀取按鍵狀態
按鍵掃描 KeyScan()
否 否 已有按鍵輸入 ? 是 是 切換相對LED 的ON/OFF狀態 與上次 鍵值相同? 清除鍵值 是 zero加1 存鍵值至 KeyTemp (未消除彈跳) 否 清除one=0 已有按鍵輸入 ?
11
7.2 按键开关控制LED实习(一)
程式:ch7-2.c
#include "reg51.h" char one=0; char zero=0; unsigned char KeyTemp=0xff; unsigned char KeyData=0xff; main() { void KeyScan(void); P1=0xff; while(1) { KeyScan(); if(KeyData!=0xff) { P1^=KeyData; KeyData=0xff; } } /* while */ } /* main */
不穩定狀態
不穩定狀態
不穩定狀態
(a) 負脈波型彈跳 圖 7-5 機械彈跳
(b) 正脈波型彈跳
功能說明
如圖 7-6 所示,使用 8 位元按鍵開關 S7~S0 控制 8 位元 LED L7~L0,按鍵開關 可以切換 LED 的 ON/OFF。例如按一次 S0 鍵則 L0 亮,再按一次 S0 鍵則 L0 不亮,再按一次 S0 鍵則 L0 亮,…,如此不斷重覆。
15
7.3 按键开关控制LED实习(二)
按键开关控制LED实习(二
功能说明
如图 7-7 所示,使用 2 位按键开关 下 S0 键时, LED 连续单灯 右移。单击
S1~S0 控制 8 位 LED L7~L0 ,按一 S1 键时, LED 连续单灯 左移。
电路图
+5V
40
MCS-51
VCC EA/VP RST X1 X2 VSS
7.2 按键开关控制LED实习(一)
程式:ch7-2.c
void KeyScan(void) { unsigned char KeyStatus; P2=0xff; KeyStatus=~P2; if(KeyStatus!=0) { one=0; if(KeyTemp!=KeyStatus) { KeyTemp=KeyStatus; zero=1; } else { if(zero<5) { zero+=1; if(zero==5) KeyData=KeyTemp; } } }
7.1 指拨开关控制LED实习
1〃使用 8 位元指撥開關 S7~S0 控制 8 位元 LED L7~L0,當開關 ON 時,LED 亮,反之 當開關 OFF 時,LED 不亮。 2〃使用 1 位元指撥開關 S0 控制 8 位元 LED L7~L0 移位動作,當 S0 ON 時,LED 執行 單燈右移,當 S0 OFF 時,LED 執行單燈左移。 3〃使用 1 位元指撥開關 S0 控制 8 位元 LED L7~L0 移位動作,當 S0 ON 時,LED 執行 單燈閃爍右移,當 S0 OFF 時,LED 執行單燈閃爍左移。 4〃使用 2 位元指撥開關 S1~S0 控制 8 位元 LED L7~L0,當 S1 ON 時,LED 執行單燈 左移,反之當 S0 ON 時,LED 執行單燈右移,當 S1、S0 皆為 OFF 或皆為 ON 時, LED 不亮。
1 2 3 4 5 6 7 8 L0 L1 L2 L3 L4 L5 L6 L7
+5V
10uF
220Ω
30P
19
X1
12MHz
18
10kΩ 30P 20
X2 VSS
21 22 23 24 25 26 27 28
10kΩ
S0 S1 S2 S3 S4 S5 S6 S7
圖 7-6 按鍵開關控制 LED 實習(一)電路
+5V
P10 P11 P12 P13 P14 P15 P16 P17 P20 P21 P22 P23 P24 P25 P26 P27
1 2 3 4 5 6 7 8 L0 L1 L2 L3 L4 L5 L6 L7
10uF
10kΩ 9
30P 19 18 30P 20
31
12MHz
21 22 23 24 25 26 27 28
流程圖


設定P2為輸入埠
i 0 =
讀取指撥開關狀態
mask=0? 是 輸出開關狀態至 LED

關閉所有L E D
i 加1
i>10000? 是 m ask反相

4
7.1 指拨开关控制LED实习
電路圖
+5V
40
MCS-51
VCC EA/VP RST 31 9 P10 P11 P12 P13 P14 P15 P16 P17 P20 P21 P22 P23 P24 P25 P26 P27
返回主程式 輸出 P1=led[i]
j加1
否 J>10000? 是
17
7.3 按键开关控制LED实习(二)
程式:ch7-3.c
#include "reg51.h" char one=0; char zero=0; unsigned char KeyTemp=0xff; unsigned char KeyData=0xff; main() { void KeyScan(void); char i=0; int j; bit mask=0; unsigned char key; P1=led[i]; while(1) { for(j=0;j<=10000;j++) { KeyScan(); if(KeyData!=0xff) { key=KeyData; KeyData=0xff; } /* 儲存按鍵值至 key */ /* 清除按鍵值 */ /* 偵測按鍵狀態 */ /* 按下任何鍵? */ /* 控制移位速度 */ /* 輸出 */ /* LED 移位方向控制位元 */ /* KeyScan 函數宣告 */ char led[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};/* LED 資料 */ /* 8051 接腳定義 */ /* 按鍵按下後狀態為 1 的次數 */ /* 按鍵按下後狀態為 0 的次數 */ /* 未除彈跳鍵值 */ /* 已除彈跳鍵值 */
VCC R out SW 1 0 SW out R VCC 1 0
(a) 負脈波型 圖 7-4 按鍵電路
(b) 正脈波型
8
7.2 按键开关控制LED实习(一)
1
按下SW 放開SW
1
按下SW 放開SW 穩定狀態
10ms~20ms
0
10ms~20ms
0
穩定狀態
10ms~20ms
10ms~20ms
不穩定狀態
8 7 6 5 5 4 4 3 2 1
5
7.1 指拨开关控制LED实习
程式:ch7-1.c
#include "reg51.h" main() { int i; unsigned char j; bit mask=0; while(1) { P2=0xff; for(i=0;i<=10000;i++) { j=P2; if(mask==0) P1=j; else P1=0xff; } mask=~mask; } }

zero=5? 是 存鍵值至 KeyData (已消除彈跳 )
設定zero=1
one 加1
否 one=5? 是 清除zero=0
清除鍵值
返回主程式
10
7.2 按键开关控制LED实习(一)
電路圖
+5V
40
MCS-51
VCC EA/VP RST 31 9 P10 P11 P12 P13 P14 P15 P16 P17 P20 P21 P22 P23 P24 P25 P26 P27
C1
0 4 5 6 7
C2
8 9 A B
C3
C D E F
C4
R1 R2 R3 R4
1 2 3
(a) 單切開關
(b) 按鍵開關
(c) 指撥開關
(d) 矩陣鍵盤
圖 7-1 常用開關
2
7.1 指拨开关控制LED实习
相關知識
VCC
VCC
R
out
out
R
1(off) 0 (on)
1(on) 0 (off)
13
/* 按鍵狀態 */ /* 設定 P2 為輸入埠 */ /* 反相讀取按鍵狀態 */ /* 按下任何鍵? */
/* 與上一次所讀取的鍵值不同? */ /* 儲存新鍵值 */ /* 設定 zero=1 */ /* 與上一次所讀取的鍵值相同 */ /* zero<5? */ /* zero 加 1 */ /* zero=5? */ /* 鍵值已除彈跳*/
7.2 按键开关控制LED实习(一)
程式:ch7-2.c
one+=1; if(one==5) { zero=0; KeyTemp=0xff; KeyData=0xff; } } /* KeyScan */ /* 清除按鍵值 */ /* 清除按鍵值 */ /* 按鍵已放開? */
14
7.2 按键开关控制LED实习(一)
7
7.2 按键开关控制LED实习(一)
按键开关控制LED实习(一)
相關知識
市面上 3C 電子產品常使用的按鍵開關,可產生正脈波或負脈波如圖 7-4 示。實 際上,開關在按下及放開時,會有機械彈跳的問題存在,以圖 7-5(a)所示負脈波型彈 跳,在按下開關時,理論上應只有檢測一次低電位,但實際上在開關彈跳時間內, 狀 態不穩 定, 將檢測 多次 的低電 位, 因而 造 成誤 動作 。 一般 機械彈 跳的 時間約 在 10ms~20ms 間,常使用軟體來消除機械彈跳,可以節省硬體成本。軟體消除機械彈 跳的原理如 5-7 節所述。
(a) 正輸出型 圖 7-2 單切開關電路
(b) 負輸出型
功能說明
如圖 7-3 所示,使用 8 位元指撥開關 S7~S0 控制 8 位元 LED L7~L0,當開關 ON 時,LED 閃爍,反之當開關 OFF 時,LED 不亮,LED 的閃爍速度由迴 圈來控制。
3
7.1 指拨开关控制LED实习
S0 S1
LED 实习(二)电路 图 7-7 按键开关控制
16
7.3 按键开关控制LED实习(二)
流程圖
開始
按鍵掃描函數 K eyS can() 設定P2為輸入模式 並讀取按鍵狀態
j=0
按鍵掃描 KeyScan()
否 已有按鍵輸入 ? 是 否
已有按鍵輸入 ? 是 儲存鍵值至 key 且清除鍵值
1〃使用 8 位元按鍵開關 S7~S0 控制 8 位元 LED L7~L0,按鍵開關可以切換 LED 的閃 爍/OFF。例如按一次 S0 鍵則 L0 閃爍,再按一次 S0 鍵則 L0 不亮,再按一次 S0 鍵 則 L0 閃爍,…,如此不斷重覆。 2〃使用 1 位元按鍵開關 S 控制 8 位元 LED L7~L0,每按一下 S 鍵,LED 右移 1 位元。
相关文档
最新文档