51單片機(jī)學(xué)習(xí)之路 —— 1.8 矩陣鍵盤
1 什么是矩陣鍵盤?
這里補(bǔ)一個(gè)鍵盤的定義
大家看原理圖,這就是矩陣鍵盤(4*4)
四行 分別連到P3.0 P3.1 P3.2(INT0) P3.3(INT1) (從上到下)
四列 分別連到P3.4(LCDEN) P3.5(RS) P3.6(WR) P3.7(RD)(左到右)
2
獨(dú)立鍵盤一端固定位低電平! 檢驗(yàn)較為方便
但矩陣鍵盤不一樣,他兩邊都與單片機(jī)的I/O相連接。所以檢測方法有些不同
要人為送出低電平,我們采取以下的檢測方法:
1. 先送一列為低電平,其余幾列都為高電平(用此來確定列數(shù))
2. 然后立即輪流檢測每一行是否有低電平(確定行數(shù))
我們寫一個(gè)函數(shù),用兩個(gè)變量接受列和行的數(shù)據(jù) cord_l cord_h
P3 = 0xf0; // 1111 0000
判斷是否有按鍵按下: 例如 S6按下
1.
2. 假設(shè)S6按下
此刻S6按下導(dǎo)通P3.4接口LCDEN為低電平(可以這樣理解是P3.0與P3.4 0&1=0)
此時(shí)的P3口為 1110 0000 (0xe0)
P3 & 0xf0 (P3和0xf0按位與)
P3 = 1110 0000
0xf0 = 1111 0000
= 1110 0000 = 0xe0
這時(shí)成立
表示有按鍵按下
3 延時(shí)消抖
4 儲(chǔ)存值
P3 = 1110 0000
0xf0 = 1111 0000
cord_l = 1110 0000
cord_l = 1110 0000
0x0f = 0000 1111
P3 = 1110 1111 = 1110 1110(按下的是s6 P3.0 與 P3.1 與)
P3 = 1110 1110
0x0f = 0000 1111
cord_h = 0000 1110
cord_l = 1110 0000
cord_h = 0000 1110
返回值 = 1110 1110 = 0xee
這樣我們就確定了一個(gè)值0xee 意味著是s6按下
2 程序編寫 要求:按順序按下s6~s21 依次顯示0~f 6個(gè)數(shù)碼管靜態(tài)顯示即可
矩陣鍵盤
這里讓數(shù)碼管一開始顯示一個(gè)-
用了一個(gè)循環(huán)讓其一直執(zhí)行
注意switch中的表達(dá)式就是我們通過掃描鍵盤掃描出的鍵值碼。
3 補(bǔ)充:
c語言中的一些運(yùn)算符
運(yùn)算符
范例
說明
+
a+b
a變量值和b變量值相加
-
a-b
a變量值和b變量值相減
*
a*b
a變量值乘以b變量值
/
a/b
a變量值除以b變量值
%
a%b
取a變量值除以b變量值的余數(shù)
=
a=6
將6設(shè)定給a變量,即a變量值等于6
+=
a+=b
等同于a=a+b,將a和b相加的結(jié)果又存回a
-=
a-=b
等同于a=a-b,將a和b相減的結(jié)果又存回a
*=
a*=b
等同于a=a*b,將a和b相乘的結(jié)果又存回a
/=
a/=b
等同于a=a/b,將a和b相除的結(jié)果又存回a
%=
a%=b
等同于a=a%b,將a變量值除以b變量值余數(shù)又存回a
++
a++
a的值加1,即a=a+1
--
a--
a的值減1,即a=a-1
>
a>b
測試a的值是否大于b
<
a
測試a的值是否小于b
=
a=b
測試a的值是否等于于b
>=
a>=b
測試a的值是否大于或等于b
<=
a<=b
測試a的值是否小于或等于b
!=
a!=b
測試a的值是否不等于b
&&
a&&b
a和b做邏輯做AND,兩個(gè)變量都是“真”,結(jié)果才為“真”否則結(jié)果為“0”
||
a||b
a和b做邏輯做OR,只要任何一個(gè)變量為“真”,結(jié)果就為“真”
!
!a
將a變量的值取反,即原來為“真”則變“假”,為“假”則變?yōu)椤罢妗?/p>
>>
a>>b
將a按位右移b個(gè)位
<<
a<
將a按位左移b個(gè)位,右側(cè)補(bǔ)“0”
|
a|b
a和b的按位做OR運(yùn)算
&
a&b
a和b的按位做AND運(yùn)算
^
a^b
a和b的按位做XOR運(yùn)算
~
~a
將a的每一位取反
&
a=&b
將b變量的地址存入a寄存器
*
*a
用來取寄存器所指地址內(nèi)的值