📄 ps2keybroad.c
字号:
#include"AO_Display.H"
sbit Key_Data = P2^0;//定义Keyboard数据端口引脚
sbit Key_CLK = P3^2; //中断端口,时钟线
unsigned char CharBuffer[];
unsigned char CharConter; //记录CHARBUFFER里面的字母值
unsigned char KeyV=0; //键值
unsigned char BF = 0; //标识是否有字符被收到
unsigned char IntNum = 0; //中断次数计数
unsigned char KeyBoardInData = 200;
bit dx=0; //大小写标志 dx==1时大写状态
extern unsigned char XOffset;
extern unsigned char YOffset;
extern unsigned char Scale;
void Decode( void );
/***********************************************************
函数名称:
函数功能:
入口参数:
出口参数:
备 注:
***********************************************************/
void Keyboard_out() interrupt 0//键盘中断处理 键值存储在 KeyV 中
{
if ((IntNum>0) && (IntNum <9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data) //当键盘数据线为1时
{KeyV = KeyV | 0x80;} //存储一位
}
IntNum++; //中断次数加一(中断一次接收一位数据)
while (Key_CLK == 0); //等待PS/2CLK拉高
if (IntNum>10) //中断33次后数据发送完毕,舍弃了通码和断码
{
IntNum = 0;
BF = 1; //标识有字符输入完了
EX0 = 0;
}
}
/***********************************************************
函数名称:
函数功能:
入口参数:
出口参数:
备 注:
***********************************************************/
void PS2KeybroadInit( void )
{
EA = 1;
EX0 = 1;
}
/***********************************************************
函数名称:KeyboardDecode
函数功能:把PS/2键盘的数据解码
入口参数:
出口参数:
备 注:
***********************************************************/
void KeyboardDecode( void ) //键值处理
{
unsigned char i;
unsigned char TempCyc;
if(BF)
{
TempCyc = KeyV;
BF = 0; //准备下一次接收
switch ( TempCyc ) //键值与显示字符的对应关系
{
case 0x45: KeyBoardInData = 0; break; //0
case 0x16: KeyBoardInData = 1; break; //1
case 0x1e: KeyBoardInData = 2; break; //2
case 0x26: KeyBoardInData = 3; break; //3
case 0x25: KeyBoardInData = 4; break; //4
case 0x2e: KeyBoardInData = 5; break; //5
case 0x36: KeyBoardInData = 6; break; //6
case 0x3d: KeyBoardInData = 7; break; //7
case 0x3e: KeyBoardInData = 8; break; //8
case 0x46: KeyBoardInData = 9; break; //9
case 0x1c: KeyBoardInData =10; break; //a
case 0x32: KeyBoardInData =11; break; //b
case 0x21: KeyBoardInData =12; break; //c
case 0x23: KeyBoardInData =13; break; //d
case 0x24: KeyBoardInData =14; break; //e
case 0x2b: KeyBoardInData =15; break; //f
case 0x34: KeyBoardInData =16; break; //g
case 0x33: KeyBoardInData =17; break; //h
case 0x43: KeyBoardInData =18; break; //i
case 0x3b: KeyBoardInData =19; break; //j
case 0x42: KeyBoardInData =20; break; //k
case 0x4b: KeyBoardInData =21; break; //l
case 0x3a: KeyBoardInData =22; break; //m
case 0x31: KeyBoardInData =23; break; //n
case 0x44: KeyBoardInData =24; break; //o
case 0x4d: KeyBoardInData =25; break; //p
case 0x15: KeyBoardInData =26; break; //q
case 0x2d: KeyBoardInData =27; break; //r
case 0x1b: KeyBoardInData =28; break; //s
case 0x2c: KeyBoardInData =29; break; //t
case 0x3c: KeyBoardInData =30; break; //u
case 0x2a: KeyBoardInData =31; break; //v
case 0x1d: KeyBoardInData =33; break; //x
case 0x22: KeyBoardInData =34; break; //y
case 0x35: KeyBoardInData =34; break; //y
case 0x1a: KeyBoardInData =35; break; //z
case 0x4c: KeyBoardInData =63; break; //;
/*
case 0x7b: KeyBoardInData =67; break; //- 小键盘
case 0x79: KeyBoardInData =68; break; //+ 小键盘
case 0x6b: KeyBoardInData =69; break; //左 小键盘
case 0x74: KeyBoardInData =70; break; //右 小键盘
case 0x75: KeyBoardInData =71; break; //上 小键盘
case 0x72: KeyBoardInData =72; break; //下 小键盘
*/
case 0x7b: if(Scale > 1)Scale--;KeyBoardInData=200;break; //缩小
case 0x79: if(Scale < 4)Scale++;KeyBoardInData=200;break; //放大
case 0x6b: XOffset=XOffset-5;KeyBoardInData=200;break; //左移
case 0x74: XOffset=XOffset+5;KeyBoardInData=200;break; //右移
case 0x75: YOffset=YOffset+5;KeyBoardInData=200;break; //上移
case 0x72: YOffset=YOffset-5;KeyBoardInData=200;break; //下移
case 0x66: KeyBoardInData= 99; break; //回删键
case 0x29: KeyBoardInData= 98; break; //空格键
case 0x5a: KeyBoardInData=100; break; //回车键
case 0x58: KeyBoardInData=101; break; //大小写控制键Caps lock
case 0x76: KeyBoardInData=103; break; //ESC
}
if(KeyBoardInData<35) //增加字符程序
{
if(CharConter<8)
{
CharBuffer[CharConter] = KeyBoardInData;
CharConter++;
}
else
{
for(i=0;i<8;i++)
{
CharBuffer[i] = 200;
}
CharConter = 0;
CharBuffer[CharConter] = KeyBoardInData;
CharConter ++;
}
}
if(KeyBoardInData == 99) //回删处理
{
if(CharConter)
{
CharConter--;
CharBuffer[CharConter] = 200;
}
}
if(KeyBoardInData == 98)
{
if(CharConter<8)
CharConter++;
else
{
for(i=0;i<8;i++)
{
CharBuffer[i] = 200;
}
CharConter = 1;
}
}
SentChar(KeyV);
Delay(50000);
EX0 = 1;
}
}
/***********************************************************
函数名称:
函数功能:
入口参数:
出口参数:
备 注:
***********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -