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

■ 相关文献链接:

  • 数码管驱动及键盘控制芯片 CH451
  • ATMEGA328实验电路板

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

CH451 点阵LED显示模块相关推荐

  1. 点阵LED显示原理(转)

    加个广告,我的淘宝网店,http://fengmm521.taobao.com 点阵LED显示原理(转2007年5月24日) 前几天看一个朋友做LED屏,就想自已试试看能不能做,在网上找到这个现在和大 ...

  2. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  3. 蓝桥杯电子类单片机组模块——led显示(一般作用)

    几乎每届蓝桥杯单片机组比赛都会考到led模块:特别是对于近几年的省赛来讲,led模块的使用显得更为灵活:即便led比较之简单,但是编写程序时还是很有可能出现错误. 现在来给大家介绍动态数码管的使用方法 ...

  4. 【51单片机】点阵LED的显示实验

    点阵LED显示实验 前言 一.环境 二.硬件 1.了解Matrix-8×8就像你需要了解女朋友 2.正确地连接线路就像你需要以正确的方式让她开心. 三.软件 1.思路就是有一个给她惊喜的想法 2.头文 ...

  5. TM1637带秒点四位LED显示器模块ARDUINO驱动程序

    几块钱网上买了块LED显示模块,IIC接口,TM1637驱动,四位显示,带秒点.写了个用于ESP32模块的ARDUINO驱动程序,将笔记放这里,以备未来使用. 模块文件:TM1637.C #ifnde ...

  6. Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块

    第一部分 8 x 8点阵模块 不带MAX7219驱动的8×8 點矩陣LED(如下图),从左侧有写字的一侧开始,L接正电,C接负电. 列L (1.2.3.4.5.6.7.8) 行C(1.2.3.4.5. ...

  7. 【Proteus仿真】【51单片机】LED点阵花样显示设计

    文章目录 一.功能简介 二.软件设计 三.实验现象 联系作者 一.功能简介 本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵.按键模块等. 系统运行后,默认以静态模式显示,此时点阵 ...

  8. Arduino Uno 使用MAX7219驱动单个8*8点阵LED模块

    还记得之前做的一个怦然心动的8*8点阵实验吗? 很多小伙伴都会觉得,插口都用完了还能用其他的功能吗? 现在使用MAX7219这个驱动模块 只占用3个IO口,就可以控制8*8点阵的显示,非常实用,简单. ...

  9. K_A02_005 基于单片机驱动数码管 LED 按键模块(TM1638) 流水灯 0-7 按键值显示

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.通信协议说明 1.写数据 时序: 程序: 2.读数据 时序: 程序: 四.部分代码说明 1.接线说明 1.1.STC89C52RC+按键数 ...

最新文章

  1. js实现当前导航菜单高亮显示
  2. mongo mysql 聚合性能_Mongodb和Mysql的性能分析
  3. 如何优化网站结构才促使网站排名“节节高”?
  4. 语言抄袭广东工业大学_CUBA出现消极比赛,广东工业大学与江西师范大学被取消成绩...
  5. 西电计算机学院(原软件学院)软件工程考研复试
  6. leetcode336. 回文对(字典树)
  7. 前端学习(1644):前端系列实战课程之上移和下移
  8. TCP/IP模型如何分层?路由器、网卡分别属于哪一层?
  9. 8.1 异常(Exceptions)
  10. Python可视化——绘制折线图
  11. # 研究杂感 × VOSviewer(第一辑)
  12. PHP字符串函数strrchr(查找指定字符在字符串中的最后一次出现)
  13. 抢滩新零售混战 实力战将才不惧双十一 附:双十一红包雨时间表
  14. 中国古代文化常识【1】
  15. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)
  16. 拼多多数据分析笔试题(附代码答案)
  17. 单号查询方法,怎么查快递物流到哪里了
  18. 辽宁移动cm201-2机顶盒把720P输出强制修改为1080P输出的方法
  19. 解决 input 输入框在 iOS 系统中无法输入内容
  20. FS4412开发板简介

热门文章

  1. 【转】windows平台多线程同步之Mutex的应用
  2. 安卓Webview缓存网页数据(无网络正常显示)
  3. .NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)...
  4. Java中定义VO事件的问题
  5. 自己看着视频的理解:设计模式之abstractfactory模式(2)
  6. [MOSS 译]如何:在WEB内容查询部件中使用自定义的字段
  7. IBM投资4000万美圆,加强对SAP®应用的支持
  8. libevent源码安装及Linux自动编译功能总结
  9. SAP R3 FI 上线 顾问设置教程(一)
  10. 2015下半年软考系统集成管理工程师10月8日作业