开发环境(蓝色粗体字为特别注意内容)
1,开发板:STC12C5A60S2,3x3矩阵键盘。
2,开发环境:Keil uv5
1,开发板:STC12C5A60S2,3x3矩阵键盘。
2,开发环境:Keil uv5
3、参考文献:http://www.360doc.com/content/17/0829/12/2289804_682989833.shtml
一个项目中要用到矩阵键盘,之前只是用过4x4的矩阵键盘,本来想拿过来直接用,后来发现,3x3矩阵键盘就够了,用4x4矩阵键盘需要8个IO口(行4个列4个)有点浪费,其他IO口还有其他用处。
但这时候问题就来了,用3x3矩阵键盘的时候,需求是扫描行线列线时不能影响其余两个IO口,我的接线方式如下:
P1.0 <---> ADC P1.1 <---> 行线1 P1.2 <---> 行线2 P1.3 <---> 行线3 P1.4 <---> 列线1 P1.5 <---> 列线2 P1.6 <---> 列线3 P1.7 <---> 其他
51单片机如何高效操作某几个IO口同时不影响其余的IO口呢?
想到了用位操作,试了多种操作方式,还是不妥。于是看到了文章前面参考文献,才恍然大悟。经过深入的思考,终于推算出一套有效的算法,具体算法如下:
P1(IO口) 0 1 2 3 4 5 6 7 起始状态 ? ? ? ? ? ? ? ? Hex:0x?? 目标状态 ? 1 1 1 0 0 0 ? "?"表示不改变的位 P1 & = 1 0 0 0 0 0 0 1 需要改变的位置为9,不需要改变的位为1, Hex:0x81 = ? 0 0 0 0 0 0 ? P1 | = 0 1 1 1 0 0 0 0 需要改变的位置为相应的数,不需要改变的位置为0 = ? 1 1 1 0 0 0 ? 成功输出预期的状态
以上是设置扫描行线状态,设置扫描列线状态原理也一样。这样经过巧妙的算法处理,就能够实现只改变IO口的某几位的状态,而不影响其他位,从而使得其余两个IO口不受矩阵键盘的影响,依然能够正常使用,能够节省宝贵的IO口资源。
根据以上的算法可以把矩阵键盘的驱动程序写成如下:
/* 键码i 230 214 182 234 218 186 236 220 188 */ i=keyscan(1);得到键码之后就可以根据具体情况进行处理,另外需要注意的一点是,如果你 不确定你的键码是多少,可以把该键码通过串口输出到上位机,这样来确定按键对应的键码。
51单片机3x3矩阵键盘驱动我已经打好包,放到文章后面,供需要的朋友下载。