⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbi.c

📁 基于8051单片机的模拟PS/2键盘的驱动程序
💻 C
字号:
/*
*********************************************************************************************************
*                                                                                                         
*                             低成本汇率电子显示屏控制系统的开发
*                                     独立本科段毕业设计
*  
*                                     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
}

/*
*********************************************************************************************************
*                                          文件结束                                                     *
*********************************************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -