📄 keydrv.c
字号:
#include "KeyDrv.h"
volatile uint8 key_buf[KEYBUFSIZE];
volatile uint8 key_buf_head;
volatile uint8 key_buf_tail;
//*******************************************
//函数名称:void CH452WriteData(unsigned short cmd)
//函数功能:写命令到CH452L
//形式参数:cmd
//行参说明:HC452执行命令
//返回参数:无
//使用说明:无
//*******************************************
void CH452WriteData( uint16 cmd ) reentrant
{
uint8 i = 0;
for(i = 0;i < 12;i++)
{
if(cmd & 1)
KEYDIN = 1;
else
KEYDIN = 0;
KEYDCLK = 0;
cmd >>= 1;
KEYDCLK = 1;
}
KEYLOAD = 0;
KEYLOAD = 1;
}
//*******************************************
//函数名称: CH452ReadKey
//函数功能:读键值到 key_buf
//形式参数:无
//行参说明:无
//返回参数:无
//使用说明:void
//*******************************************
uint8 CH452ReadKey(void) reentrant
{
uint8 i, keytemp = 0;
CH452WriteData( CH452CMD_READ ); //发送读命令
for(i = 0;i < 7;i++)
{
keytemp <<= 1;
if( KEYDOUT )
keytemp++;
KEYDCLK = 0;
KEYDCLK = 1;
}
return keytemp;
}
//*******************************************
//函数名称: CH452SetKeybuf
//函数功能: 有按键按下,重新设置按键接收缓冲区
//形式参数:无
//行参说明:无
//返回参数:无
//使用说明:void
//*******************************************
uint8 CH452SetKeybuf(void)
{
if( (key_buf_head+1) == key_buf_tail ) //缓冲区满,返回假
return _FLASE;
if( KEYBUFSIZE == (key_buf_head+1) )
{
if(0 == key_buf_tail)
return _FLASE;
}
key_buf[key_buf_head] = CH452ReadKey() + 1;
key_buf_head++;
if( KEYBUFSIZE == key_buf_head )
key_buf_head = 0;
return _TRUE;
}
//*******************************************
//函数名称:中断服务函数
//函数功能:中断服务
//形式参数:无
//行参说明:无
//返回参数:无
//使用说明:无
//*******************************************
void INTX7ISR(void) interrupt 19 //using 3
{
CH452SetKeybuf();
//突然想到的一个问题 单片机检测P37脚的电平变化
//在接收数据期间 P37脚上的电平可以会变化多次
//这样会重新置位 外部中断7标志位
//所以有必要退出中断时清一次 标志位
P3IF = 0x00;
}
/********************************************
* 名称:CH452Init()
* 功能:初始化CH452,初始单片机外部中断
* 入口参数:无
* 出口参数:无
* 说明:
*********************************************/
void CH452Init(void)
{
// 关于 外部中断的配置已在系统初始化文件中全局配置
P3IF = 0x00; // 清空中断标志位 外部中断7 下降沿触发
//CH452WriteData(CH452CMD_INIT); //HC452 复位
//_delay_us(30); //复位执行的30us内HC452不接收其它指令
CH452WriteData(CH452CMD_CONTROL);
}
//******************************************************
//函数名称: GetKey()
//函数功能: 得到按键值
//形式参数: mode 得到按键值的模式
//返回参数: key 当前键值
//使用说明:
// 1 == mode , 等待直到有键按下为止
// 0 == mode , 只读一次,如果没有键按下返回假
// 2 == mode, 读取判断按键是否一直接下
// 使用 GetKey( 2 ) 可参考如下代码
// while( KEY_RELEASED != GetKey(2) )
// {
// if( KEY_RELEASED != (keytemp = GetKey(2) )
// .............
// }
//*******************************************************
uint8 GetKey( uint8 mode )
{
if( 0 == mode )
{
if( KEYBUFSIZE == key_buf_tail )
key_buf_tail = 0;
if( key_buf_head == key_buf_tail )
return _FLASE;
else
return key_buf[key_buf_tail++] & 0x3f ;
}
else if( 1 == mode )
{
if( KEYBUFSIZE == key_buf_tail )
key_buf_tail = 0;
while( key_buf_head == key_buf_tail );
return key_buf[key_buf_tail++] & 0x3f ; //返回值与 0x3f 相与的原因是去掉第7位状态位
}
else if( 2 == mode )
{
uint8 keytemp, i;
if( KEYBUFSIZE == key_buf_tail )
key_buf_tail = 0;
while( key_buf_head == key_buf_tail );
for(i=0; i<4; i++) //不得不如此
keytemp = CH452ReadKey( );
if( keytemp & 0x40 )
{
return (keytemp & 0x3f)+1;
}
else
{
key_buf_tail = key_buf_head = 0;
return KEY_RELEASED;
}
}
else
return _FLASE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -