单片机键盘自检程序

单片机键盘自检程序,第1张

rans()流程

扫描码键值转换程序流程第一类按键的扫描码键值转换程序代码:

if (F0_FLAG) {//接收扫描码为断码

switch (mcu_revchar){//处理控制键

case 0x11: agcs_status&=0xF7;break;//左alt释放

case 0x12: agcs_status&=0xFE;break;//左shift释放

case 0x14: agcs_status&=0xFD;break;//左ctrl释放

case 0x58: if(led_status&0x04)

led_status&=0x03;//caps lock键

else led_status =0x04;

ps2_ledchange();

break;

case 0x59: agcs_status&=0xEF;break;//右shift释放

case 0x77: if(led_status&0x02)

led_status&=0x05;//num lock键

else led_status =0x02;

ps2_ledchange();

break;

case 0x7E: if(led_status&0x01)

led_status&=0x06;//scroll lock键

else led_status =0x01;

ps2_ledchange();

break;

default:break;

}

F0_FLAG = 0;

}

else {//接收扫描码为通码

if (led_status & 0x04) caps_flag = 1; else caps_flag = 0;

if (led_status & 0x02) num_flag = 1; else num_flag = 0;

if (scga_status & 0x11) shift_flag = 1; else shift_flag = 0;

file://扫描码键值转换

if ((caps_flag == shift_flag) (!num_flag))

KeyVal=kb_plain_map\[mcu_revchar\];

else KeyVal=kb_shift_map\[mcu_revchar\];

switch(mcu_revchar){//处理控制键或状态键

case 0x11: agcs_status = 0x08;//左alt按下

case 0x12: agcs_status = 0x01;//左shift按下

case 0x14: agcs_status = 0x02;//左ctrl按下

case 0x59: agcs_status = 0x10;//右shift按下

default: break;

}

}第二类按键的扫描码键值转换程序与上相似。要注意的是在退出该程序段时对

E0_FLAG和F0_FLAG标志的清0。

PAUSE键的处理程序:如果接收到0xE1,置E1_FLAG=1,然后顺次将后续接收到的7

个字节数据和PAUSE的通码后7个字节比较,一致则返回KeyVal=KB_PAUSE。在比较

完所有7个字节后清除E1_FLAG标志。

键盘初始化程序kb_init()流程:

① 上电后,接收键盘上电自检通过信号0xAA,或者自检出错信号0xFC。单片机

收为0xAA,进入下一步,否则,进行出错处理。

② 关LED指示,单片机发送0xED,然后接收键盘回应0xFA,接着发送送0x00接收

0xFA。

③ 设置机打延时和速率。 单片机发送0xF3,接收0xFA,发送0x00

(250ms,20cps),接收0xFA。

④ 检查LED,发送0xED,接收0xFA,发送0x07(开所有LED),接收0xFA。发送0xED,

接收0xFA,发送0x00(关LED),接收0xFA。

⑤ 允许键盘发送0xF4,接收0xFA。

键盘LED改变ps2_ledchange()函数流程:发送0xED→接收0xFA→发送led_status→接收0xFA。

结语

该驱动程序经Keil uVision2编译,在AT89C51单片机上运行通过,实现了对PS/2 104键盘的支持,以及对字符按键大小写切换,num lock切换,控制键及组合按键的支持。该程序对其他嵌入式或单片机系统中PS/2键盘的应用也有借鉴意义。

2个IO检测6个按键的方法

单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:

按键S1按下,电流是从R1流向GND的,S2按下是从R2流向GND,S3按下是从R1和R2共同流向GND。

S4按下是从IO1流向IO2,也可以从IO2流向IO1,S5按下是从IO1流向IO2,S6按下是从IO2流向IO1。按键按下和电流流向关系如下:

那么这6个按键单片机要怎么识别呢,下面就说下识别思路流程:

1 先配置IO1和IO2都为1,然后读IO1和IO2,若读到IO1为0,那么S1按下,若读到IO2为0,那么S2按下,若读到IO1和IO2都为0,那么S3按下,若IO1和IO2都没读到0,那么进行下一步;

2 配置IO1为0,IO2为1,读IO2,若读IO2为1,进入下一步,若IO2读为0,那么可以判断是S4或S6按下,然后再配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S4按下,若IO1读为1就是S6按下了。

3 配置IO2为0,IO1为1,读IO1,若IO1读为0,那么就是S5按下了。

将上面的电路图再精简下就是下面的图形了,是不是很有美感,下图还比上图省2个二极管哦。

欢迎评论交流,也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!

嘿嘿 俺来帮你解答

1 按键处理的 *** 作流程:

当发现有键按下时, 为了消除按键的抖动 需要软件延时5~10ms

经过延时后 再读入按键的状态 如果按键有效 则进入相应的按键处理程序

否则(按键无效)可以视为干扰。

2 一般都是采用软件延时(即调用一个延时子程序 延时5ms )

不要使用定时计数器来延时 会浪费单片机的硬件资源。

呵呵 满意 就选满意回答

SBUF=dispcode[num0];//第1位

while(!TI);

TI=0;

led0=0;

delay(2);

led0=1;

SBUF=dispcode[num1];//第2位

while(!TI);

TI=0;

led1=0;

delay(2);

led1=1;

SBUF=dispcode[num2];//第3位

while(!TI);

TI=0;

led2=0;

delay(2);

led2=1;

我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

以上就是关于单片机键盘自检程序全部的内容,包括:单片机键盘自检程序、单片机2个端口控制4个按键怎样实现、单片机按键延时,使用定时计数器消除按键延时,求 *** 作流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9336747.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存