最近单片机学习进展到数码管显现。我用的学习板,是用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);
}