/*
*********************************************************************************************************
*
* 低成本汇率电子显示屏控制系统的开发
* 独立本科段毕业设计
*
* Since 2004 - 2005
* All Rights Reserved.
*
*
*------------------------------------------文件信息------------------------------------------------------
*
* 文件名 : KBI.C (key board interface.)
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
* 描 述 : 软件模拟PS/2键盘接口的驱动程序,占用一个中断和一个I/O引脚,生成 KBI.SRC 文件编译。
*
*------------------------------------------日志记录------------------------------------------------------
*
* 版 本 : V1.00 格式说明: 主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
* 变 更 : 文件建立。
*
*********************************************************************************************************
*/
#include "..\INC\HEADER.H"
/*
*********************************************************************************************************
* 配置参数 *
*********************************************************************************************************
*/
sbit CLK = P3^3; // PS/2 键盘接口的时钟信号。(INT1)
sbit OUT = P3^4; // PS/2 键盘接口的数据信号。(TO)
sbit KEY = P3^4;
/*
*********************************************************************************************************
* 全局变量 *
*********************************************************************************************************
*/
INT8U input, BUF;
UBIT STA, ACK;
INT16U KeyBuf = 0xFFFF;
code INT8U make[256] = {
//00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 00
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, // 10
0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, // 20
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x38, 0x00, // 30
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x39, 0x00, 0x00, 0x2E, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, // 40
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, // 50
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x34, 0x37, 0x00, 0x00, 0x00, // 60
0x30, 0x2E, 0x32, 0x35, 0x36, 0x38, 0x1B, 0x00, 0x00, 0x2B, 0x33, 0x2D, 0x2A, 0x39, 0x00, 0x00, // 70
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 80
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // A0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // B0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // C0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // D0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // E0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // F0
};
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void InitKeyBoard(void);
* 参数表 : none
* 返回值 : none
* 功 能 : PS/2键盘的初始化。
*
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void InitKeyBoard(void)
{
EX1 = 1; // 外部中断使能。
IT1 = 1; // 边沿触发,下降沿有效。
PX1 = 1;
STA = 1;
ACK = 0;
BUF = 0xFF;
input = 0;
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : INT8U GetKey(void);
* 参数表 : none
* 返回值 : 按键值对应的ASCII码。
* 功 能 : 读取按键值。
*
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2004年 09月 15日,星期三
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
INT8U GetKey(void)
{
INT8U cnt;
CloseInt();
cnt = input;
input = 0;
OpenInt();
return make[cnt];
}
/*
*********************************************************************************************************
* 函数说明
*
* 函数名 : void KeyISR(void)
* 参数表 : none
* 返回值 : none
* 功 能 : 键盘按键的中断处理,外部中断INT1。边沿触发,下降沿有效。
*
* 作 者 : li.yao
* 日 期 : 2005年 03月 04日,星期五
*
*-----------------------------------------日志记录-------------------------------------------------------
*
* 版 本 : V1.00 格式说明:主版本号 . 升级版本号 + 内部测试版本号
* 作 者 : li.yao
* 日 期 : 2005年 03月 04日,星期五
* 变 更 : 函数建立。
*
*********************************************************************************************************
*/
void KeyISR(void) interrupt 2 using 2
{
#pragma asm
PUSH ACC
PUSH PSW
MOV ACC, BUF
JNB STA, KEY_PARITY
MOV C, OUT
RRC A
MOV STA, C
MOV BUF, ACC
SJMP KEY_EXIT
KEY_PARITY:
SETB STA
MOV BUF, #0FFH
CJNE A, #0F0H, KEY_SAVE
SETB ACK
SJMP KEY_EXIT
KEY_SAVE:
JNB ACK, KEY_EXIT
CLR ACK
MOV input, ACC
KEY_EXIT:
POP PSW
POP ACC
#pragma endasm
}
/*
*********************************************************************************************************
* 文件结束 *
*********************************************************************************************************
*/
评论0