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 5
void 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;
else
CH455_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 數碼管驅動以及鍵盤控制晶片 應用筆記
CH455是一款用於驅動數碼管(LED)和矩陣鍵盤掃描控制晶片。能夠動態驅動4位數碼管或者32個LED。同時支援7x4的鍵盤掃描。微控制器通過I2C對CH455進行讀寫,同時包括一個#INT中斷引腳,任何一個按鍵按下都會觸發中斷,在INT引腳上產生低電平脈衝。 主要
基於proteus的51微控制器模擬例項七十九、8位數碼管驅動晶片max7221應用例項
1、MAX7221是整合式共陰極數碼管驅動晶片。可以用來驅動8位7段式數碼管,也可以驅動條形LED或者8*8LED點陣 微控制器僅僅需要3個IO口就可以控制MAX7221驅動8位數碼管。注意這裡的
verilog數碼管驅動顯示
實現功能:讓4個數碼管每隔1s不斷遞增計數顯示,計數範圍為0-F(十六進位制)。 片選訊號:本例中是將公共端接到FPGA的I/O引腳上,這是數碼管片選訊號,如果這個I/O引腳輸出低電平0,那麼這個數碼管就能夠顯示數字,輸出高電平1時,關閉。 每個數碼管段選訊號:為了便於編寫7個用於段選(不包
靜態數碼管——小白的單片機筆記
bit 顯示 實驗 main char 兩個 調試 nbsp err 數碼管按照接線方式分為:共陰和共陽。 對於實驗板的數碼管器工作過程如下: 單片機通過接口(在此為P2^2,P2^3,P2^,4)與138譯碼器通訊,譯碼器Y0接口使最後一個LED數碼管工作。 P0口發送數
動態數碼管——小白的單片機筆記
存儲 value *** 通訊 mqc com har sign logs 138譯碼器控制LED數碼管使能 138譯碼器的ABC接口接線: A=P2^2;B=P2^3;C=P2^4; 74H245與P0口通訊控制數碼管顯示內容。 ******************
單片機入門-矩陣鍵盤控制數碼管顯示
矩陣 right 控制 入門 i/o num .cn mar oid 任務簡述:通過按下4X4矩陣鍵盤實現數碼管對應顯示數字 實現方式:通過行列分接法,可以節省使用單片機的I/O口,掃描矩陣鍵盤是否有按下,判斷P2端口得到的值。 protues 硬件系統 單片機晶振復位電
基於STM32的常用數碼管晶片TM1637驅動
unsigned char READ_KEY(void) { unsigned char i,temp=0; TM1637_start(); TM1637_Write(READ_COMMAND); DIO_IN; for(i=0;i<8;i++) { SCLK_L; Delay
數碼管的動態掃描與驅動
fin 文件 芯片 組成 == test 關於 實現 沒有 數碼管的基本原理 關於數碼管,一個單個的數碼管可以看做是多個led燈的集合,如下圖所示 其中的8和。都是LED組成的,通過引腳上電即可點亮不同的LED然後組成不同的數字,這個過程在數碼管的設計中叫做段選。
Arduino 數碼管LED屏驅動
art 溫度 git 技術 () article 時間 ack 計劃 今天測試數碼管LED屏驅動,用某產品的一個共陰極的LED屏,依據電路圖做數碼管LED屏的檢測。 代碼寫得有些冗長。有好幾種驅動的方法,這裏僅僅是當中一種最直接的方案。抽出時間要做個更有效率的調用
共陽極數碼管三極管驅動
數碼管 spa unsigned rup pan nbsp fin tab ble 1 #include<reg51.h> 2 3 4 #define unint unsigned int 5 #define unchar unsigned ch
51單片機:獨立按鍵與矩陣按鍵控制數碼管
#define clas 4行 ++ 浪費 down 技術分享 sig .com 一,獨立按鍵註意一下幾點 >按下的時候,電壓被拉低,所以IO口要傳低電平( 0x0 ) >按下的時候要消除抖動 ( 延時10ms ),在判斷,是否還是低電平,再做業務處理 下
基於ROS使用Arduino控制四位數碼管
1. 硬體 Arduino控制板:1個; 數碼管:1個; 杜邦線:若干; 1.1 接線方式 參考如下: a = 1; tb = 2; c = 3;d = 4; e = 5; f = 6; g = 7; dp = 8; 注意:上面的這些都需要串聯電阻
基於ROS使用Arduino控制數碼管
1. 硬體 Arduino控制板:1個; 數碼管:1個; 杜邦線:若干; 1.1 接線方式 參考如下方式: 實物連線圖: 注意:數碼管有兩種接法,共陰數碼管在應用時應將公共極接到GND或者5V。 來張實際的照片(略麻煩): 2 程式
STM32CubeMX_SPI驅動數碼管
驅動4位共陽數碼管 基於STM32F030C8T6 Cube設定 (RCC預設使用內部晶體,SYS使用WKUP2,和Serial_Debug,TimeBase選擇Systick). SPI1設定為半雙工通訊,紅線圈起來的是SPI通訊使用的3條線,MCU為主機,數
Arduino 驅動TM1638顯示十位的共陽數碼管
Arduino 驅動TM1638顯示十位的共陽數碼管 二話不說先上圖: 這個是電路圖,下面我在上傳TM1638的手冊 哈哈太亂了先湊合著看吧!效果是實現了,畫了板還沒有發過來。 我也不多說什麼了上程式碼(基於Arduino) #include "tm1638.h"
51微控制器【三】靜態驅動數碼管
void DigDisplay(void) { unsigned char i = 0; // 首先確定位碼,選中最左側數碼管,注意查38譯碼器的真值表,gagbgc為38譯碼器的ABC埠 gA = 0; gB = 0; gC = 0; // 依次顯示0-F
51微控制器按鍵控制數碼管加減和秒錶
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7; sbit du=P
利用51微控制器,矩陣鍵盤按鍵顯示0--F在數碼管
程式碼如下: #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit we = P2^7; sbit du = P2^
STC89C52微控制器控制超聲波測距模組SR04模組源程式,顯示在數碼管上
本程式碼基於QH - 5A平臺,測試通過。 開發板PCB完整工程下載連線: http://www.cirmall.com/circuit/7388/51%2FAVR微控制器開發板PCB工程原始檔
HslControls元件庫 工業控制元件庫 曲線控制元件 時間控制元件 管道控制元件 溫度計控制元件 閥門控制元件 傳送帶控制元件 進度條控制元件 電池控制元件 數碼管控制元件等等
本篇部落格主要對 HslControls 元件做一個大概的總覽介紹,更詳細的內容可以參照頁面裡的子連結,還有github上的原始碼,然後進行相關的學習,和使用。 Prepare 先從nuget下載到元件,然後就可以使用元件裡的各種元件資訊了。 在Visual Stud