矩阵按键貌似是学51单片机里面必备的一课,现在基本所有的51开发板都带这部分电路。因为它用8个IO口实现了16个按键的扫描检测,实现了IO口更充分的利用。 扫描矩阵按键的程序说简单也简单,说复杂也复杂。说它简单,是因为现在网络太发达了,随便搜索一下,都能找到可以直接用的源码。说它复杂,是因为如果不借助网络,全凭自己去摸索,确实要花一部分时间。 我当时是性子比较倔,只在网上看了矩阵按键的原理,没有看参考代码,完全凭借自己的理解,写了一段矩阵按键的扫描程序,花了三天时间才调试通。那三天,真的是折腾的死去活来,但是当程序调好的时候,真的感觉自己还是很拉风的。 这里,不是让大家学我那样去闭门造车,因为太费时间了。看过一个高手说的一段话:寄存器不用死记硬背,我做了那么久单片机项目的开发,连一个寄存器都记不住。需要配置寄存器的时候,直接在网上或者书本上参考别人现成的配置程序是上策,查找芯片数据手册是中策,死记硬背寄存器是最最下策。 直接参考别人现成的配置程序是上策,但是一定要理解,否则会出现根基不稳、知其然不知其所以然的情况! 继续说矩阵键盘,上电路: 注意,前面废话了很多,现在开始说原理: 程序扫描时,给P3口赋值就0Xfe。然后读取高四位的电平,因为此时无按键触发,所以高四位状态是1111 (二进制数)。 假设此时S1被按下,高四位会变成什么?1110(二进制数),S1对应的编码就是:0B11101110. 假设是S3被按下,高四位会变成什么?1011(二进制数),S3对应的编码就是:0B10111110 因为S1被按下,所以低四位的状态会变成1110(二进制数)。 将两次得到的P3口状态进行逻辑或运算,就能得到按键S1对应的编码:0B1110 1110.每个按键都会有一个编码,我们只需要对他们的编码进行比对,就知道按下了哪个按键。 注意:编码的确认是在矩阵电路确定后,就已经随着电路固定了。 因为程序比较多,我就不在这里贴了,这次是矩阵按键控制数码管显示,从0~F。程序里会加注释。
|