➤01 CH451S
数码管驱动及键盘控制芯片 CH451 CH451 是一个整合了数码管显示驱动和键盘扫描控制以及μP 监控的多功能外围芯片。CH451 内置 RC 振荡电路,可以动态驱动 8 位数码管或者 64 只 LED 发光管,具有 BCD 译码、闪烁、移位等功能;同时还可以进行 64 键的键盘扫描;CH451 通过可以级联的串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能。
▲ CH451S 芯片和使用功能框图
1.特点
● 内置大电流驱动级,段电流不小于 25mA,字电流不小于 150mA。
● 动态显示扫描控制,直接驱动 8 位数码管或者 64 只发光管 LED。
● 可选数码管的段与数据位相对应的不译码方式或者 BCD 译码方式。
● 数码管的字数据左移、右移、左循环、右循环。
● 各数码管数字独立闪烁控制。
● 任意段位寻址,独立控制各个 LED 或者各数码管的各个段的亮与灭。
● 通过占空比设定提供 16 级亮度控制。
● 支持段电流上限调整,可以省去所有限流电阻。
● 扫描极限控制,支持 1 到 8 个数码管,只为有效数码管分配扫描时间。
▲ CH451的管脚声明
➤02 点阵模块
1.模块引脚
▲ 双LED点阵模块
▲ 模块接口定义
2.测试MCU
使用 ATMEGA328实验电路板 来对于上述模块进行测试。
(1) 实验板原理图
▲ ATMEGA328的实验板
(2) 实验关节配置
IO1 | IO2 | IO3 |
---|---|---|
PB1 | PB2 | PB3 |
LOAD | DIN | DCLK |
在面包板上搭建的测试电路板:
➤03 软件开发
1.开发软件1
▲ 设置ImageCraftIDE ICCAVR开发环节
2.CH451底层模块
建立CH451.H、CH451.C的文件。来实现对于CH451的操作。
▲ CH451的命令集合
3.软件测试
if(++nShowCount >= 10) {
nShowCount = 0;
ucChar ++;
if(ucChar >= 0x80) {
ucChar = 0;
CH451Clear2();
}
CH451Bit12(ucChar);
}
▲ 测试LED亮度
➤04 模块代码
/*
**==============================================================================
** CH451.C: -- by Dr. ZhuoQing, 2020-11-13
**
**==============================================================================
*/
#include <iom328pv.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>
#include "m328.h"
#include "iccavr_port.h"
//------------------------------------------------------------------------------
#define CH451_GLOBALS 1 // Define the global variables
#include "CH451.H"
//------------------------------------------------------------------------------
void CH451Init(void) {
ON(CH451_LOAD);
ON(CH451_DIN);
ON(CH451_DCLK);
OUT(CH451_LOAD);
OUT(CH451_DIN);
OUT(CH451_DCLK);
OFF(CH451_DIN); // Output Low pulse set
ON(CH451_DIN);
CH451OutCmd2(0x401, 0x401); // Set the system argument
//
CH451Clear2();
}
//------------------------------------------------------------------------------
void CH451_Delay(unsigned int nDelay) {
while(--nDelay);
}
//------------------------------------------------------------------------------
void CH451OutCmd(unsigned int nCmd) {
unsigned int nMask;
unsigned char i;
nMask = 0x1;
for(i = 0; i < 12; i ++) {
if(nCmd & nMask) ON(CH451_DIN);
else OFF(CH451_DIN);
OFF(CH451_DCLK);
ON(CH451_DCLK);
nMask <<= 1;
}
OFF(CH451_LOAD);
ON(CH451_LOAD);
ON(CH451_DIN);
}
//------------------------------------------------------------------------------
void CH451OutCmd2(unsigned int nCmd1, unsigned int nCmd2) {
unsigned int nMask;
unsigned char i;
nMask = 0x1;
for(i = 0; i < 12; i ++) {
if(nCmd1 & nMask) ON(CH451_DIN);
else OFF(CH451_DIN);
OFF(CH451_DCLK);
ON(CH451_DCLK);
nMask <<= 1;
}
nMask = 0x1;
for(i = 0; i < 12; i ++) {
if(nCmd2 & nMask) ON(CH451_DIN);
else OFF(CH451_DIN);
OFF(CH451_DCLK);
ON(CH451_DCLK);
nMask <<= 1;
}
OFF(CH451_LOAD);
ON(CH451_LOAD);
ON(CH451_DIN);
}
//------------------------------------------------------------------------------
void CH451Data(unsigned char ucData, unsigned char ucDig) {
unsigned int nData;
nData = ucDig & 0xf;
nData = (nData << 8) | ucData;
CH451OutCmd(nData);
}
void CH451Data2(unsigned char ucData1, unsigned char ucDig1,
unsigned char ucData2, unsigned char ucDig2) {
unsigned int nData1, nData2;
nData1 = (ucDig1 & 0xf) | 0x8;
nData1 = (nData1 << 8) | ucData1;
nData2 = (ucDig2 & 0xf) | 0x8;
nData2 = (nData2 << 8) | ucData2;
CH451OutCmd2(nData1, nData2);
}
//--------------------------------------------------------------
void CH451Clear2(void) {
unsigned char i;
unsigned int nData;
for(i = 0; i < 8; i ++) {
nData = (i | 0x8);
nData <<= 8;
CH451OutCmd2(nData, nData);
}
}
void CH451Bit02(unsigned char ucBit) {
unsigned int nData1, nData2;
nData1 = 0x0;
nData2 = 0x0;
if(ucBit & 0x40) {
nData2 = 0x180 | (ucBit & 0x3f);
} else {
nData1 = 0x180 | (ucBit & 0x3f);
}
CH451OutCmd2(nData1, nData2);
}
void CH451Bit12(unsigned char ucBit) {
unsigned int nData1, nData2;
nData1 = 0x0;
nData2 = 0x0;
if(ucBit & 0x40) {
nData2 = 0x1C0 | (ucBit & 0x3f);
} else {
nData1 = 0x1C0 | (ucBit & 0x3f);
}
CH451OutCmd2(nData1, nData2);
}
//==============================================================================
// END OF THE FILE : CH451.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** CH451.H: -- by Dr. ZhuoQing, 2020-11-13
**
** Description:
**
**==============================================================================
*/
#ifndef __CH451__
#define __CH451__
//------------------------------------------------------------------------------
#ifdef CH451_GLOBALS
#define CH451_EXT
#else
#define CH451_EXT extern
#endif // CH451_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
#define CH451_LOAD B,1
#define CH451_DIN B,3
#define CH451_DCLK B,2
void CH451_Delay(unsigned int nDelay);
//------------------------------------------------------------------------------
void CH451Init(void);
#define CH451_NOP 0x0000
#define CH451_BIT0 0x0180
#define CH451_BIT1 0x01C0
#define CH451_RESET 0x0201
#define CH451_SLEEP 0x0202
#define CH451_LMTC 0x02a0
#define CH451_SHIFT_LEFT 0x0300
#define CH451_SHIFT_RIGHT 0x0302
#define CH451_CIRCLE_LEFT 0x0301
#define CH451_CIRCLE_RIGHT 0x0303
#define CH451_ARG 0x0400 = // = BIT4:CKHF,3:DPLR,2:WDOG,1:KEYB,0:DISP
#define CH451_DISPLAY_ARG 0x0500 = //
#define CH451_FLASH 0x0600 = // = BIT7-0: = D7S
#define CH451_DATA0 0x0800
#define CH451_DATA1 0x0900
#define CH451_DATA2 0x0A00
#define CH451_DATA3 0x0B00
#define CH451_DATA4 0x0C00
#define CH451_DATA5 0x0D00
#define CH451_DATA6 0x0E00
#define CH451_DATA7 0x0F00
#define CH451_KEY 0x0700
//------------------------------------------------------------------------------
void CH451OutCmd(unsigned int nCmd);
void CH451OutCmd2(unsigned int nCmd1, unsigned int nCmd2);
//------------------------------------------------------------------------------
void CH451Data(unsigned char ucData, unsigned char ucDig);
void CH451Data2(unsigned char ucData1, unsigned char ucDig1,
unsigned char ucData2, unsigned char ucDig2);
//------------------------------------------------------------------------------
void CH451Clear2(void);
void CH451Bit02(unsigned char ucBit);
void CH451Bit12(unsigned char ucBit);
//==============================================================================
// END OF THE FILE : CH451.H
//------------------------------------------------------------------------------
#endif // __CH451__
➤※ 结论
测试了一块基于CH451的驱动的双LED点阵显示板的功能。可以用于未来试验应用。
■ 相关文献链接:
测试软件ICCAVR工程文件:Atmel\Research\2020\TestCH451U\main.c ↩︎