最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

PS2键盘C51例程

来源:动视网 责编:小OO 时间:2025-09-29 04:45:58
文档

PS2键盘C51例程

/*------------------------------------PS2键盘外部INT1中断服务程序原创:HotPower@126.com------------------------------------*/#include"reg51.h"#defineunsignedcharuchar#defineDEFPS2PUSHCOUNT100//长压最大时间//定义接口sbitPS2CLOC=P3^3;sbitPS2DATA=P3^5;enumPS2B//枚举{ucharPS2Ke
推荐度:
导读/*------------------------------------PS2键盘外部INT1中断服务程序原创:HotPower@126.com------------------------------------*/#include"reg51.h"#defineunsignedcharuchar#defineDEFPS2PUSHCOUNT100//长压最大时间//定义接口sbitPS2CLOC=P3^3;sbitPS2DATA=P3^5;enumPS2B//枚举{ucharPS2Ke
/*------------------------------------

PS2键盘外部INT1中断服务程序

原创: HotPower@126.com

------------------------------------*/

#include"reg51.h"

#define unsigned char uchar

#define DEFPS2PUSHCOUNT 100 //长压最大时间

//定义接口

sbit PS2CLOC=P3^3;

sbit PS2DATA=P3^5;

enum PS2B //枚举

{

uchar PS2KeyTemp; //键盘缓冲区

uchar PS2KeyExtFlage; // 键释放/扩展键标志(小键盘只有回车键)

uchar PS2KeyPopError; //错误

uchar PS2KeyCount; //脉冲计数

uchar PS2KeyVal; //键值值1~20或0x80+(1~20)

uchar PS2KeyPushCount;//长压键计数器清零

uchar PS2KeyMessage;//存键值

}PS2Buffers;

//======================================================

//

void main(void)

{

PS2Buffers.PS2KeyCount == 0;

while(1)

{

;

}

}

//=======================================================

//PS2键盘外部INT1中断服务程序

void int1proc() interrupt IE1_VECTOR using 1

{

uchar i, key;

code unsigned char PS2TAB[] = {//20键PS2小键盘键码表

0x70,//0

0x69,//1

0x72,//2

0x7a,//3

0x6b,//4

0x73,//5

0x74,//6

0x6c,//7

0x75,//8

0x7d,//9

0x05,//F1

0x06,//F2

0x04,//F3

0x0c,//F4

0x03,//F5

0x0b,//F6

0x5a,//Enter

0x76,//Esc

0x66,//Bksp

0x71//KP.

};

if (PS2Buffers.PS2KeyCount == 0) //PS2起始位测试

{

if (!PS2CLOCK && !PS2DATA) //低电平是起始位

{

if (PS2Buffers.PS2KeyExtFlage != 0xf0)

{

PS2Buffers.PS2KeyTemp = 0;

PS2Buffers.PS2KeyExtFlage = 0;

PS2Buffers.PS2KeyPopError = 0;

}

PS2Buffers.PS2KeyCount ++;//脉冲计数

}

else PS2Buffers.PS2KeyPopError = 0xeb;//置键起始位错误号0xeb

}

else if (PS2Buffers.PS2KeyCount < 9) //PS2数据位

{

key = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据

key >>= 1;

if (PS2DATA) key |= 0x80;

PS2Buffers.PS2KeyTemp = key;

PS2Buffers.PS2KeyCount++;//脉冲计数

}

else if (PS2Buffers.PS2KeyCount == 9) //PS2数据奇校验

{

ACC = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据(C51取偶校验位)

if (P != PS2DATA) PS2Buffers.PS2KeyCount ++;//脉冲计数

else

{

PS2Buffers.PS2KeyPopError = 0xec;////置键奇校验位错误号0xec

PS2Buffers.PS2KeyCount = 0;//脉冲计数归零

}

}

else if (PS2Buffers.PS2KeyCount == 10) //停止位

{

key = PS2Buffers.PS2KeyTemp;//取键盘缓冲区移位数据

PS2Buffers.PS2KeyCount = 0;//脉冲计数归零

if (PS2DATA) //高电平是停止位

{

if (key == 0xe0) //本次是扩展键

{

PS2Buffers.PS2KeyExtFlage = 0xe0;//置扩展键标志(小键盘只有回车键)

}

else if (key == 0xf0) //本次是键断码,键释放

{

PS2Buffers.PS2KeyExtFlage = 0xf0;//置键释放标志

}

else //本次必为键值

{

if ((key == 0xaa) || (key == 0xfa))

PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零

else

{

PS2CLOCK = 0;//阻止PS2键盘立即回送数据

PS2Buffers.PS2KeyPopError = 0xaa;//出错码

for (i = 0; i < 20; i++)

{

if (key == (PS2TAB[i])) //搜索

{

key = i + 1;

if (PS2Buffers.PS2KeyExtFlage == 0xf0)

{

key |= 0x80;//键释放

PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零

PS2Buffers.PS2KeyMessage = key;//存入当前键值并执行命令

}

else

{

if (key != PS2Buffers.PS2KeyVal) //换了一个键

{

PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零

PS2Buffers.PS2KeyMessage = key;//存入当前键值并执行命令

}

else //未换键

{

PS2Buffers.PS2KeyPushCount ++;//长压键计数器计数

if (PS2Buffers.PS2KeyPushCount > DEFPS2PUSHCOUNT) //长压时间到

{

PS2Buffers.PS2KeyMessage = key | 0x40;//存入当前键值并执行命令

PS2Buffers.PS2KeyPushCount = 0;//长压键计数器清零

}

}

}

PS2Buffers.PS2KeyVal = key;//存入当前键值值1~20或0x80+(1~20)

PS2Buffers.PS2KeyTemp = 0;//键码移位记录器

PS2Buffers.PS2KeyExtFlage = 0;//扩展键标志

PS2Buffers.PS2KeyPopError = 0;//键释放标志或出错码

break;

}

}

//如果出错长压键计数

if (PS2Buffers.PS2KeyPopError) PS2Buffers.PS2KeyPushCount = 0;器清零

PS2CLOCK = 1;//释放PS2时钟总线

}

}

}

else PS2Buffers.PS2KeyPopError = 0xed;//置停止位错误号0xed

}

else PS2Buffers.PS2KeyCount = 0;//PS2键盘出错

}

文档

PS2键盘C51例程

/*------------------------------------PS2键盘外部INT1中断服务程序原创:HotPower@126.com------------------------------------*/#include"reg51.h"#defineunsignedcharuchar#defineDEFPS2PUSHCOUNT100//长压最大时间//定义接口sbitPS2CLOC=P3^3;sbitPS2DATA=P3^5;enumPS2B//枚举{ucharPS2Ke
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top