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

📄 ch452.h

📁 PIC单片机控制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 + -