您的位置 首页 观点

PS/2处理C51头文件

/**********************中文版本*******************************//*****功能描述:PS/2键盘应用头文件(中断处理)*****//*****调

/**********************中文版别*******************************/

/*****功用描绘 : PS/2键盘运用头文件(中止处理) *****/
/*****调试渠道 : 51单片机 11.0592M晶振 *****/
/*****作 者 : 郑文(ClimberWin) *****/
/*****编写日期 : 2009年10月5日 *****/
/*****版别信息 : V1.0 *****/
/*****修正日期 : *****/
/*************************************************************/
#ifndef __C51_PS_2_H__
#define __C51_PS_2_H__

#include
#define uchar unsigned char
#define uint unsigned int
///////////////数据界说////////////////////////////////////
sbit PS2_key_Data= P2^0; //界说PS2 Data引脚
sbit PS2_key_CLK =P3^3; //界说PS2 Clk 引脚
bit PS2_flag=0; //是否有PS/2按键数据接纳标志位
bit PS2_key_UP=0, Shift=0;//PS2_key_UP是否松开标识位,是否Shift键按下标识位
uchar clk_num = 0; //中止次数计数,用于判别接纳数据的位数
uchar PS2_data; //键值存储地址
uchar LCD1602_cursor = 0; //显现光标方位
///////////////运用函数界说///////////////////////////////////
void PS2_decode(unsigned char PS2_Code);
///////////////数据接纳子程序(中止处理)////////////////////////
//键盘协议一帧包括11位的串行协议
//bit1 :START=0
//bit2-9:数据位DATA0-DATA7
//bit10 :奇偶校验位
//bit11 :STOP=1
void PS2_data_receive(void) interrupt 2
{
clk_num++;//中止次数加1
if ((clk_num>1) && (clk_num<10))
{
if(PS2_key_Data==0) //位0接纳保存
{PS2_data=PS2_data>>1 | 0x00;}
else //位1接纳保存
{PS2_data=PS2_data>>1 | 0x80;}

}
while (!PS2_key_CLK); //等候PS/2CLK拉高
if (clk_num > 10) //当中止11次后表明一帧数据收完
{
clk_num = 0; //清计数值
PS2_flag = 1; //翻开键值标志位
EA = 0; //关中止
}
}
//////////////////////键值处理子程序///////////////////////////////
void PS2_decode(unsigned char PS2_Code) //留意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也便是说shift的通码+G的通码+shift的断码+G的断码
{
uchar tab_num;

if (PS2_key_UP==0) //初始状态下
{
switch (PS2_Code)
{
case 0xF0 :// 当收到0xF0,PS2_key_UP置1表明断码开端
PS2_key_UP = 1;
break;

case 0x12 :// 左 SHIFT
Shift = 1;
break;

case 0x59 :// 右 SHIFT
Shift = 1;
break;

default:

if(!Shift)//假如SHIFT没按下
{
for (tab_num = 0;(UnShifted[tab_num][0]!=PS2_Code)&&(tab_num<59); tab_num++); //查表显现
if (UnShifted[tab_num][0] == PS2_Code) //按键处理程序
}
else //按下SHIFT
{
for(tab_num = 0; (Shifted[tab_num][0]!=PS2_Code)&&(tab_num<59); tab_num++); //查表显现
if (Shifted[tab_num][0] == PS2_Code) //按键处理程序

}

break;
}
}
else //当PS2_key_UP==1,也便是按键弹起来后。
{
PS2_key_UP = 0; //清标志位
if(PS2_Code==0x12 || PS2_Code==0x59) Shift = 0;//当有SHIFT键按下过期,需求清零
}
PS2_flag = 0; //标识字符处理完了
}

#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/267210.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部