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

📄 keydrv.c

📁 C8051F020单片机 CH452 键盘管理
💻 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 + -