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

📄 ch452.c

📁 自己写的CH452的驱动
💻 C
字号:
#include <STC89C51RC_RD_PLUS.H>
#include <intrins.h>
#include <io_define.h>
#include <define.h>



#define CMD_NOP             0x0000   // 空操作
#define CMD_LEVEL           0x0100   // 加载光柱值
#define CMD_SEG_CLERA       0x0180   // 段位寻址清零
#define CMD_SEG_SET         0x01c0   // 段位寻址置位
#define CMD_RESET           0x0201   // 芯片内部复位
#define CMD_SLEEP           0x0202   // 进入睡眠状态
#define CMD_LEFT_SHIFT      0x0300   // 字数据左移
#define CMD_RIGHT_SHIFT     0x0302   // 字数据右移
#define CMD_LEFT_LOOP       0x0301   // 字数据左循环
#define CMD_RIGHT_LOOP      0x0303   // 字数据右循环
#define CMD_DEFINE_BCD      0x0380   // 自定义BCD码
#define CMD_SET_SYS         0x0400   // 设定系统参数
#define DISP_ENABLE         0x0001   // 显示驱动功能使能
#define DISP_DISABLE        0x0000   // 显示驱动功能关闭
#define KEY_SCAN_ENABLE     0x0002   // 键盘扫描功功能使能
#define KEY_SCAN_DISABLE    0x0000   // 键盘扫描功功能关闭
#define DPLR_LOW            0x0000   // 字驱动DIG 输出极性为低
#define DPLR_HIGH           0x0008   // 字驱动DIG 输出极性为高
#define SSPD_LOW            0x0000   // 闪烁速度低速(约1Hz)
#define SSPD_HIGH           0x0010   // 闪烁速度高速(约2Hz)
#define INTM_LEVEL          0x0000   // 按键中断输出方式:低电平有效(电平或边沿中断)
#define INTM_PULSE          0x0020   // 按键中断输出方式:低电平脉冲(边沿中断)

#define CMD_SET_DISPLAY     0x0500   // 设定显示参数
#define DECODE_MODE         0x0080   // BCD 译码方式
#define NO_DECODE_MODE      0x0000   // 不译码方式
#define SCAN_LIMIT_1        0x0010   // 扫描极限为 1 
#define SCAN_LIMIT_2        0x0020   // 扫描极限为 2
#define SCAN_LIMIT_3        0x0030   // 扫描极限为 3
#define SCAN_LIMIT_4        0x0040   // 扫描极限为 4
#define SCAN_LIMIT_5        0x0050   // 扫描极限为 5 
#define SCAN_LIMIT_6        0x0060   // 扫描极限为 6
#define SCAN_LIMIT_7        0x0070   // 扫描极限为 7
#define SCAN_LIMIT_8        0x0000   // 扫描极限为 8
#define CMD_SET_FLASH       0x0600   // 设定闪烁参数
#define CMD_LOAD_DATA0      0x0800   // 加载字数据 0
#define CMD_LOAD_DATA1      0x0900   // 加载字数据 1
#define CMD_LOAD_DATA2      0x0a00   // 加载字数据 2
#define CMD_LOAD_DATA3      0x0b00   // 加载字数据 3
#define CMD_LOAD_DATA4      0x0c00   // 加载字数据 4
#define CMD_LOAD_DATA5      0x0d00   // 加载字数据 5
#define CMD_LOAD_DATA6      0x0e00   // 加载字数据 6
#define CMD_LOAD_DATA7      0x0f00   // 加载字数据 7
#define CMD_READ_KEY_CODE   0x0700   // 读按键码


bit bBusStatus;

extern bit bKeyStroke,bSecFlash;


void delay()
{
	unsigned char i;

	for(i=0;i<6;i++)
		_nop_();
}



void send_cmd_to_CH452(unsigned char cCh,unsigned int iCmd)
{
	unsigned char i;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	bCh452Dclk = 0;
	if(!cCh)
		bCh452Load1 = 0;
	else
		bCh452Load2 = 0;

	for(i=0;i<12;i++)
	{
		if(iCmd & 0x0001)
			bCh452Din = 1;
		else 
			bCh452Din = 0;
		bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
		iCmd = _iror_(iCmd,1);
		bCh452Dclk = 1;
	}
	if(!cCh)
		bCh452Load1 = 1;
	else
		bCh452Load2 = 1;              // 锁存数据到 CH452           
	delay();                          // 命令数据加载周期不小于6US

	bBusStatus = BUS_IDLE;
}

void delay_ms(unsigned char i)
{	unsigned int	j;
	do{	for(j=0;j!=1000;j++)
		{;}
	}while(--i);
}


void init_ch452()
{
	unsigned int iCmd;

	bCh452Reset = 1;
	delay_ms(2);
	bCh452Reset = 0;
	delay_ms(10);


	iCmd = CMD_SET_SYS | DISP_ENABLE | KEY_SCAN_ENABLE | DPLR_LOW | SSPD_LOW | INTM_LEVEL;
	send_cmd_to_CH452(UP_DIS,iCmd);
	iCmd = CMD_SET_DISPLAY | NO_DECODE_MODE | SCAN_LIMIT_6;
	send_cmd_to_CH452(UP_DIS,iCmd);

	iCmd = CMD_SET_SYS | DISP_ENABLE | KEY_SCAN_DISABLE | DPLR_HIGH | SSPD_LOW;
	send_cmd_to_CH452(DOWN_DIS,iCmd);
	iCmd = CMD_SET_DISPLAY | NO_DECODE_MODE | SCAN_LIMIT_6;
	send_cmd_to_CH452(DOWN_DIS,iCmd);
}


void display_3_digit(unsigned char cCh,unsigned char *cDispData)
{
	unsigned char i,j;
	unsigned int iCmd,iDataNum;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	bCh452Dclk = 0;
	iDataNum = CMD_LOAD_DATA0;

	for(i=0;i<3;i++)
	{
		if(!cCh)
			bCh452Load1 = 0;
		else
			bCh452Load2 = 0;

		iCmd = iDataNum | (*cDispData);   

		for(j=0;j<12;j++)
		{
			if(iCmd & 0x0001)
				bCh452Din = 1;
			else 
				bCh452Din = 0;
			bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
			iCmd = _iror_(iCmd,1);
			bCh452Dclk = 1;
		}
		iDataNum = iDataNum + 0x0100; 
		cDispData++;
		if(!cCh)
			bCh452Load1 = 1;
		else
			bCh452Load2 = 1;              // 锁存数据到 CH452           
		delay();                          // 命令数据加载周期不小于6US
	}

	bBusStatus = BUS_IDLE;
}



void display_2_digit(unsigned char cCh,unsigned char *cDispData)
{
	unsigned char i,j;
	unsigned int iCmd,iDataNum;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	bCh452Dclk = 0;
	iDataNum = CMD_LOAD_DATA3;

	for(i=0;i<2;i++)
	{
		if(!cCh)
			bCh452Load1 = 0;
		else
			bCh452Load2 = 0;

		iCmd = iDataNum | (*cDispData);  

		for(j=0;j<12;j++)
		{
			if(iCmd & 0x0001)
				bCh452Din = 1;
			else 
				bCh452Din = 0;
			bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
			iCmd = _iror_(iCmd,1);
			bCh452Dclk = 1;
		}
		iDataNum = iDataNum + 0x0100; 
		cDispData++;
		if(!cCh)
			bCh452Load1 = 1;
		else
			bCh452Load2 = 1;              // 锁存数据到 CH452           
		delay();                          // 命令数据加载周期不小于6US
	}

	bBusStatus = BUS_IDLE;
}


void display_signal(unsigned char cDispData)
{
	unsigned char j;
	unsigned int iCmd;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	bCh452Dclk = 0;
	bCh452Load2 = 0;

	iCmd = CMD_LOAD_DATA5 | cDispData;

	for(j=0;j<12;j++)
	{
		if(iCmd & 0x0001)
			bCh452Din = 1;
		else 
			bCh452Din = 0;
		bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
		iCmd = _iror_(iCmd,1);
		bCh452Dclk = 1;
	}
 
	bCh452Load2 = 1;              // 锁存数据到 CH452           
	delay();  
	
	bBusStatus = BUS_IDLE;	      
}



void display_flash(unsigned char cCh,unsigned char num)
{
	unsigned char i;
	unsigned int iCmd;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	bCh452Dclk = 0;
	iCmd = CMD_SET_FLASH | num;

	if(!cCh)
		bCh452Load1 = 0;
	else
		bCh452Load2 = 0;

	for(i=0;i<12;i++)
	{
		if(iCmd & 0x0001)
			bCh452Din = 1;
		else 
			bCh452Din = 0;
		bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
		iCmd = _iror_(iCmd,1);
		bCh452Dclk = 1;
	}
	if(!cCh)
		bCh452Load1 = 1;
	else
		bCh452Load2 = 1;              // 锁存数据到 CH452           
	delay();                          // 命令数据加载周期不小于6US 

	bBusStatus = BUS_IDLE;
}





unsigned char scan_key()
{
	unsigned char i,key;
	unsigned char cCmd;

	do
	{}while(bBusStatus == BUS_BUSY);
	bBusStatus = BUS_BUSY;

	key = 0;
	bCh452Dclk = 0;
	bCh452Load1 = 0;

	cCmd = 0x07;                 // CMD_READ_KEY_CODE;

	for(i=0;i<4;i++)
	{
		if(cCmd & 0x01)
			bCh452Din = 1;
		else 
			bCh452Din = 0;
		bCh452Dclk = 0;
		cCmd >>= 1;
		bCh452Dclk = 1;          // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
	}
	delay();
	bCh452Load1 = 1;             // 锁存数据到 CH452    
		delay();

 
	for(i=0;i<7;i++)
	{
		key = key << 1;
		key = key | bCh452Dout;

		bCh452Dclk = 0;                // CH452在其上升沿从DIN 输入数据,在其下降沿从DOUT 输出数据
									   // 产生时钟下升沿通知CH451输出下一位
		delay();
		bCh452Dclk = 1;
	}

		delay();
	bBusStatus = BUS_IDLE;
	return key;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -