资源目录
压缩包内文档预览:
编号:512607
类型:共享资源
大小:146.16KB
格式:RAR
上传时间:2015-11-11
上传人:QQ28****1120
认证信息
个人认证
孙**(实名认证)
辽宁
IP属地:辽宁
6
积分
- 关 键 词:
-
毕业设计
- 资源描述:
-
基于单片机的PS2键盘的驱动设计,毕业设计
- 内容简介:
-
2008届 毕业设计(论文)附录基于单片机的PS/2键盘驱动程序#include #include #include PS2.h#define EINT (EA = 1)#define DINT (EA = 0)#define MAXBUFFER 15#define WAITFORKEYBOARDPULSE while(!clock); while(clock)#define COMMAND_RESET 0xFF /命令:复位键盘#define COMMAND_READID 0xF2 /命令:读键盘ID#define COMMAND_SETSTATUS 0xED /命令:设置状态CapsLock,NumLock,ScrollLock#define COMMAND_SETRATE 0xF3 /命令:设置速率,延时#define COMMAND_ENABLE 0xF4 /命令:使能键盘#define CAPSLOCK_EN 0x04 /使能CapsLock 灯#define NUMLOCK_EN 0x02 /使能NumLock 灯#define SCROLLLOCK_EN 0x01 /使能ScrollLock灯#define CAPSLOCK_DIS 0x03 /关闭CapsLock灯#define NUMLOCK_DIS 0x05 /关闭NumLock灯#define SCROLLLOCK_DIS 0x06 /关闭ScrollLock灯#define DISALL 0x00 /关闭所有灯#define CODE_POST 0xAA /键盘上电自检成功 Power On Self Test#define CODE_ACK 0xFA /键盘应答码#define CODE_ECHO 0xEE /键盘的回应码#define CODE_BREAK 0xF0 /断码#define CODE_EXTEND 0xE0 /扩展码#define CODE_PAUSE 0xE1 /Pause键起始码 E1+14+77/E1+F0+14/F0+77#define CODE_LSHIFT 0x12 /左Shift键通码#define CODE_RSHIFT 0x59 /右Shift键通码#define CODE_LCTRL 0x14 /左CTRL键通码#define CODE_RCTRL 0x14 /右CTRL键通码 0xE0,0x14#define CODE_LALT 0x11 /左ALT键通码#define CODE_RALT 0x11 /右ALT键通码 0xE0,0x11#define CODE_NUMLOCK 0x77 /NumLock键#define CODE_CAPSLOCK 0x58 /CapsLock键#define CODE_SCROLLLOCK 0x7E/SCROLLLOCK键/* 函数定义 */unsigned char ReadPS2(); /读PS2端口获取PS2发送的数据void KeyScan(); /获得键值void KeyTransmit(); /发送键值void Order(unsigned char); /向键盘发送命令void Delay(unsigned char);void LedLock(unsigned char);/* 变量定义 */sbit DATA = P37; /P3.7做为数据线sbit clock = P32; /P3.2做为时钟线sbit key_sw = P11; /P1.2作为键盘电源开关int i;unsigned char KeyCodeBuffMAXBUFFER+1 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/键值缓存unsigned char KeyCodeSum = 0; /键码数bit KeyFlag = 0; /有键标志bit KeyUpFlag = 0; /键弹起标志bit KeyExtendFlag = 0; /扩展键标志bit KeyLedLockFlag = 0; /三个Led键被按下的标志bit KeyBoardConnectFlag = 0; /键盘连接标志bit KeyPauseFlag = 0; /Pause键标志bit KeyMakeCodeFlag = 0; /键盘发送通码标志/*bit CapsLockFlag = 0; /CapsLock标志bit NumLockFlag = 0; /NumLock标志bit ScrollLockFlag = 0; /ScrollLock标志*/unsigned char KeyIDLo = 0; /键盘ID低字节unsigned char KeyIDHi = 0; /键盘ID高字节unsigned char LedStatus = 0; /NumLock,CapsLock,ScrollLock灯控制/*/函数:main()/功能:主函数/输入:无/输出:无/描述:/*/void main()DINT; /关中断for(i=0;i1000;i+);/延时稳定/* 初始化变量 */DATA = 0;clock = 0; /端口设置为高key_sw = 1; /关键盘for(i=0;i1000;i+)Delay(10);for(i = 0;i1)SBUF = KeyCodeBuff-KeyCodeSum; elseKeyCodeSum = 0; TI = 0;/*/函数:KeyTransmit()/功能:定时器0中断/输入:/输出:/描述:/*/void KeyTransmit()while(TI = 1);SBUF = KeyCodeBuff-KeyCodeSum; /发送键值/KeyCodeSum = 0; /*/函数:timer0()/功能:定时器0中断/输入:/输出:/描述:/*/void timer0() interrupt 1 using 3/*/函数:ex0()/功能:外部中断0服务程序/输入:/输出:/描述:/*/void ex0() interrupt 0 using 3 /时钟线变低unsigned char bitCount;unsigned char KeyCode = 0;if(KeyCodeSum = 1; / 按照PS2格式,数据低位在前clock = 1;DATA = 1;if(DATA = 1)KeyCode |= 0x80; / 得到有效的数据位WAITFORKEYBOARDPULSE; / 等待按键发送效验位WAITFORKEYBOARDPULSE; / 等待按键发送终止位while(!clock); / 等待键盘把时钟线拉高switch(KeyCode)case CODE_POST:KeyBoardConnectFlag = 1;break;case CODE_ACK: /键盘应答Order(LedStatus);break;case CODE_ECHO: /键盘的echo回应码 break;case 0xFE:break; case CODE_BREAK: /键盘发送的是断码KeyUpFlag = 1;break;case CODE_EXTEND: /键盘发送的是扩展码if(KeyExtendFlag = 0)KeyExtendFlag = 1;KeyCodeBuffKeyCodeSum = KeyCode;if(KeyCodeSum MAXBUFFER) KeyCodeSum+; break;case CODE_PAUSE: /键盘发送的是Pause键的键码KeyPauseFlag = 1;KeyCodeBuffKeyCodeSum = KeyCode;if(KeyCodeSum MAXBUFFER) KeyCodeSum+;break; case CODE_NUMLOCK:if(KeyPauseFlag = 1 | (KeyMakeCodeFlag = 0 & KeyUpFlag)KeyFlag = 1; /如果是Pause键的键码(E1+14+77)则77代表键码结束直接发送if(KeyMakeCodeFlag = 0) /Pause键发送的键码是(F0+77)KeyCodeBuffKeyCodeSum = CODE_PAUSE;if(KeyCodeSum MAXBUFFER) KeyCodeSum+;KeyCodeBuffKeyCodeSum = 0x14;if(KeyCodeSum MAXBUFFER) KeyCodeSum+;KeyUpFlag = 0;KeyMakeCodeFlag = 0;KeyPauseFlag = 0;break; case CODE_CAPSLOCK:case CODE_SCROLLLOCK: /发送的是三个LED控制键通码KeyLedLockFlag = 1;default: /键盘发送的是通码if(KeyUpFlag = 1) /发送的是断码之后的通码KeyFlag = 1; /有正常键被按下KeyUpFlag = 0; /键弹起标志KeyExtendFlag = 0; /扩展键标志KeyMakeCodeFlag = 0; /键通码标志if(KeyPauseFlag = 1) /Pause键被按下发送的键码是(E1+F0+14) KeyPauseFlag = 0;KeyCodeBuffKeyCodeSum = KeyCode;if(KeyCodeSum MAXBUFFER) KeyCodeSum+;break;if(KeyLedLockFlag = 1)KeyLedLockFlag = 0;switch(KeyCode)case CODE_CAPSLOCK:if(LedStatus & CAPSLOCK_EN)LedStatus &= CAPSLOCK_DIS;elseLedStatus |= CAPSLOCK_EN; break;case CODE_NUMLOCK:if(LedStatus & NUMLOCK_EN)LedStatus &= NUMLOCK_DIS;elseLedStatus |= NUMLOCK_EN;break;case CODE_SCROLLLOCK:if(LedStatus & SCROLLLOCK_EN)LedStatus &= SCROLLLOCK_DIS;elseLedStatus |= SCROLLLOCK_EN; break;Order(0xED); /设置Led/Order(LedStatus);/LedLock(LedStatus); else /通码KeyCodeBuffKeyCodeSum = KeyCode;if(KeyCodeSum = 1; / 按照PS2格式,数据低位在前clock = 1;DATA = 1;if(DATA = 1)KeyCode |= 0x80; / 得到有效的数据位WAITFORKEYBOARDPULSE; / 等待按键发送效验位WAITFORKEYBOARDPULSE; / 等待按键发送终止位while(!clock); / 等待键盘把时钟线拉高if(KeyCode = CODE_POST)KeyBoardConnectFlag = 1;return(KeyCode); / 返回按键扫描/*/函数:Order()/功能:向键盘发送命令/输入:命令/输出:?/描述:/*/void Order(unsigned char orderByte)unsigned char cnt;unsigned char check;/DINT; /关闭总中断,发送命令到键盘clock = 0;DATA = 1;for(cnt = 0xff; cnt != 0; cnt -); / 拉低时钟与数据并延时DATA = 0;clock = 1;for(cnt = 8; cnt != 0; cnt -) / 发送八位数据,循环八次while(clock);if(orderByte & 0x01)DATA = 1; / 根据低位设定输出数据check +; / 如果输出一个1,效验记录数据加一elseDATA = 0;orderByte = 1; / 命令字调整while(!clock); / 输出脉冲while(clock);if(check % 2) / 如果输出过偶数个脉冲DATA = 0; / 效验数据位置1elseDATA = 1; / 否则数据位置0while(!clock);while(clock);DATA = 1;while(!clock); / 发送终止位DATA = 1;clock = 1;while(clock) | (DATA); / 等待ACK握手信号while(!clock);
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。