📄 ch452.h
字号:
#ifndef ch452_H
#define ch452_H
/********************************************************************************************
CH452驱动程序
与单片机接口方式:4线
********************************************************************************************/
typedef unsigned int uint;
typedef unsigned char uchar;
uint Led_seg[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x02,0x01}; //*0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,-,.的字符码*/
uint Bitmap[]={0xc00,0xd00,0xe00,0xf00,0x800,0x900,0xa00,0xb00}; //显示用位码列表
//管脚定义
#define CH452_DCLK RD0 // 串行数据时钟上升沿激活
#define CH452_DIN RD1 // 串行数据输出,接CH452的数据输入
#define CH452_LOAD RD2 // 串行命令加载,上升沿激活
#define CH452_DOUT RB0 // INT0,键盘中断和键值数据输入,接CH452的数据输出
// 4线接口的位操作,与单片机有关
#define CH452_DCLK_SET (CH452_DCLK=1)
#define CH452_DCLK_CLR (CH452_DCLK=0)
#define CH452_DIN_SET (CH452_DIN=1)
#define CH452_DIN_CLR (CH452_DIN=0)
#define CH452_LOAD_SET (CH452_LOAD=1)
#define CH452_LOAD_CLR (CH452_LOAD=0)
// 与单片机有关,与中断连接方式有关
#define DISABLE_INTERRUPT (INTE=0)
#define ENABLE_INTERRUPT (INTE=1)
#define CLEAR_INTER_FLAG (INTF=0)
//命令码
#define CH452_NOP 0x0000 // 空操作
#define CH452_RESET 0x0201 // 复位
#define CH452_LEVEL 0x0100 // 加载光柱值
#define CH452_CLR_BIT 0x0180 // 段位清0
#define CH452_SET_BIT 0x01C0 // 段位置1
#define CH452_SLEEP 0x0202 // 进入睡眠状态
#define CH452_LEFTMOV 0x0300 //设置移动方式-左移
#define CH452_LEFTCYC 0x0301 //设置移动方式-左循
#define CH452_RIGHTMOV 0x0302 //设置移动方式-右移
#define CH452_RIGHTCYC 0x0303 //设置移动方式-右循
#define CH452_SELF_BCD 0x0380 //自定义BCD码
#define CH452_SYSOFF 0x0400 //关显示、键盘(设置系统参数)
#define CH452_SYSON1 0x0401 //开显示 (设置系统参数)
#define CH452_SYSON2 0x0423 //开显示、键盘 (设置系统参数)
#define CH452_SYSON2W 0x0423 //开显示、键盘, 真正2线接口 (设置系统参数)
#define CH452_DSP 0x0500 //设置默认显示方式 (设置显示参数)
#define CH452_BCD 0x0580 //设置BCD译码方式
#define CH452_TWINKLE 0x0600 //设置闪烁控制
#define CH452_GET_KEY 0x0700 // 获取按键
/***************************************************************************************
延时
***************************************************************************************/
void DelayUs()
{
asm("nop");
asm("nop");
asm("nop");
}
/********************************************************************************************
向CH452发送指令和数据
da;指令和数据
********************************************************************************************/
void WrietCh452(uint da)
{
uint iq0;
//DISABLE_INTERRUPT; //关闭键盘中断
CH452_LOAD_CLR; //复位LOAD信号
for(iq0=0;iq0<12;iq0++)
{
if((da&0x0001)==1)
CH452_DIN_SET;
else
CH452_DIN_CLR;
CH452_DCLK_CLR;
da >>=1;
CH452_DCLK_SET; //CH452上升沿读取数据
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DelayUs();
//ENABLE_INTERRUPT; //打开键盘中断
}
/********************************************************************************************
初始化
********************************************************************************************/
void InitCh452()
{
WrietCh452(CH452_SYSON2); //打开显示
WrietCh452(CH452_DSP); //设置默认方式
//Display_Reset();
}
/*--------------------------------------------------------------------------------------------
单个位上显示数据
---------------------------------------------------------------------------------------------*/
void Bit_Display_Num(uint bite,uint buf)
{
WrietCh452(Bitmap[bite]+Led_seg[buf]);
}
/****************************************************************
显示复位
****************************************************************/
void Display_Reset()
{
WrietCh452(0x201);
}
/*--------------------------------------------------------------------------------------------
单个位的闪烁操作
---------------------------------------------------------------------------------------------*/
void Flash_SingleBit(uint bitnumber)
{
WrietCh452(CH452_TWINKLE+(0x01<<bitnumber));
}
/*--------------------------------------------------------------------------------------------
全闪操作
---------------------------------------------------------------------------------------------*/
void Flash_AllBit()
{
WrietCh452(CH452_TWINKLE+0xff);
}
/***************************************************************************************
从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); //返回键值
}
/********************************************************************************************
向CH452发送指令和数据
da;指令和数据
中断使用
********************************************************************************************/
void intWrietCh452(uint da)
{
uint iq0;
//DISABLE_INTERRUPT; //关闭键盘中断
CH452_LOAD_CLR; //复位LOAD信号
for(iq0=0;iq0<12;iq0++)
{
if((da&0x0001)==1)
CH452_DIN_SET;
else
CH452_DIN_CLR;
CH452_DCLK_CLR;
da >>=1;
CH452_DCLK_SET; //CH452上升沿读取数据
}
CH452_LOAD_SET; //加载数据,LOAD上升沿
DelayUs();
//ENABLE_INTERRUPT; //打开键盘中断
}
/*--------------------------------------------------------------------------------------------
单个位上显示数据
---------------------------------------------------------------------------------------------*/
void intBit_Display_Num(uint bite,uint buf)
{
intWrietCh452(Bitmap[bite]+Led_seg[buf]);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -