📄 pckey.c
字号:
/****************************************************************************
* 文 件 名:pckey.c
* 功 能:键盘驱动
* 说 明:将跳线JP23全部短接,JP15跳线全部断开。
****************************************************************************/
#include "config.h"
/****************************************************************************
* 名 称:DelayMS()
* 功 能:短延时
* 入口参数:uint32 no 延时参数
* 出口参数:无
****************************************************************************/
void DelayMS(uint32 no)
{ uint32 i;
for(; no>0; no--)
for(i=0; i<800; i++);
}
/****************************************************************************
* 名 称:SetKeyDatIn()
* 功 能:设置DAT为输入
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetKeyDatIn(void)
{
IO0DIR = IO0DIR & (~KEY_DAT);
}
/****************************************************************************
* 名 称:SetKeyDatOut()
* 功 能:设置DAT为输出
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SetKeyDatOut(void)
{
IO0DIR = IO0DIR | KEY_DAT;
}
void SetKeyClkIn(void)
{
IO0DIR = IO0DIR & (~KEY_CLK);
}
void SetKeyClkOut(void)
{
IO0DIR = IO0DIR | KEY_CLK;
}
/****************************************************************************
* 名 称:WaitKeyClk0()
* 功 能:等待CLK变为低电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void WaitKeyClk0(void)
{
while((IO0PIN&KEY_CLK) == KEY_CLK); // 等待CLK为低电平
}
/****************************************************************************
* 名 称:WaitKeyClk1()
* 功 能:等待CLK变为高电平
* 入口参数:无
* 出口参数:无
****************************************************************************/
void WaitKeyClk1(void)
{
while((IO0PIN&KEY_CLK) == 0); // 等待CLK为高电平
}
/****************************************************************************
* 名 称:SendKeyCmd()
* 功 能:发送键盘命令函数
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SendKeyCmd(uint8 dat)
{ uint8 bitcnt; // 数据(位)计数器
uint8 c_cnt; // 校验字变量
WaitKeyClk1(); // 确认总线正常
SetKeyClkOut(); // 通知键盘,主机要发送命令
CKEY_CLK(); // CLK = 0;
DelayMS(1);
SetKeyDatOut();
CKEY_DAT(); // DAT = 0;
c_cnt = 0;
/* 发送11位数据,会有11个while(CLK==1) */
SetKeyClkIn();
WaitKeyClk0(); // while(CLK==1); 已发送起始位
/* 发送8位命令数据 */
for(bitcnt=0; bitcnt<8; bitcnt++)
{ if((dat&0x01) != 0) // 数据位的判断
{
SKEY_DAT(); // DAT=1;
c_cnt++; // 校验字加1
}
else
{
CKEY_DAT(); // DAT=0;
}
WaitKeyClk1(); // while(CLK==0);
WaitKeyClk0(); // while(CLK==1);
dat = dat>>1; // 对数据位进行移位处理
}
/* 发送C位,即校验位 */
if((c_cnt&0x01) != 0)
{
CKEY_DAT(); // DAT=0;
}
else
{
SKEY_DAT(); // DAT=1;
}
WaitKeyClk1(); // while(CLK==0);
WaitKeyClk0(); // while(CLK==1);
/* 发送停止位 */
SKEY_DAT(); // DAT=1;
WaitKeyClk1(); // while(CLK==0);
WaitKeyClk0(); // while(CLK==1);
SetKeyDatIn(); // 恢复(主机)DAT为输入模式
DelayMS(10);
}
/****************************************************************************
* 名 称:RcvKeyDat()
* 功 能:接收键盘的数据
* 入口参数:无
* 出口参数:uint16 放开按键时,返回值高8位为0xFC
****************************************************************************/
uint16 RcvKeyDat(void)
{ uint16 key;
uint8 i;
key = 0; // 键盘扫描码接收变量初化为0
WaitKeyClk1(); // while(CLK==0);
for(i=0; i<8; i++) // 读取8位数据
{
key = key>>1;
WaitKeyClk0(); // while(CLK==1);
if((IO0PIN&KEY_DAT) == KEY_DAT)
{
key = key+0x80;
}
WaitKeyClk1(); // while(CLK==0);
}
WaitKeyClk0(); // while(CLK==1); 接收校验位
WaitKeyClk1(); // while(CLK==0);
WaitKeyClk0(); // while(CLK==1); 接收完一侦数据11个下降沿,即11位数据0 d0---d7 C 1
WaitKeyClk1(); // while(CLK==0);
if(key==0xF0) // 若是放开码,则不处理
{
WaitKeyClk0(); // while(CLK==1);
WaitKeyClk1(); // while(CLK==0);
for(i=0;i<8;i++) // 8个数据,即8个while(CLK==1)
{
key = key>>1;
WaitKeyClk0(); // while(CLK==1);
if((IO0PIN&KEY_DAT) == KEY_DAT)
{
key = key+0x80;
}
WaitKeyClk1(); // while(CLK==0);
}
key |= 0xF000;
WaitKeyClk0(); // while(CLK==1);
WaitKeyClk1(); // while(CLK==0);
WaitKeyClk0(); // while(CLK==1); 第11位数据
WaitKeyClk1(); // while(CLK==0);
} // end of if(key==0xf0)...
DelayMS(1);
return(key);
}
/****************************************************************************
* 名 称:My_GetCh()
* 功 能:完整获得键值
* 入口参数:无
* 出口参数:uint16 读取到的按键值
****************************************************************************/
uint16 My_GetCh(void)
{
SetKeyDatIn(); // 设置(主机)DAT为输入模式
WaitKeyClk0(); // 等待起动位,第一个CLK下降沿
return(RcvKeyDat());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -