51单片机学习之路 —— 1.8 矩阵键盘
扫描二维码
随时随地手机看文章
1 什么是矩阵键盘?
这里补一个键盘的定义
大家看原理图,这就是矩阵键盘(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
独立键盘一端固定位低电平! 检验较为方便
但矩阵键盘不一样,他两边都与单片机的I/O相连接。所以检测方法有些不同
要人为送出低电平,我们采取以下的检测方法:
1. 先送一列为低电平,其余几列都为高电平(用此来确定列数)
2. 然后立即轮流检测每一行是否有低电平(确定行数)
我们写一个函数,用两个变量接受列和行的数据 cord_l cord_h
P3 = 0xf0; // 1111 0000
判断是否有按键按下: 例如 S6按下
1.
2. 假设S6按下
此刻S6按下导通P3.4接口LCDEN为低电平(可以这样理解是P3.0与P3.4 0&1=0)
此时的P3口为 1110 0000 (0xe0)
P3 & 0xf0 (P3和0xf0按位与)
P3 = 1110 0000
0xf0 = 1111 0000
= 1110 0000 = 0xe0
这时成立
表示有按键按下
3 延时消抖
4 储存值
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
这样我们就确定了一个值0xee 意味着是s6按下
2 程序编写 要求:按顺序按下s6~s21 依次显示0~f 6个数码管静态显示即可
矩阵键盘
这里让数码管一开始显示一个-
用了一个循环让其一直执行
注意switch中的表达式就是我们通过扫描键盘扫描出的键值码。
3 补充:
c语言中的一些运算符
运算符
范例
说明
+
a+b
a变量值和b变量值相加
-
a-b
a变量值和b变量值相减
*
a*b
a变量值乘以b变量值
/
a/b
a变量值除以b变量值
%
a%b
取a变量值除以b变量值的余数
=
a=6
将6设定给a变量,即a变量值等于6
+=
a+=b
等同于a=a+b,将a和b相加的结果又存回a
-=
a-=b
等同于a=a-b,将a和b相减的结果又存回a
*=
a*=b
等同于a=a*b,将a和b相乘的结果又存回a
/=
a/=b
等同于a=a/b,将a和b相除的结果又存回a
%=
a%=b
等同于a=a%b,将a变量值除以b变量值余数又存回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,两个变量都是“真”,结果才为“真”否则结果为“0”
||
a||b
a和b做逻辑做OR,只要任何一个变量为“真”,结果就为“真”
!
!a
将a变量的值取反,即原来为“真”则变“假”,为“假”则变为“真”
>>
a>>b
将a按位右移b个位
<<
a<
将a按位左移b个位,右侧补“0”
|
a|b
a和b的按位做OR运算
&
a&b
a和b的按位做AND运算
^
a^b
a和b的按位做XOR运算
~
~a
将a的每一位取反
&
a=&b
将b变量的地址存入a寄存器
*
*a
用来取寄存器所指地址内的值