×
单片机 > 单片机程序设计 > 详情

3个IO口扫描16个按键

发布时间:2025-06-04 发布时间:
|



         
该 电路在程序处理时,由处理器首先向I/O1~I/O3写高电平,然后读入。如果非全“1”,说明,K0~K6中有键按下,此时可根据读入的端口状态判断键 的状态,如果读入的结果为全“1”,则I/O1~I/O3轮流输出低电平,再读入,这样就可根据另外两根I/O线的状态来判别是K7~K15中的哪一个键 被按下。重复调用键盘处理子程序可将读取的键值与上次的值进行比较,甚至两次读数相同为止,这样即可消除按键抖动所造成的误读。该电路选用的单片机为

AT89C2051

,用C51语言编写的按键电路处理程序如下:


#include


#define uchar unsigned char


uchar getkey(void);


uchar keyvol;


void main(void)


{


keyvol=getkey(); /*调用键处理函数,返回的数据等于16表示同有键按下,0至15对应k0至K15*/


}


以下为键盘处理子程序:


uchar getkey(void)


{


uchar x


P1=P1|0x07; /*I/O1至I/O3写“1”*/


x=P1&0x07; /*读入I/O1至I/O3并屏蔽其它位*/


if(x==0x07)   /*判断K0至K6是否按下并转换键值*/

{
P1=P1&0xfe;   /*

I/O1写“0”*/


x=P1&0x07;


x=x/2+7;


if(x= =10)


{


P1=P1|0x07;


P1=P1&0xfd; /*I/O2写“0”*/


x=P1&0x07;


x=(x+1)/2+10; /*屏蔽I/O2并转换K10至K12的键值*/


if(x = =13)


{


P1=P1|0x07;


P1=P1&0xfb; /*I/O3写“0”*/


x=P1&0x07;


x=x+13; /*屏蔽I/O3并转换K13至K15的键值*/


}


}


}


return x;


}


利用该键盘电路并根据逻辑组合原理可推断开n条I/O线可组合的按键数N为:


N=(2n-1)+(2 n-1 -1)n





个人觉得自己写程序的时候有个地方需要注意:当IO口赋值011,按k0之后IO读数为000,按k13读数也为000,所以如果检测到到k0到k6,这几个都没按才可以继续检测k7到k15.


关键字:IO口  扫描  按键

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32之TIM 舵机控制PWM