×
嵌入式 > 嵌入式开发 > 详情

CH451的使用总结

发布时间:2020-07-20 发布时间:
|
最近单片机学习进度到数码管显示。我用的学习板,是用CH451芯片来驱动数码管显示的。刚看CH451技术资料时,被抽象的解释和大量的信息难住了,并不能很好的理解CH451的工作过程。重新学习了CH451技术资料,花了半天时间才把它控制数码管的原理摸透。以下是我的学习总结。

一 CH451是何物?(来自说明书)
CH451 是一个整合了数码管显示驱动和键盘扫描控制以及μP 监控的多功能外围芯片。CH451 内置RC 振荡电路,可以动态驱动8 位数码管或者64 位LED,具有BCD 译码、闪烁、移位等功能;同时还可以进行64 键的键盘扫描;CH451 通过1 线或者可以级联的4 线串行接口单片机等交换数据;并且提供上电复位和看门狗等监控功能。

它的功能特点有:

1. 显示驱动
● 内置大电流驱动级,段电流不小于30mA,字电流不小于160mA。
● 动态显示扫描控制,直接驱动8 位数码管或者64 位发光管LED。
● 可选数码管的段与数据位相对应的不译码方式或者BCD 译码方式。
● 字数据左移、右移、左循环、右循环。
● 各数字独立闪烁控制。
● 通过占空比设定提供16 级亮度控制。
● 支持段电流上限调整,可以省去所有限流电阻。
● 扫描极限控制,支持1 到8 个数码管,只为有效数码管分配扫描时间。
2. 键盘控制
● 内置64 键键盘控制器,基于8×8 矩阵键盘扫描。
● 内置去抖动电路。
● 键盘中断,低电平有效输出。
● 提供按键释放标志位。
3. 外部接口
● 可选高速的4 线串行接口,支持芯片级联,时钟速度从0 到10MHz。
● 可选简洁的1 线串行接口。
● 内置RC 阻容振荡电路,同时支持外接阻容振荡。
● 内置上电复位,提供高电平有效复位输出和低电平有效复位输出。
● 内置看门狗电路Watch-Dog。
4. 其它杂项
● 可选多种封装:DIP28、SOP28、DIP24S、CHIP。
● 经过授权采用了2 项专利技术,低成本,简便易用。
二 数码管驱动

必须先知道单片机是如何与CH451通讯的。请看下图:

CH451本身的引脚很多,但是与单片机有关的,就七个引脚(如图)。CH451 具有硬件实现的高速4 线串行接口,包括4 根信号线:串行数据输入线DIN、串行数据时钟线DCLK、串行数据加载线LOAD、串行数据输出线DOUT。其中,DIN、DCLK、LOAD 是带上拉的输入信号线,默认是高电平;DOUT 在未启用键盘扫描功能时作为串行数据输出线,在启用键盘扫描功能后作为键盘中断和数据输出线,默认是高电平。因此与数码管显示有关的只有DIN、DCLK、LOAD 。

1芯片初试化

CH451默认选择1线串行接口,需要在DCLK串行时钟输入之前,在P1^0口(假设P1^0接DIN;P1^1接DCLK; P1^2接LOAD)输出一个低电平脉冲(由高电平变为低电平再恢复为高电平)(注:附在keil c实现该功能的代码)通知CH451选择4线串行接口。

附:

sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;

void ch451_init(void) //对芯片初始化

{

ch451_din = 0;
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;

}

2 输送串行数据

芯片初始化后,开始输送串行数据。CH451 的各个操作命令均为12 位,即每个操作命令对应12 位串行数据,数据输入的顺序是低位在前,高位在后,如B11B10~~~B0,最后一位B0先进入。串行数据输入 ch451过程可总结如下:

① 输出一位数据,即向DIN 输出最低位数据B0,并向DCLK 输出低电平脉冲(从高
电平变为低电平再恢复为高电平),其中包括一个上升沿使CH451 输入位数据;
② 以同样的方式,输出位数据B1~B11;
③ 向LOAD 输出低电平脉冲,其中包括一个上升沿使CH451 加载串行数据。

需要注意地,数据是一位一位的往DIN输送,把12位数据全输完,刚好要12次。(附:代码)

ch451_load=0; /*命令开始*/
for(i=0;i<12;i++)
{ /*送入12位数据,低位在前*,&表按位与,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有效*/
}

注意:command>>=1为右移一位,其左边高位补0;类似 command<<=1为左移一位,其右边最高位补0。

ch451_load=1; /*加载数据*/
上述过程可以用电平的变化来描述(如下图):

3 操作命令

每次往串行接口输送数据前,需要了解操作命令的含义,该输送什么命令,这是本小节讨论的。下表列出了CH451 的各个操作命令所对应的12 位串行数据。其中,标注为x 的位表示该位可以是任意值;标有名称的位表示该位在CH451芯片内部具有相应的寄存器,其数据根据操作命令的不同而变化。

注意:在送数据前前先为被显示的数码管定义(位选).找到上表"加载字数据0"栏,可以这样定义#define CH451_DIG0 0x0800,该语句表示数码管位0显示;数码管位1显示,可定义#define CH451_DIG1 0x0900,其它类推``````

开始输送12位串行数据。

首先送“设定系统参数”命令。设定系统参数命令用于设定CH451 的系统级参数:看门狗使能WDOG,键盘扫描使能KEYB,显示驱动使能DISP。各个参数均通过1 位数据控制,将相应的数据位置为1 则启用该功能,否则关闭该功能(默认值)。例如,命令数据010000000101B 表示启用看门狗的功能、关闭键盘扫描的功能、启用显示扫描驱动的功能。

其次送“设定显示参数”。设定显示参数命令用于设定CH451 的显示参数:译码方式MODE,扫描极限LIMIT,显示亮度INTENSITY。译码方式MODE 通过1 位数据控制,置1 时选择BCD 译码方式,置0 时选择不译码方式(默认值)。扫描极限LIMIT 通过3 位数据控制,数据001B~111B和000B 分别设定扫描极限为1~7 和8(默认值)。显示亮度INTENSITY 通过4 位数据控制,数据0001B~1111B 和0000B 分别设定显示驱动占空比为1/16~15/16 和16/16(默认值)。例如,命令数据010101110000B 表示选择不译码方式、扫描极限为7、显示驱动占空比16/16;命令数据010110001010B表示选择BCD 译码方式、扫描极限为8、显示驱动占空比为10/16。
然后送数码管显示的命令。如果是BCD 译码方式,发送“CH451_DIG7|8”,表示数码管7显示,且显示的数值是8;要让数码管5显示“A”数值,就发送命令“CH451_DIG5|10”。

数码管显示的过程,可以简单记为:初始化芯片(DIN、DCLK、LOAD ),定义操作命令(系统参数、显示参数等),发送操作命令。

完整的数码管显示程序如下所示:

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define CH451_DIG0 0x0800 /*数码管位0显示*/
#define CH451_DIG1 0x0900 /*数码管位1显示*/
#define CH451_DIG2 0x0a00 /*数码管位2显示*/
#define CH451_DIG3 0x0b00 /*数码管位3显示*/
#define CH451_DIG4 0x0c00 /*数码管位4显示*/
#define CH451_DIG5 0x0d00 /*数码管位5显示*/
#define CH451_DIG6 0x0e00 /*数码管位6显示*/
#define CH451_DIG7 0x0f00 /*数码管位7显示*/
sbit ch451_din = P1^0;
sbit ch451_clk = P1^1;
sbit ch451_load = P1^2;
/********************************************************************
函 数 名:ch451_init()
功 能:对ch451芯片进行初始化
***********************************************************************/
void ch451_init(void)
{
ch451_din = 0; /*先低后高,选择4线输入*/
ch451_din = 1;
ch451_load = 1;
ch451_clk = 1;
}
/********************************************************************
函 数 名:ch451_write()
功 能:把12位的指令或数据写入ch451
说 明:12位数据或指令的写入顺序是低位
入口参数:command
***********************************************************************/
void ch451_write(unsigned int command)
{
unsigned char i;
ch451_load=0; /*命令开始*/
for(i=0;i<12;i++)
{ /*送入12位数据,低位在前*,&表按位与,如5&7=5,即:0101^0111=5*/
ch451_din=command&1;
ch451_clk=0;
ch451_clk=1;
command>>=1; /*上升沿有效*/
}
ch451_load=1; /*加载数据*/
}
void main()
{

ch451_init();
//系统参数设定,参照说明书
ch451_write(0x401);
//显示参数设定,
ch451_write(0x580);
//第六位显示6
ch451_write(CH451_DIG5|6);
//第8位显示8
ch451_write(CH451_DIG7|8);
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Recogni:将高端AI芯片推向自动驾驶边缘