STC12C5A60S2(51单片机)驱动3X3矩阵键盘的问题。

开发环境(蓝色粗体字为特别注意内容)
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矩阵键盘驱动我已经打好包,放到文章后面,供需要的朋友下载。

点击下载51单片机3x3矩阵键盘驱动







猜你喜欢

转载自blog.csdn.net/pang9998/article/details/80017883