1、键盘解码程序PS2键盘解码程序 实测可以使用 但一直搞不懂如何写入键盘。 就是不知道如何通过单片机控制键盘的CapsLock、NumLock灯的亮灭,希望大虾指点指点。感谢! =C文件= #include #includescancodes.h #includeps2kbd.h #includedelay.h /#includeLCD1602.h /*- 名称:PS2键盘驱动程序 日期:2010.11 修改:无 内容:通过单片机读/写PS2键盘 备注:本程序需使用外部中断口 -*/ /-IO引脚宏定义-/ sbitKey_Data=P30;/定义Keyboard引脚 sbitKey_CLK=P
2、32;/使用中断 /-结构体-/ /-标识特殊按键-/ staticstructkey_sign charShift:1;/上档键 charCapsLock:1; /大小写 charNumLock:1; /小键盘锁 Button; /-标志-/ bitBF; /解码完毕标志 bitKey_UP;/定义通码断码标志 bitE0Key=0; /E0开头的键盘码 bitParitycheck=1; /奇偶校验标志 unsignedcharKeyV; /键值 unsignedcharIntNum; /中断次数 /*/ /*函数声明*/ /*/ voidDecode(unsignedcharScanCo
3、de);/解码子程序 voidkeyVcache(unsignedcharkeyV); /键值入口,keyV就是解码后返回的键码 voidKeyboard_WRITE(unsignedcharsentchar);/写一字节到PS2键盘 /*- 名称:主机读取PS2键盘一字节 日期:2010.11 修改:无 内容:读取PS2键盘返回值(未解码),外部中断法 备注:键值存KeyV -*/ voidKeyboard_READ(void)interrupt0 if(IntNum0)&(IntNum=1;/因键盘数据是低高,结合上一句所以右移一位 if(Key_Data) KeyV|=0x80;/当键盘
4、数据线为1时到最高位 Paritycheck=Paritycheck;/奇偶校验位,数据奇数1为0 ; ; if(IntNum=9) if(Key_Data!=Paritycheck) KeyV=0x00; /奇偶校验错误,清空数据 ; ; IntNum+; while(!Key_CLK); /等待PS/2CLK拉高 if(IntNum10) IntNum=0;/当中断11次后表示一帧数据收完,清变量准备下一次接收 BF=1;/标识有字符输入完了 EA=0;/关中断等显示完后再开中断 Paritycheck=1; /一次接收接收,初始化奇偶校验位 ; /*- 名称:PS2键盘解码 日期:201
5、0.11 修改:无 内容:解码键盘返回值 传入:ScanCode键盘返回值 传出:无 相关寄存器:BF,Shift,CapsLock,NumLock,Key_UP,E0_Key -*/ voidDecode(unsignedcharScanCode)/注意:如SHIFT+G为12H34HF0H34HF0H12H,也就是说shift的通码+G的通码+shift的断码+G的断码 unsignedcharTempCyc; if(!Key_UP)/当键盘按下时 switch(ScanCode) case0xF0:/当收到0xF0,Key_UP置1表示断码开始 Key_UP=1; break; case
6、0x12:/左SHIFT Button.Shift=1; break; case0x58: /CapsLock键 Button.CapsLock=Button.CapsLock; break; case0x59:/右SHIFT Button.Shift=1; break; case0x77: /小键盘锁 Button.NumLock=Button.NumLock; break; case0xe0: /以E0开头的键码 E0Key=1; break; case0xFA: /键盘应答信号 break; default: /*如果数据不是F0,E0或LOCK键,则进行:查表对比键盘码,输出键值*/
7、if(Button.Shift)/如果SHIFT按下 for(TempCyc=0;(kbdasciicodeTempCyc0!=ScanCode)&(TempCyc49);TempCyc+);/查表显示 if(kbdasciicodeTempCyc0=ScanCode) keyVcache(kbdasciicodeTempCyc2);/返回大写字母或第二功能键值 break; ; else/没有按下SHIFT for(TempCyc=0;(kbdasciicodeTempCyc0!=ScanCode)&(TempCyc49);TempCyc+);/查表显示 if(kbdasciicodeTem
8、pCyc0=ScanCode) if(Button.CapsLock&(TempCyc27) /如果CapsLock有效且按下字母键 keyVcache(kbdasciicodeTempCyc2);/返回大写字母键值 else keyVcache(kbdasciicodeTempCyc1);/否则返回小写或第一功能键值 ; break; ; ; /带E0开头类按键查表 if(E0Key)/如果属于E0开头的键盘码 E0Key=0; for(TempCyc=0;(E0startedcodeTempCyc0!=ScanCode)&(TempCyc18);TempCyc+);/查表显示 if(E0s
9、tartedcodeTempCyc0=ScanCode) keyVcache(E0startedcodeTempCyc1); break; ; ; /控制类键以及小键盘按键查表 for(TempCyc=0;(kbdcontrolcodeTempCyc0!=ScanCode)&(TempCyc37);TempCyc+);/查表显示 if(kbdcontrolcodeTempCyc0=ScanCode) if(Button.NumLock&(TempCyc14) /NumLock上锁,小键盘不返回键码 else keyVcache(kbdcontrolcodeTempCyc1); ; ; ; ; else Key_UP=0; switch(ScanCode)/当键松开时不处理判码,如G34HF0H34H那么第二个34H不会被处理 case0x12:/左SHIFT Button.Shift=0; break; case0x59:/右SHIFT Button.Shift=0; break; ; ; BF=0;/标识字符处理完了 /*- 名称:主机写PS2键盘 日期:2010.11 修改:无 内容:写一个字节入PS2键盘 传入:sentchar传入键盘的数据
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1