CH451 点阵LED显示模块

 

01 CH451S


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

▲ CH451S 芯片和使用功能框图

▲ CH451S 芯片和使用功能框图

1.特点

● 内置大电流驱动级,段电流不小于 25mA,字电流不小于 150mA。
● 动态显示扫描控制,直接驱动 8 位数码管或者 64 只发光管 LED。
● 可选数码管的段与数据位相对应的不译码方式或者 BCD 译码方式。
● 数码管的字数据左移、右移、左循环、右循环。
● 各数码管数字独立闪烁控制。
● 任意段位寻址,独立控制各个 LED 或者各数码管的各个段的亮与灭。
● 通过占空比设定提供 16 级亮度控制。
● 支持段电流上限调整,可以省去所有限流电阻。
● 扫描极限控制,支持 1 到 8 个数码管,只为有效数码管分配扫描时间。

▲ CH451的管脚声明

▲ CH451的管脚声明

 

02 点阵模块


1.模块引脚

▲ 双LED点阵模块

▲ 双LED点阵模块

▲ 模块接口定义

▲ 模块接口定义

2.测试MCU

使用 ATMEGA328实验电路板 来对于上述模块进行测试。

(1) 实验板原理图

▲ ATMEGA328的实验板

▲ ATMEGA328的实验板

(2) 实验关节配置
IO1IO2IO3
PB1PB2PB3
LOADDINDCLK

在面包板上搭建的测试电路板:

 

03 软件开发


1.开发软件1

▲ 设置ImageCraftIDE ICCAVR开发环节

▲ 设置ImageCraftIDE ICCAVR开发环节

2.CH451底层模块

建立CH451.H、CH451.C的文件。来实现对于CH451的操作。

▲ CH451的命令集合

▲ CH451的命令集合

3.软件测试

if(++nShowCount >= 10) {
    nShowCount = 0;
    ucChar ++;
    
    if(ucChar >= 0x80) {
        ucChar = 0;
        CH451Clear2();
    }

    CH451Bit12(ucChar);
}

▲ 测试LED亮度

▲ 测试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点阵显示板的功能。可以用于未来试验应用。

■ 相关文献链接:


  1. 测试软件ICCAVR工程文件:Atmel\Research\2020\TestCH451U\main.c ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值