📄 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 + -