📄 ps2keybord.c
字号:
/******************************************************************************
* File Name: PS2KeyBord.c *
* Create Time: 2007/07/30 *
* Description: *
* Copyright : *
* History : *
* |---Data---|---Author---|--Version--|--------------Description-------------|
*****************************************************************************/
#define PSKEYBORD_ONOFF
#ifdef PSKEYBORD_ONOFF
/******************************
* Head File *
*****************************/
#include"PS2KeyBord.h"
/******************************
* Global Variable *
*****************************/
uchar g_ucPSkeydata = 0x00; //按下键的通码值
uchar ucRecBuf_ptr=0x00; //键盘按下键数据的缓冲区指针
uchar ucRecBuf[11]; //从键盘接收数据的缓冲区
uchar cntOddNum = 0x00;// 奇校验中‘1’的个数
/******************************
* Function Implement *
*****************************/
/*******************************************************************************
Function Name: 数据接收函数 *
Input Parameter : *
Output Parameter : *
Function Description : 接收从键盘输入的11位数据 *
*******************************************************************************/
void DataReceive(void)
{
if(ucRecBuf_ptr<=0x0a)
{
if(P3_2 == 0)
{ucRecBuf[ucRecBuf_ptr] = P3_7;
ucRecBuf_ptr++; }
else return;
}
else
{
GetData();
ucRecBuf_ptr = 0x00;
}
}
/*******************************************************************************
Function Name: 奇校验函数 *
Input Parameter : *
Output Parameter : *
Function Description : 对收到的数据进行校验和检验,防止数据出错 *
*******************************************************************************/
uchar oddCheck(void)
{
uchar tmp;
for(tmp=0;tmp<9;tmp++)
{
if(ucRecBuf[tmp+1]==0x01)
cntOddNum++;
}
if(cntOddNum%2 == 1)
return TURE;
else return FALSE;
}
/*******************************************************************************
Function Name: 返回通码值函数 *
Input Parameter : *
Output Parameter : *
Function Description : 通过函数得到键盘按下的键的通码值 *
*******************************************************************************/
uchar PSkeydata_value(void)
{
return g_ucPSkeydata;
}
/*******************************************************************************
Function Name: 通码拾取函数 *
Input Parameter : *
Output Parameter : *
Function Description : 从接收的11位数据中抽取出8位通码 *
*******************************************************************************/
void GetData(void)
{
uchar tmp,tmp2;
if(oddCheck())
{
tmp2 = g_ucPSkeydata;
g_ucPSkeydata = 0x00;
for(tmp=0;tmp<0x08;tmp++)
{
g_ucPSkeydata |= ucRecBuf[tmp+1]<<tmp;
}
if(g_ucPSkeydata == 0xf0)
g_ucPSkeydata = tmp2;
}
}
/*******************************************************************************
Function Name: PS键盘中断0初始化函数 *
Input Parameter : *
Output Parameter : *
Function Description : 从接收的11位数据中抽取出8位通码 *
*******************************************************************************/
void Int0_init_PSkeybord(void)
{
TMOD = 0x01; //选择定时/计数器0,做定时器用,选择模式1,THx和TLx构成全16位计数器
TL0 = 0x00; //定时器中断时间为2.5ms
TH0 = 0xee; //65536 - 0.0025/(12/22118400)=X,反解求出
TR0 = 0x01; //开启定时器0
IE = 0x83; //允许全局中断,允许定时器/计数器0溢出中断
PT1 = 0x00;
PX0 = 0x01;
}
#endif
/*******************************************************************************
* The end of the entire file *
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -