1. 程式人生 > >CH455 數碼管驅動以及鍵盤控制晶片 應用筆記

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
  2. 鍵值暫存器*1
  3. 顯示驅動暫存器*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