求:PS2键盘与51单片机的接口程序

求:PS2键盘与51单片机的接口程序,第1张

PS/2键盘扫描码键值转换程序ps2_codetrans()流程

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

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

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

case 0x11: agcs_status&=0xF7break//左alt释放

case 0x12: agcs_status&=0xFEbreak//左shift释放敬并困

case 0x14: agcs_status&=0xFDbreak//左ctrl释放

case 0x58: if(led_status&0x04)

led_status&=0x03//caps lock键

else led_status =0x04

ps2_ledchange()

break

case 0x59: agcs_status&=0xEFbreak//右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 = 1else caps_flag = 0

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

if (scga_status &0x11) shift_flag = 1else 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,2.0cps),接收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键盘的应用也有借鉴意义。

key_scan_output=scan[col]

rowkey=~(_key_scan_output&0x0f)//这里之后rowkey只能取0xf1,0xf2,0xf4,0xf8这几个值了,

if(rowkey!=0)//所以这里州昌是一直为真的

{

if(rowkey==0x01) row=0

else if(rowkey==0x02) row=1

else if(rowkey==0x03) row=2

else if(rowkey==0x04) row=3

key_value=4*col+row//而这里的值只会是4*col+0,row 始终是0

while(rowkey!=0)//这里是不是松手检测啊,如果是的话,下面这样就好了

/困迹亏/汪神while((_key_scan_output&0x0f)!=0x0f)//等待按键松手

rowkey=~(_key_scan_output&0x0f)

}

单片机在使用电机的应用中,普通电机在罩和运转时如果仃止(断电)会有一个惯性过程(所以会继续转一小段时间),使用步进电机就不会有这种现象(不过驱动程序需要有步进编码控制),普通电机要物清盯去除这个惯性过程可以在仃止(断电)时加正宏一个短暂的反响驱动就可以(不过硬件电路需要有正反向驱动)。


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

原文地址:https://54852.com/yw/12425165.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存