📄 训练项目九:ps2键盘的使用.c
字号:
/****************************************************************************
** File Name: PS/2键盘的使用
** Createed By: Wangchangsong
** Create Date: 07/29/2008
** Version: 1.0
** Descriptions: led display
**
**---------------------------------------------------------------------------
** Modified By:
** Modified Date:
** Version:
** Descriptions:
**
****************************************************************************/
#include <iom128v.h>
#include <lcd.h>
#include <macros.h>
#pragma interrupt_handler ps:6
#define DATA PINE&0x20
unsigned char key = 0;
unsigned char shift = 0;
unsigned char up=0;
unsigned char flag=0;
unsigned char count=0;
unsigned char UnShifted[60][2] = {
0x1C, 97,
0x32, 98,
0x21, 99,
0x23, 100,
0x24, 101,
0x2B, 102,
0x34, 103,
0x33, 104,
0x43, 105,
0x3B, 106,
0x42, 107,
0x4B, 108,
0x3A, 109,
0x31, 110,
0x44, 111,
0x4D, 112,
0x15, 113,
0x2D, 114,
0x1B, 115,
0x2C, 116,
0x3C, 117,
0x2A, 118,
0x1D, 119,
0x22, 120,
0x35, 121,
0x1A, 122,
0x45, 48,
0x16, 49,
0x1E, 50,
0x26, 51,
0x25, 52,
0x2E, 53,
0x36, 54,
0x3D, 55,
0x3E, 56,
0x46, 57,
0x0E, 39,
0x4E, 45,
0x55, 61,
0x5D, 92,
0x29, 32,
0x54, 91,
0x5B, 93,
0x4C, 59,
0x52, 39,
0x41, 44,
0x49, 46,
0x4A, 47,
0x71, 46,
0x70, 48,
0x69, 49,
0x72, 50,
0x7A, 51,
0x6B, 52,
0x73, 53,
0x74, 54,
0x6C, 55,
0x75, 56,
0x7D, 57,
0x0d, 9,
};
unsigned char Shifted[59][2] = {
0x1C, 65,
0x32, 66,
0x21, 67,
0x23, 68,
0x24, 69,
0x2B, 70,
0x34, 71,
0x33, 72,
0x43, 73,
0x3B, 74,
0x42, 75,
0x4B, 76,
0x3A, 77,
0x31, 78,
0x44, 79,
0x4D, 80,
0x15, 81,
0x2D, 82,
0x1B, 83,
0x2C, 84,
0x3C, 85,
0x2A, 86,
0x1D, 87,
0x22, 88,
0x35, 89,
0x1A, 90,
0x45, 48,
0x16, 49,
0x1E, 50,
0x26, 51,
0x25, 52,
0x2E, 53,
0x36, 54,
0x3D, 55,
0x3E, 56,
0x46, 57,
0x0E, 126,
0x4E, 95,
0x55, 43,
0x5D, 124,
0x29, 32,
0x54, 123,
0x5B, 125,
0x4C, 58,
0x52, 34,
0x41, 60,
0x49, 62,
0x4A, 63,
0x71, 46,
0x70, 48,
0x69, 49,
0x72, 50,
0x7A, 51,
0x6B, 52,
0x73, 53,
0x74, 54,
0x6C, 55,
0x75, 56,
0x7D, 57,
};
/****************************************************************************
** Function Name: ps
** Descriptions: read the key
** Input Parameters: void
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void ps (void) /* 读键值 */
{
if((count>0)&&(count<9))
{
flag=0; /* 标志位 */
key=key>>1;
if(DATA)
key|=0x80;
else
key&=0x7f;
}
else
flag=1;
count++;
while(!(PINE&0x10));
if(count>10)
{
count=0;
}
}
unsigned char key_check (unsigned char data) /* 查表,处理键值 */
{
unsigned char i=0;
switch(data)
{
case 0xf0:up=1;return(0);
case 0x12:shift=(up==0)?1:0;return(0);
case 0x59:shift=(up==0)?1:0;return(0);
default:
{
if(up==0)
{
if(shift==0)
{
for(i=0;i<60;i++)
{
if (UnShifted[i][0]==data)
return(UnShifted[i][1]);
}
}
else if(shift==1)
{
for(i=0;i<59;i++)
{
if (Shifted[i][0]==data)
return(Shifted[i][1]);
}
}
}
else
{
up=0;
return(0);
}
}
}
}
/****************************************************************************
** Function Name: main
** Descriptions:
** Input Parameters: void
** Output parameters: void
** Returned Value: void
**---------------------------------------------------------------------------
****************************************************************************/
void main(void)
{
unsigned char a=0;
MCUCR=0; /* MCU控制寄存器 */
SEI();
lcd_init();
DDRE&=0xcf; /* PE4和PE5作输入 */
EIMSK=0x10; /* 外部中断屏蔽寄存器 */
EICRB=0x02; /* 外部中断寄存器B */
lcd_clear();
while(1) /* 显示在液晶显示器上 */
{
a=key_check(key); lcd_putss(0,0,a);}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -