PS/2處理C51頭文件
/*****功能描述 : PS/2鍵盤應(yīng)用頭文件(中斷處理) *****/
/*****調(diào)試平臺 : 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
///////////////數(shù)據(jù)定義////////////////////////////////////
sbit PS2_key_Da
sbit PS2_key_CLK =P3^3; //定義PS2 Clk 引腳
bit PS2_flag=0; //是否有PS/2按鍵數(shù)據(jù)接收標志位
bit PS2_key_UP=0, Shift=0;//PS2_key_UP是否松開標識位,是否Shift鍵按下標識位
uchar clk_num = 0; //中斷次數(shù)計數(shù),用于判斷接收數(shù)據(jù)的位數(shù)
uchar PS2_da
uchar LCD1602_cursor = 0; //顯示光標位置
///////////////使用函數(shù)定義///////////////////////////////////
void PS2_decode(unsigned char PS2_Co
///////////////數(shù)據(jù)接收子程序(中斷處理)////////////////////////
//鍵盤協(xié)議一幀包含11位的串行協(xié)議
//bit1 :START=0
//bit2-9:數(shù)據(jù)位DA
//bit10 :奇偶校驗位
//bit11 :STOP=1
void PS2_da
{
clk_num++;//中斷次數(shù)加1
if ((clk_num>1) && (clk_num<10))
{
if(PS2_key_Da
{PS2_da
else //位1接收保存
{PS2_da
}
while (!PS2_key_CLK); //等待PS/2CLK拉高
if (clk_num > 10) //當(dāng)中斷11次后表示一幀數(shù)據(jù)收完
{
clk_num = 0; //清計數(shù)值
PS2_flag = 1; //打開鍵值標志位
EA = 0; //關(guān)中斷
}
}
//////////////////////鍵值處理子程序///////////////////////////////
void PS2_decode(unsigned char PS2_Co
{
uchar tab_num;
if (PS2_key_UP==0) //初始狀態(tài)下
{
switch (PS2_Co
{
case 0xF0 :// 當(dāng)收到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_Co
if (UnShifted[tab_num][0] == PS2_Co
}
else //按下SHIFT
{
for(tab_num = 0; (Shifted[tab_num][0]!=PS2_Co
if (Shifted[tab_num][0] == PS2_Co
}
break;
}
}
else //當(dāng)PS2_key_UP==1,也就是按鍵彈起來后。
{
PS2_key_UP = 0; //清標志位
if(PS2_Co
}
PS2_flag = 0; //標識字符處理完了
}
#endif
評論