CH455 数码管驱动以及键盘控制芯片 应用笔记
CH455是一款用于驱动数码管(LED)和矩阵键盘扫描控制芯片。能够动态驱动4位数码管或者32个LED。同时支持7x4的键盘扫描。单片机通过I2C对CH455进行读写,同时包括一个#INT中断引脚,任何一个按键按下都会触发中断,在INT引脚上产生低电平脉冲。
主要特点:
- 内置较大电流的驱动器,段电流达25mA,位电流达160mA
- 支持8x4或7x4,能够直接控制4位数码管或32个LED
- 能够设置8种亮度,由内部PWM驱动LED
- 提供低电平有效的键盘中断,提供按键释放标志位,可通过该位来判断按键是否按下和释放。
- 供电电压范围2.7~5V
CH455内部的显示驱动电路和按键扫描电路是独立开的,两部分电路使用相同的引脚,分时对引脚进行驱动和读取。在显示驱动中,插入键盘键值读取操作。
显示驱动
显示驱动原理与HT1612段码屏驱动原理类似,都是以SEG[n:0]和DIG[m:0]分别作为行、列,组成一个寄存器矩阵,一共(n+1)*(m+1)位数据。将单个LED要显示的状态对应写进寄存器,芯片内部电路会按照寄存器中数据进行动态扫描输出。
CH455对数码管和LED采用动态扫描驱动,顺序为DIG0~DIG3,当其中一个引脚吸入电流时,其他引脚不吸入电流。
如下图中,若硬件上将SEG0~7的公共端接到DIG0时,若要左侧共阴数码管显示0,在要在SEG0地址寄存器中写入0B00111111,即0x3F。芯片会按照寄存器的值来驱动左侧数码管显示。
寄存器地址:
键盘扫描
键盘扫描时,DIG3~DIG0引脚用于列扫描输出,SEG6~SEG0引脚带有内部下拉电阻,用于行扫描输入。在键盘扫描期间,DIG0~DIG3一次输出高电平,其余引脚输出低电平,该状态下SEG0~SEG6引脚的输出被禁止。 CH455内部带有消抖功能,连续两次判断有按键按下才会被确认。当检测到按键后,会讲按键值存储在寄存器中,并在#INT引脚上产生低电平中断。
注:当多个按键按下时,按键码较小的按键优先。
按键码格式:bit7一直为0, bit2一直为1,bit[1:0]为列扫描码,bit[5:3]为行扫描码,bit6位状态码(按键按下为1,按键松开为0,判断该位的值来判断按键是否松开)。如连接DIG2和SEG5的按键被按下,则bit[1:0]=10,bit[5:3]=101,bit6=1,有
Key = 0B01101110 (0x6E)
对应按键码如下,因为按下立即读键码寄存器是bit6=1,所以需要在按键编码上加上0x40
设置系统参数
系统参数主要包括,显示驱动电路和键盘扫描使能,7/8段模式,8阶亮度控制,sleep模式。系统参数有一个字节控制,其中bit7和bit1一直为0,bit[6:4]控制亮度显示(000为8/8,001~111为1/8~7/8亮度),bit3控制7/8模式(0为8段,1为7段),bit2为sleep模式(写1使能,可通过按键唤醒或者操作指令唤醒),bit0为使能(高电平有效)。
如需要让CH455工作在8段,最亮的情况下,则该值为0B00000001,,即0x01。
总的来说,实际上只要对6个寄存器进行操作就行。
- 系统参数寄存器*1
- 键值寄存器*1
- 显示驱动寄存器*4
代码实现
下列为STM32应用代码,已经验证能够稳定使用,留言询问后方可转载。
ch455.h
#ifndef __CH455_H
#define __CH455_H
#include "sys.h"typedef unsigned char UINT8;
typedef unsigned short UINT16; #define high 1
#define low 0/* 2线接口的连接,与实际电路有关 */
#define CH455_SCL PBout(4) //SCL
#define CH455_SDA PBout(5) //SDA/* 2线接口的位操作,与单片机有关 */
#define CH455_SCL_SET {CH455_SCL=1;}
#define CH455_SCL_CLR {CH455_SCL=0;}
#define CH455_SCL_D_OUT {GPIOB->CRL&=0XFFF0FFFF;GPIOB->CRL|=(u32)3<<(4*4);} // 设置SCL为输出方向,对于双向I/O需切换为输出
#define CH455_SDA_SET {CH455_SDA=1;}
#define CH455_SDA_CLR {CH455_SDA=0;}
#define CH455_SDA_IN GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) // 读取SDA输入电平
#define CH455_SDA_D_OUT {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)3<<(5*4);} // 设置SDA为输出方向,对于双向I/O需切换为输出
#define CH455_SDA_D_IN {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)8<<(5*4);} // 设置SDA为输入方向,对于双向I/O需切换为输入/* ********************************************************************************************* */
// 设置系统参数命令#define CH455_BIT_ENABLE 0x01 // 开启/关闭位
#define CH455_BIT_SLEEP 0x04 // 睡眠控制位
#define CH455_BIT_7SEG 0x08 // 7段控制位
#define CH455_BIT_INTENS1 0x10 // 1级亮度
#define CH455_BIT_INTENS2 0x20 // 2级亮度
#define CH455_BIT_INTENS3 0x30 // 3级亮度
#define CH455_BIT_INTENS4 0x40 // 4级亮度
#define CH455_BIT_INTENS5 0x50 // 5级亮度
#define CH455_BIT_INTENS6 0x60 // 6级亮度
#define CH455_BIT_INTENS7 0x70 // 7级亮度
#define CH455_BIT_INTENS8 0x00 // 8级亮度#define CH455_SYSOFF 0x0400 // 关闭显示、关闭键盘
#define CH455_SYSON ( CH455_SYSOFF | CH455_BIT_ENABLE ) // 开启显示、键盘
#define CH455_SLEEPOFF CH455_SYSOFF // 关闭睡眠
#define CH455_SLEEPON ( CH455_SYSOFF | CH455_BIT_SLEEP ) // 开启睡眠
#define CH455_7SEG_ON ( CH455_SYSON | CH455_BIT_7SEG ) // 开启七段模式
#define CH455_8SEG_ON ( CH455_SYSON | 0x00 ) // 开启八段模式
#define CH455_SYSON_4 ( CH455_SYSON | CH455_BIT_INTENS4 ) // 开启显示、键盘、4级亮度
#define CH455_SYSON_8 ( CH455_SYSON | CH455_BIT_INTENS8 ) // 开启显示、键盘、8级亮度// 加载字数据命令
#define CH455_DIG0 0x1400 // 数码管位0显示,需另加8位数据
#define CH455_DIG1 0x1500 // 数码管位1显示,需另加8位数据
#define CH455_DIG2 0x1600 // 数码管位2显示,需另加8位数据
#define CH455_DIG3 0x1700 // 数码管位3显示,需另加8位数据// 读取按键代码命令
#define CH455_GET_KEY 0x0700 // 获取按键,返回按键代码// CH455接口定义
#define CH455_I2C_ADDR 0x40 // CH455的地址
#define CH455_I2C_MASK 0x3E // CH455的高字节命令掩码// 对外子程序
extern void CH455_Init(void); //初始化函数
extern UINT8 CH455_Read( void ); // 从CH455读取按键代码
extern void CH455_Write( UINT16 cmd ); // 向CH455发出操作命令
UINT8 CH455_I2c_RdByte( void );
void CH455_I2c_WrByte(unsigned char IIC_Byte);
void CH455_I2c_Stop();
void CH455_I2c_Start();#endif /* CH455_H */
ch455.c
/** File: CH455.c* Author: JiangXiaowei*/#include "ch455.h" // 修改该文件以适应硬件环境/单片机型号等
#include "delay.h"//定义
#define I2C_DELAY 5void CH455_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟//stm32f103中PB3、PB4、PA15为JTAG引脚,若要作为普通IO口来使用的话,要禁用JTAG功能。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5); CH455_Write( CH455_SYSON_8 ); //八段式
}/** 函数功能:IIC产生起始信号函数* 输入参数:无* 输出参数:无*/
void CH455_I2c_Start()
{CH455_SDA_D_OUT;CH455_SCL = high; //SCL = high;DelayUs(I2C_DELAY);CH455_SDA = high; //SDA = high;DelayUs(I2C_DELAY);CH455_SDA = low; //SDA = low;DelayUs(I2C_DELAY);CH455_SCL = low; //SCL = low;DelayUs(I2C_DELAY);
}/** 函数功能:IIC产生停止信号* 输入参数:无* 输出参数:无*/
void CH455_I2c_Stop()
{CH455_SDA_D_OUT;CH455_SCL = low; //SCL = low;DelayUs(I2C_DELAY);CH455_SDA = low; //SDA = low;DelayUs(I2C_DELAY);CH455_SCL = high; //SCL = high;DelayUs(I2C_DELAY);CH455_SDA = high; //SDA = high;DelayUs(I2C_DELAY);
}/** 函数功能:IIC发送一个字节* 输入参数:一个字节* 输出参数:无*/
void CH455_I2c_WrByte(unsigned char IIC_Byte)
{unsigned char i;CH455_SDA_D_OUT;for(i = 0; i < 8; i++){if(IIC_Byte & 0x80)CH455_SDA = high; //SDA=high;elseCH455_SDA = low; //SDA=low;DelayUs(I2C_DELAY);CH455_SCL = high; //SCL=high;DelayUs(I2C_DELAY);CH455_SCL = low; //SCL=low;DelayUs(I2C_DELAY);IIC_Byte<<=1;}DelayUs(I2C_DELAY);CH455_SDA = high; //SDA=1;DelayUs(I2C_DELAY);CH455_SCL = high; //SCL=1;DelayUs(I2C_DELAY);CH455_SCL = low; //SCL=0;DelayUs(I2C_DELAY);
}unsigned char CH455_I2c_RdByte( void ) //读一个字节数据
{ unsigned char i, bytedata;CH455_SDA_D_IN; //将数据设置为输入模式DelayUs(I2C_DELAY);CH455_SDA = 1; //数据线拉高DelayUs(I2C_DELAY);CH455_SCL = 0;DelayUs(I2C_DELAY);for(i = 0; i < 8; i++) //读8位数据{CH455_SCL = 1;DelayUs(I2C_DELAY);bytedata <<= 1;DelayUs(I2C_DELAY);bytedata |= (CH455_SDA_IN);DelayUs(I2C_DELAY);CH455_SCL = 0;DelayUs(I2C_DELAY);}CH455_SDA_D_OUT; //数据线设置回输出模式CH455_SDA = high; //SDA=1;DelayUs(I2C_DELAY);CH455_SCL = high; //SCL=1;DelayUs(I2C_DELAY);CH455_SCL = low; //SCL=0;DelayUs(I2C_DELAY);return(bytedata);//返回数据
}void CH455_Write( UINT16 cmd ) //写命令
{CH455_I2c_Start(); //启动总线CH455_I2c_WrByte(((UINT8)(cmd>>7)&CH455_I2C_MASK)|CH455_I2C_ADDR);CH455_I2c_WrByte((UINT8)cmd); //发送数据CH455_I2c_Stop(); //结束总线
}UINT8 CH455_Read( void ) //读取按键
{UINT8 keycode;CH455_I2c_Start(); //启动总线CH455_I2c_WrByte((UINT8)(CH455_GET_KEY>>7)&CH455_I2C_MASK|0x01|CH455_I2C_ADDR);keycode=CH455_I2c_RdByte(); //读取数据CH455_I2c_Stop(); //结束总线return keycode;
}
main.c (部分)
//单片机头文件
#include "stm32f10x.h"//
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "exti.h"//硬件驱动
#include "Oled_IIC.h"
#include "sim800.h"
#include "ch455.h"
#include "led.h"//C库
#include <string.h>//全局变量
unsigned char usart1Len = 0; //usart1接收的数据长度
unsigned char usart1Buf[64]; //usart1接收缓存unsigned char usart2Len = 0; //usart2接收的数据长度
unsigned char usart2Buf[64]; //usart2接收缓存int main(void)
{unsigned char i,j;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置 Delay_Init(); //Systick初始化,用于普通的延时 OLED_Init();CH455_Init();UsartPrintf(USART1, "\r\nJiangXiaowei Design 2018-07-08 1358801713x\r\n"); //串口1打印OLED_P8x16Str(0,0,"2018-07-08");OLED_P8x16Str(0,2,"CH455 Test");while(1){ CH455_Write( CH455_SYSON ); //抗干扰,定时刷新CH455寄存器CH455_Write( CH455_DIG0 | 0XFF );switch((CH455_Read()/8)%8) {case 0:OLED_P8x16Str(0,4,"0x00 Stop ");break;case 1:OLED_P8x16Str(0,4,"0x01 Head Up ");break;case 2:OLED_P8x16Str(0,4,"0x02 Head Down ");break;case 3:OLED_P8x16Str(0,4,"0x03 Foot Up ");break;case 4:OLED_P8x16Str(0,4,"0x04 Head Down ");break;case 5:OLED_P8x16Str(0,4,"0x05 Both Up ");break;case 6:OLED_P8x16Str(0,4,"0x00 Both Down ");break;default:;//OLED_P8x16Str(0,6,usart2Buf);}}}
CH455 数码管驱动以及键盘控制芯片 应用笔记相关推荐
- ch454c语言程序实例,16段数码管驱动和键盘控制芯片CH454.PDF
CH454 手册 1 16 段数码管驱动及键盘控制芯片CH454 手册 版本:1D 1.概述 CH454 是数码管显示驱动和键盘扫描控制芯片.CH454 内置时钟振荡电路,可以动态驱动8 只16 段的 ...
- 数码管驱动及键盘控制芯片CH455
CH455 是数码管显示驱动和键盘扫描控制芯片.CH455内置时钟振荡电路,可以动态驱动4 位数码管或者32 只LED:同时还可以进行28 键的键盘扫描:CH455 通过SCL 和SDA 组成的2 线 ...
- 键盘扫描并控制数码管C语言,CH454 数码管显示驱动和键盘扫描控制芯片
1.概述 CH454 是数码管显示驱动和键盘扫描控制芯片.CH454内置时钟振荡电路,可以动态驱动8 只16段的数码管或者128 只LED,支持11 段.14 段.16 段×8 以及17 段×7 等; ...
- LED驱动IC,数显/数码管显示驱动芯片-VK1S38A,LED驱动控制电路,内部集成有MCU 数字接口、数据锁存器、LED驱动、键盘扫描等电路
产品型号:VK1S38A 产品品牌:VINKA/永嘉微电 封装形式:SSOP24 产品年份:新年份 概述: VK1S38A是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有M ...
- LED数码管显示驱动芯片-VK1668,LED驱动控制电路,内部集成有MCU数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路
产品型号:VK1668 产品品牌:VINKA/永嘉微电 封装形式:SOP24/SSOP24 产品年份:新年份 概述 VK1668 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部 ...
- STM32F103学习笔记(5)——数码管驱动TM1650使用
一.简介 TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路.内部集成有 MCU 输入输出控制数字接口.数据锁存器.LED 驱动.键盘扫描.辉度调节等电路.TM1650 ...
- zlg72128数码管驱动管理显示芯片
数码管驱动管理显示芯片框图 数码管驱动管理显示芯片概述 ZLG72128 是广州周立功单片机科技有限公司自行设计的数码管显示驱动键盘扫描管理芯片.能够直接驱动 12 位共阴式数码管(或 96 只独立的 ...
- 基于FPGA的三线制数码管驱动设计
目录 引言 电路结构 实现思路 数码管显示译码 74HC595驱动 源码分享 板级验证 引言 对三线制数码管的驱动设计做一个简单的总结吧. 电路结构 数码管结构图: 动态扫描原理: 主要是利用了人的视 ...
- (38)FPGA数码管驱动设计(第8天)
(38)FPGA数码管驱动设计(第8天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA数码管驱动设计(第8天) 5)技术交流 6)参考资料 2 FPGA ...
最新文章
- qt怎么做滑动调节参数_冬天冰箱温度怎么调?0到7旋钮是做什么的?学会调节省电又保鲜...
- Volatile缓存可见性实现原理(JMM数据原子操作具体步骤)
- python按位定义数据_《Python3智能数据分析快速入门》—2.2.5 按位运算符
- 安装SQL2005提示“SQL Server 2005 COM+ 目录要求”警告 解决方法
- 山东工业大学计算机及应用,彭玉旭副教授
- bzoj 1003物流运输 区间dp+spfa
- JZOJ5918【NOIP2018模拟10.20】Car
- 【人脸识别】VGGFace2数据集介绍
- Zigbee协议栈中文说明
- 基于vue实现可拖动弹框
- system-config-network
- sql语句中调用将汉字转换为拼音函数
- css炫酷标题,分享几个CSS小众但炫酷的技巧
- 情感分析与观点挖掘第五章笔记(上)/基于方面的情感分析/SentimentAnalysis-and-OpinionMining by Bing Liu
- vue中自定义组件“ directives “的常用功能
- vue3.0在线编辑器codemirror开发
- 第5次作业+160+曾元鹏
- php实现ckeditor编辑器添加水印及使用误区
- 如何快速提升网站百度权重
- 16位二进制数转换成BCD码的的快速算法-51单片机
热门文章
- (二十三)admin-boot项目之captcha验证码整合
- 国内云通讯渗透率不足3% 容联云SaaS业务迈入高速发展期
- ifame 实现页面预载,页面不闪(load)
- icode代码组答案(2022)50-90
- 仿QQ相册RecyclerView滑动选中
- 转行软件测试3年了,听前辈说测试前途是IT里最low的,我慌了......
- 项目经理的核心竞争力
- Mac解决gyp: No Xcode or CLT version detected!问题
- 外呼系统与网络电话有什么差别?应该怎么选?
- winform 窗体无法显示报错“未声明或从未赋值“解决办法