对CH451的概念、操作命令、硬件连接与实例的详解

1) ch451简介
ch451可用于led数码管显示驱动、键盘扫描控制、μp监控电路等领域。芯片封装包括双列直插dip28、sop28以及dip24s封装。其内置rc振荡电路,可以直接动态驱动8位数码管或者64位led,具有bcd译码或不译码功能,可实现数据的左移、右移、左循环、右循环、各数字独立闪烁等控制功能。ch451内置大电流驱动级,段电流不小于30 m a,字电流不小于160ma,并有16级亮度控制功能。该器件内置64键键盘控制器,可实现8×8矩阵键盘扫描,并内置去抖动电路,可提供按键中断与按键释放标志位等功能。ch451可选择简洁的1线串行接口或高速4线串行接口,且内置上电复位,可提供高电平有效复位和低电平有效复位两种输出,同时内置看门狗电路。整合了数码管显示驱动和键盘扫描控制以及μp监控的多功能外围芯片。用ch45l扩展键盘显示接口,具有接口简单、占用cpu资源少、外围器件简单、性价比高等优点,可在各种单片机系统中得到广泛的应用。
2)ch451操作命令介绍
ch451共有11条操作命令,每条操作命令均为12位,其中高4位为标识码,低8位为参数,x可为任意值(下同)
空操作(0000xxxxxxxxb)
空操作命令对ch451不产生任何影响,该命令可以在多个ch451级联的应用中透过前级ch451向后级ch451发送操作命令,而不影响前级ch451的状态。例如,要将操作命令001000000001b发送给两级级联电路中的后级ch45l(后级ch451的din引脚连接到前级ch451的dout引脚),只要在该操作命令后添加空操作命令000000000000b再发送,那么,该操作命令将经过前级ch451到达后级ch451,而空操作命令留给了前级ch451。另外,为了在不影响ch45l的前提下变化dclk以清除看门狗计时器,也可以发送空操作命令。在非级联的应用中,空操作命令可只发送高4位。
芯片内部复位(001000000001b)
内部复位命令可将ch451的各个寄存器和各种参数复位到默认的状态。芯片上电时,ch45l均被复位,此时各个寄存器均复位为0,各种参数均恢复为默认值。
字数据左移(001100000000b)
字数据左移命令将ch45l的字数据左移一次,即从digo向dig7移动一位,然后最右边的dig0补进数据00h。例如,在数码管dig7~i)igo显示“87654321”时,执行字数据左移命令,显示变为“765432l”(不译码方式)或者“76543210”(bcd译码方式)。
字数据右移(001100000010b)
字数据右移命令将ch45l的字数据右移一次,即从dig7向digo移动一位,然后最左边的dig7补进数据00h。例如,在数码管dig7~digo显示“8”7654321”时,执行字数据右移命令,显示变为“8765432”(不译码方式)或者“08765432”(bcd译码方式)。
字数据左循环(001100000001b)
字数据左循环命令将ch451的字数据左循环一次,即从digo向dig7移动一位,然后最右边的digo补进原dig7的数据。例如,在数码管dig7-digo显示“8”765432l”时,执行字数据左循环命令,显示变为“76543218”。
字数据右循环(001100000011b)
字数据右循环命令将ch451的字数据右循环一次,即从dig7向digo移动一位,然后最左边的dig7补进原dig0的数据。例如,在数码管dig7-digo显示“8765432l”时,执行字数据右循环命令,显示变为“18765432。
设定系统参数(010000000wdog][keyb][disp]b)
该命令用于设定ch451的系统级参数,如看门狗使能wdog,键盘扫描使能keyb,显示驱动使能disp。各个参数均可通过1位数据来进行控制,将相应的数据位置为1可启用该功能,否则关闭该功能(默认值)。
设定显示参数(0101[mode][limit][intensity]b)
此命令用于设定ch45l的显示参数,如译码方式mode(1位)、扫描极限limit(3位)、显示亮度intensity(4位)等。译码方式mode为1时选择bcd译码方式,为0时选择不译码方式。ch451默认工作于不译码方式,此时8个数据寄存器中字节数据的位7-位0分别对应8个数码管的小数点和段g~段a,当数据位为1时,对应的数据段(或发光管)点亮;数据位为o时熄灭。ch451工作于bcd译码方式主要应用于数码管驱动,单片机只要给出二进制数的bcd码,便可由ch451将其译码,并直接驱动数码管以显示对应的字符。bcd译码方式是对数据寄存器中字节数据的位4~位0进行兼容bcd的译码,可用于控制段驱动引脚seg6~sego的输出,它们对应于数码管的段g-段a,同时可用字节数据的位7控制段来驱动引脚seg7的输出以对应数码管的小数点,字节数据的位6和位5不影响bcd译码的输出,它们可以是任意值。将位4~位0进行bcd译码可显示以下28个字符,其中00000b-0ll11b分别对应于“0~f”,10000b-11010b分别对应于“”空格、“+”、+或加号、“一”或减号、“=”等于号、“左方括号”、“右方括号”、“一”下划线、“h”、“l”、“p”、“.”小数点、其余值为空格。
扫描极限umit控制位00lb~1l1b和000b(默认值)可分别设定扫描极限1~7和8。显示亮度intensity控制位的0001b~1111b和0000b(默认值)则用于分别设定显示驱动占空比1/16~15/16和16/16,以实现16级显示亮度控制。
设定闪烁控制(0110[d7s1][d6s][d5s][d4s][d3s][d2s][d1s][d0s]b)
设定闪烁控制命令用于设定ch451的闪烁显示属性,其中d7s-130s分别对应于8个字驱动dig7~digo。闪烁属性d7s-dos分别通过l位数据控制,将相应的数据位置为1可使能闪烁显示,否则为正常显示,不闪烁(默认值)。
加载字数据(1[dig-addr]dig—datalb)
加载字数据命令用于将字节数据dig_data(8位)写入dig_addr(3位)指定的数据寄存器中。dig_addr的000b-111b分别用于指定数据寄存器的地址o~7,并分别对应于digo-dig7引脚驱动的8个数码管。dig_data为待写入的字节数据。
读取按键代码(0111xxxxxxxxb)
读取按键代码命令用于获得ch451最近检测到的有效按键的按键代码。该命令是唯一的具有数据返回的命令,ch451通常从dout引脚输出按键代码,按键代码总是7位数据,最高位是状态码,位5~位o是扫描码。读取按键代码命令的位数据b7-b0可以是任意值,所以控制器可以将该操作命令缩短为4位数据bl1~b8。例如,ch451检测到有效按键并中断时,如按键代码是5eh,则先向ch451发出读取按键代码命令011lb,然后再从dout获得按键代码5eh。
ch451所提供的按键代码为7位,位2一位o是列扫描码,位5~位3是行扫描码,位6是状态码(键按下为1,键释放为o)。例如,连接dig3与seg4的键被按下时,按键代码为63h,键被释放后,按键代码是23h。单片机可以在任何时候读取按键代码,但一般在ch451检测到有效按键而产生键盘中断时读取按键代码,此时按键代码的位6总是1。另外,如果需要了解按键何时释放,单片机可以通过查询方式定期读取按键代码,直到按键代码的位6为0。表1是连接在dig7-digo与seg7-sego之间的键被按下时,ch451所提供的按键代码。这些按键代码具有一定的规律,如果需要键被释放时的按键代码,可将表2中的按键代码的位6置0,也可将表中的按键代码减去40h。应注意的是ch451不支持组合键,也就是说,同一时刻,不能有两个或者更多的键被按下。
表1 ch451按键代码
3) 硬件连接
ch451能够一次性驱动8位数码管,与单片机串行通信。支持数码管的左移,右移,左循环,右循环,独立闪烁,16级亮度控制等功能。是单片机控制多个数码管的得力助手,现将mega16单片机(mega16是avr单片机,改程序稍加修改可以应用到8051单片机,pic单片机,msp430单片机上)驱动ch451的程序发布,希望能有所用。ch451的详细资料可去官方网站下载。图1为硬件连接电路图。
图1: ch451与led数码管连接电路图
四)程序实例
avrch451驱动程序头文件
#ifndef_ch451_h
#define_ch451_h
#include
//ch451命令宏定义
#definech451_reset0x0201//复位
#definech451_left mov 0x0300//设置移动方式-左移
#definech451_leftcyc0x0301//设置移动方式-左循
#definech451_right mov 0x0302//设置移动方式-右移
#definech451_rightcyc0x0303//设置移动方式-右循
#definech451_sysoff0x0400//关显示、键盘、看门狗
#definech451_syson10x0401//开显示
#definech451_syson20x0403//开显示、键盘
#definech451_syson30x0407//开显示、键盘、看门狗功能
#definech451_dsp0x0500//设置默认显示方式
#definech451_bcd0x0580//设置bcd译码方式
#definech451_twinkle0x0600//设置闪烁控制
#definech451_key0x0700//读键盘代码
#definech451_dig00x0800//数码管位0显示
#definech451_dig10x0900//数码管位1显示
#definech451_dig20x0a00//数码管位2显示
#definech451_dig30x0b00//数码管位3显示
#definech451_dig40x0c00//数码管位4显示
#definech451_dig50x0d00//数码管位5显示
#definech451_dig60x0e00//数码管位6显示
#definech451_dig70x0f00//数码管位7显示
//端口宏定义
#definedclk(1<<;pa3)
#definedin(1<<;pa5)
#defineload(1<<;pa7)
#definedout(1<<;pe5)
#definech451_dclk_highporta|=dclk//时钟信号
#definech451_dclk_lowporta&=~dclk
#definech451_din_highporta|=din//数据输入
#definech451_din_lowporta&=~din
#definech451_load_highporta|=load//命令加载信号,上升延激活
#definech451_load_lowporta&=~load
#definech451_doutpine&dout//键盘中断和键值数据输出
externucharkeyvalue;//键值全局声明
//函数申明
voidch451_writecommand(uintcommand);//ch451写命令函数
voidch451_init();//ch451初始化函数
voidch451_getkeyvalue();//ch451键盘代码读取函数
voidch451_displaydig(uchardig,uchardata,ucharpoint);//ch451显示一位数码管函数
#endif
avr ch451驱动程序文件
#includech451.h
ucharkeyvalue;//键值
//共阴数码管编码表
constuchardsycode[18]={0x3f,0x06,0x5b,0x4f,//0,1,2,3
0x66,0x6d,0x7d,0x07,//4,5,6,7
0x7f,0x6f,0x77,0x7c,//8,9,a,b
0x39,0x5e,0x79,0x71,//c,d,e,f
0x40,0x00};//-,全灭
constuintdigcode[8]={ch451_dig0,ch451_dig1,ch451_dig2,ch451_dig3,
ch451_dig4,ch451_dig5,ch451_dig6,ch451_dig7};
//键盘编码表
constucharkeycode[16]={0x40,0x41,0x42,0x43,//0,1,2,3
0x48,0x49,0x4a,0x4b,//4,5,6,7
0x50,0x51,0x52,0x53,//8,9,a,b
0x58,0x59,0x5a,0x5b};//c,d,e,f
//ch451写命令函数
voidch451_writecommand(uintcommand){
uchari;
ch451_load_low;//命令开始
for(i=0;i>=1;//数据右移一位
ch451_dclk_high;//上升沿有效
}
ch451_load_high;//加载数据
}
//ch451初始化函数
voidch451_init(){
ch451_din_low;//低电平使能串行接口
ch451_din_high;
ch451_writecommand(ch451_reset);//复位ch451
ch451_writecommand(ch451_syson2);//开显示、键盘
ddre&=~dout;//pe5输入方向
eicrb|=(1< eimsk|=(1< }
//ch451键值读取函数
voidch451_getkeyvalue(){
uchari;
uchargetkeyvalue=0x00;//键盘代码
ch451_writecommand(ch451_key);//发送读取键值命令
for(i=0;i<7;i++){
getkeyvalue<<=1;
if(ch451_dout)getkeyvalue|=1;//从高到低读入451的数据
elsegetkeyvalue|=0;
ch451_dclk_low;//下降沿有效
ch451_dclk_high;
}
if(getkeyvalue==0x00)return;//读出键码为0跳过
for(i=0;i<16;i++){//查找键盘代码对应的键值
if(getkeyvalue==keycode){
keyvalue=i;
break;
}
}
}
//ch451显示一位数码管,dig选择数码管,data要显示的数字,point是否显示小数点
voidch451_displaydig(uchardig,uchardata,ucharpoint){
if(point==1)ch451_writecommand(digcode[dig]|(dsycode[data]|0x80));
elsech451_writecommand(digcode[dig]|dsycode[data]);
}

同事离职感慨:谁来评估工程师的价值?
抢滩LED专利布局,陆韩厂家奋起直追
M3052-000005-016BG压力变送器安装技巧和使用环境
微雪电子SOT6芯片介绍
重力传感器的原理及应用
对CH451的概念、操作命令、硬件连接与实例的详解
博通推出混合电视和OTT媒体播放器平台解决方案
互联网模式创新的下一个风口在哪儿?
手持式激光焊接机水冷与风冷在焊接厚度上有什么区别
C语言入门教程-变量:程序保存结果的手段
如何估计电源管理IC的连接线载流能力
2022年技术趋势之预见
戴尔可能很快将采用AMD处理器 缘于市场需要
CHA7618-99F大功率放大器UMS
一文浅谈智能制造
华为mate60以“5g网络速度”回归
防爆高低温试验箱压缩机的安装要求
如何有效找到失效的电子元器件并更换?
简易LED台灯电路
进相器中可控硅的介绍