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

📄 ch452.c

📁 该源码与书本配套
💻 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 + -