📄 ch452.c
字号:
/********************************************************************************************
CH452驱动程序
与单片机接口方式:4线
********************************************************************************************/
#include <reg52.h>
#include <intrins.h>
#include "ch452.h"
#include "work.h"
/********************************************************************************************
初始化
********************************************************************************************/
void InitCh452()
{
WrietCh452(CH452_SYSON2); //打开键盘、显示,有按键按下时产生低电平中断
WrietCh452(CH452_BCD); //设置BCD译码方式
ENABLE_INTERRUPT; //打开键盘中断
}
/********************************************************************************************
向CH452发送指令和数据
da;指令和数据
********************************************************************************************/
void WrietCh452(uint da)
{
uint iq0;
DISABLE_INTERRUPT; //关闭键盘中断
CH452_LOAD_CLR; //复位LOAD信号
for(iq0=0;iq0<12;iq0++)
{
if((da&0x1)==1)
CH452_DIN_SET;
else
CH452_DIN_CLR;
CH452_DCLK_CLR;
da >>=1;
CH452_DCLK_SET; //CH452上升沿读取数据
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DelayUs();
ENABLE_INTERRUPT; //打开键盘中断
}
/***************************************************************************************
从CH452读取按键值
返回:读取的按键值
***************************************************************************************/
uint ReadCh452()
{
uchar q0;
uchar cmd,keycode; //定义命令字,和数据存储器
DISABLE_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
cmd=0x07; //输入读451命令字
CH452_LOAD_CLR;
for(q0=0;q0<4;q0++)
{
if ((cmd&0x1)==1)
CH452_DIN_SET;
else
CH452_DIN_CLR; //输出位数据
CH452_DCLK_CLR;
cmd>>=1; //向右移一位
CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据
}
CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除按键码
for(q0=0;q0<7;q0++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
keycode|=CH452_DOUT; //从高到低读入451的数据
CH452_DCLK_CLR; //产生时钟下降沿通知CH451输出下一位
CH452_DCLK_SET;
}
CLEAR_INTER_FLAG; //清中断标志
ENABLE_INTERRUPT;
return(keycode); //返回键值
}
/***************************************************************************************
按键中断函数
***************************************************************************************/
void IntKey() interrupt 2
{
uchar key;
key=ReadCh452();
DoWork(key);
}
/***************************************************************************************
延时
***************************************************************************************/
void DelayUs()
{
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -