1) CH451簡介
CH451可用于LED數碼管顯示驅動、鍵盤掃描控制、μP監控電路等領域。芯片封裝包括雙列直插DIP28、SOP28以及DIP24S封裝。其內置RC振蕩電路,可以直接動態驅動8位數碼管或者64位LED,具有BCD譯碼或不譯碼功能,可實現數據的左移、右移、左循環、右循環、各數字獨立閃爍等控制功能。CH451內置大電流驅動級,段電流不小于30 m A,字電流不小于160mA,并有16級亮度控制功能。該器件內置64鍵鍵盤控制器,可實現8×8矩陣鍵盤掃描,并內置去抖動電路,可提供按鍵中斷與按鍵釋放標志位等功能。CH451可選擇簡潔的1線串行接口或高速4線串行接口,且內置上電復位,可提供高電平有效復位和低電平有效復位兩種輸出,同時內置看門狗電路。整合了數碼管顯示驅動和鍵盤掃描控制以及μP監控的多功能外圍芯片。用CH45l擴展鍵盤顯示接口,具有接口簡單、占用CPU資源少、外圍器件簡單、性價比高等優點,可在各種單片機系統中得到廣泛的應用。
2)CH451操作命令介紹
CH451共有11條操作命令,每條操作命令均為12位,其中高4位為標識碼,低8位為參數,x可為任意值(下同)
空操作(0000xxxxxxxxB)
空操作命令對CH451不產生任何影響,該命令可以在多個CH451級聯的應用中透過前級CH451向后級cH451發送操作命令,而不影響前級cH451的狀態。例如,要將操作命令001000000001B發送給兩級級聯電路中的后級CH45l(后級CH451的DIN引腳連接到前級CH451的DOUT引腳),只要在該操作命令后添加空操作命令000000000000B再發送,那么,該操作命令將經過前級cH451到達后級cH451,而空操作命令留給了前級CH451。另外,為了在不影響CH45l的前提下變化DCLK以清除看門狗計時器,也可以發送空操作命令。在非級聯的應用中,空操作命令可只發送高4位。
芯片內部復位(001000000001B)
內部復位命令可將CH451的各個寄存器和各種參數復位到默認的狀態。芯片上電時,CH45l均被復位,此時各個寄存器均復位為0,各種參數均恢復為默認值。
字數據左移(001100000000B)
字數據左移命令將CH45l的字數據左移一次,即從DIGO向DIG7移動一位,然后最右邊的DIG0補進數據00H。例如,在數碼管DIG7~I)IGO顯示“87654321”時,執行字數據左移命令,顯示變為“765432l”(不譯碼方式)或者“76543210”(BCD譯碼方式)。
字數據右移(001100000010B)
字數據右移命令將cH45l的字數據右移一次,即從DIG7向DIGO移動一位,然后最左邊的DIG7補進數據00H。例如,在數碼管DIG7~DIGO顯示“8”7654321”時,執行字數據右移命令,顯示變為“8765432”(不譯碼方式)或者“08765432”(BCD譯碼方式)。
字數據左循環(001100000001B)
字數據左循環命令將CH451的字數據左循環一次,即從DIGO向DIG7移動一位,然后最右邊的DIGO補進原DIG7的數據。例如,在數碼管DIG7-DIGO顯示“8”765432l”時,執行字數據左循環命令,顯示變為“76543218”。
字數據右循環(001100000011B)
字數據右循環命令將CH451的字數據右循環一次,即從DIG7向DIGO移動一位,然后最左邊的DIG7補進原DIG0的數據。例如,在數碼管DIG7-DIGO顯示“8765432l”時,執行字數據右循環命令,顯示變為“18765432"。
設定系統參數(010000000WDOG][KEYB][DIsP]B)
該命令用于設定cH451的系統級參數,如看門狗使能wDOG,鍵盤掃描使能KEYB,顯示驅動使能DISP。各個參數均可通過1位數據來進行控制,將相應的數據位置為1可啟用該功能,否則關閉該功能(默認值)。
設定顯示參數(0101[MoDE][LIMIT][INTENSITY]B)
此命令用于設定CH45l的顯示參數,如譯碼方式MODE(1位)、掃描極限LIMIT(3位)、顯示亮度INTENSITY(4位)等。譯碼方式MODE為1時選擇BcD譯碼方式,為0時選擇不譯碼方式。CH451默認工作于不譯碼方式,此時8個數據寄存器中字節數據的位7-位0分別對應8個數碼管的小數點和段G~段A,當數據位為1時,對應的數據段(或發光管)點亮;數據位為O時熄滅。cH451工作于BcD譯碼方式主要應用于數碼管驅動,單片機只要給出二進制數的BcD碼,便可由CH451將其譯碼,并直接驅動數碼管以顯示對應的字符。BcD譯碼方式是對數據寄存器中字節數據的位4~位0進行兼容BcD的譯碼,可用于控制段驅動引腳SEG6~SEGO的輸出,它們對應于數碼管的段G-段A,同時可用字節數據的位7控制段來驅動引腳SEG7的輸出以對應數碼管的小數點,字節數據的位6和位5不影響BcD譯碼的輸出,它們可以是任意值。將位4~位0進行BCD譯碼可顯示以下28個字符,其中00000B-0ll11B分別對應于“0~F”,10000B-11010B分別對應于“”空格、“+”、+或加號、“一”或減號、“=”等于號、“左方括號”、“右方括號”、“一”下劃線、“H”、“L”、“P”、“.”小數點、其余值為空格。
掃描極限uMIT控制位00lB~1l1B和000B(默認值)可分別設定掃描極限1~7和8。顯示亮度INTENSITY控制位的0001B~1111B和0000B(默認值)則用于分別設定顯示驅動占空比1/16~15/16和16/16,以實現16級顯示亮度控制。
設定閃爍控制(0110[D7s1][D6S][D5s][D4S][D3S][D2S][D1S][D0S]B)
設定閃爍控制命令用于設定CH451的閃爍顯示屬性,其中D7s-130S分別對應于8個字驅動DIG7~DIGO。閃爍屬性D7s-DOS分別通過l位數據控制,將相應的數據位置為1可使能閃爍顯示,否則為正常顯示,不閃爍(默認值)。
加載字數據(1[DIG-ADDR]DIG—DATAlB)
加載字數據命令用于將字節數據DIG_DATA(8位)寫入DIG_ADDR(3位)指定的數據寄存器中。DIG_ADDR的000B-111B分別用于指定數據寄存器的地址O~7,并分別對應于DIGO-DIG7引腳驅動的8個數碼管。DIG_DATA為待寫入的字節數據。
讀取按鍵代碼(0111xxxxxxxxB)
讀取按鍵代碼命令用于獲得cH451最近檢測到的有效按鍵的按鍵代碼。該命令是唯一的具有數據返回的命令,CH451通常從DOUT引腳輸出按鍵代碼,按鍵代碼總是7位數據,最高位是狀態碼,位5~位O是掃描碼。讀取按鍵代碼命令的位數據B7-B0可以是任意值,所以控制器可以將該操作命令縮短為4位數據Bl1~B8。例如,CH451檢測到有效按鍵并中斷時,如按鍵代碼是5EH,則先向CH451發出讀取按鍵代碼命令011lB,然后再從DOUT獲得按鍵代碼5EH。
CH451所提供的按鍵代碼為7位,位2一位O是列掃描碼,位5~位3是行掃描碼,位6是狀態碼(鍵按下為1,鍵釋放為O)。例如,連接DIG3與SEG4的鍵被按下時,按鍵代碼為63H,鍵被釋放后,按鍵代碼是23H。單片機可以在任何時候讀取按鍵代碼,但一般在CH451檢測到有效按鍵而產生鍵盤中斷時讀取按鍵代碼,此時按鍵代碼的位6總是1。另外,如果需要了解按鍵何時釋放,單片機可以通過查詢方式定期讀取按鍵代碼,直到按鍵代碼的位6為0。表1是連接在DIG7-DIGO與SEG7-SEGO之間的鍵被按下時,CH451所提供的按鍵代碼。這些按鍵代碼具有一定的規律,如果需要鍵被釋放時的按鍵代碼,可將表2中的按鍵代碼的位6置0,也可將表中的按鍵代碼減去40H。應注意的是CH451不支持組合鍵,也就是說,同一時刻,不能有兩個或者更多的鍵被按下。
表1 CH451按鍵代碼
3) 硬件連接
CH451能夠一次性驅動8位數碼管,與單片機串行通信。支持數碼管的左移,右移,左循環,右循環,獨立閃爍,16級亮度控制等功能。是單片機控制多個數碼管的得力助手,現將MEGA16單片機(MEGA16是AVR單片機,改程序稍加修改可以應用到8051單片機,PIC單片機,MSP430單片機上)驅動CH451的程序發布,希望能有所用。CH451的詳細資料可去官方網站下載。圖1為硬件連接電路圖。
圖1: CH451與LED數碼管連接電路圖
四)程序實例
AVRCH451驅動程序頭文件
#ifndef_CH451_H
#define_CH451_H
#include
//CH451命令宏定義
#defineCH451_RESET0x0201//復位
#defineCH451_LEFT MOV 0x0300//設置移動方式-左移
#defineCH451_LEFTCYC0x0301//設置移動方式-左循
#defineCH451_RIGHT MOV 0x0302//設置移動方式-右移
#defineCH451_RIGHTCYC0x0303//設置移動方式-右循
#defineCH451_SYSOFF0x0400//關顯示、鍵盤、看門狗
#defineCH451_SYSON10x0401//開顯示
#defineCH451_SYSON20x0403//開顯示、鍵盤
#defineCH451_SYSON30x0407//開顯示、鍵盤、看門狗功能
#defineCH451_DSP0x0500//設置默認顯示方式
#defineCH451_BCD0x0580//設置BCD譯碼方式
#defineCH451_TWINKLE0x0600//設置閃爍控制
#defineCH451_KEY0x0700//讀鍵盤代碼
#defineCH451_DIG00x0800//數碼管位0顯示
#defineCH451_DIG10x0900//數碼管位1顯示
#defineCH451_DIG20x0A00//數碼管位2顯示
#defineCH451_DIG30x0B00//數碼管位3顯示
#defineCH451_DIG40x0C00//數碼管位4顯示
#defineCH451_DIG50x0D00//數碼管位5顯示
#defineCH451_DIG60x0E00//數碼管位6顯示
#defineCH451_DIG70x0F00//數碼管位7顯示
//端口宏定義
#defineDCLK(1<<;PA3)
#defineDIN(1<<;PA5)
#defineLOAD(1<<;PA7)
#defineDOUT(1<<;PE5)
#defineCH451_DCLK_HIGHPORTA|=DCLK//時鐘信號
#defineCH451_DCLK_LOWPORTA&=~DCLK
#defineCH451_DIN_HIGHPORTA|=DIN//數據輸入
#defineCH451_DIN_LOWPORTA&=~DIN
#defineCH451_LOAD_HIGHPORTA|=LOAD//命令加載信號,上升延激活
#defineCH451_LOAD_LOWPORTA&=~LOAD
#defineCH451_DOUTPINE&DOUT//鍵盤中斷和鍵值數據輸出
externucharKeyValue;//鍵值全局聲明
//函數申明
voidCH451_WriteCommand(uintCommand);//CH451寫命令函數
voidCH451_Init();//CH451初始化函數
voidCH451_GetKeyValue();//CH451鍵盤代碼讀取函數
voidCH451_DisplayDig(ucharDIG,ucharData,ucharPoint);//CH451顯示一位數碼管函數
#endif
AVR CH451驅動程序文件
#include"CH451.h"
ucharKeyValue;//鍵值
//共陰數碼管編碼表
constucharDSYCode[18]={0x3F,0x06,0x5B,0x4F,//0,1,2,3
0x66,0x6D,0x7D,0x07,//4,5,6,7
0x7F,0x6F,0x77,0x7C,//8,9,A,b
0x39,0x5E,0x79,0x71,//C,d,E,F
0x40,0x00};//-,全滅
constuintDigCode[8]={CH451_DIG0,CH451_DIG1,CH451_DIG2,CH451_DIG3,
CH451_DIG4,CH451_DIG5,CH451_DIG6,CH451_DIG7};
//鍵盤編碼表
constucharKeyCode[16]={0x40,0x41,0x42,0x43,//0,1,2,3
0x48,0x49,0x4A,0x4B,//4,5,6,7
0x50,0x51,0x52,0x53,//8,9,A,B
0x58,0x59,0x5A,0x5B};//C,D,E,F
//CH451寫命令函數
voidCH451_WriteCommand(uintCommand){
uchari;
CH451_LOAD_LOW;//命令開始
for(i=0;i<12;i++){//送入12位數據,低位在前
if(Command&0x0001)CH451_DIN_HIGH;//輸出低位數據
elseCH451_DIN_LOW;
CH451_DCLK_LOW;
Command>>=1;//數據右移一位
CH451_DCLK_HIGH;//上升沿有效
}
CH451_LOAD_HIGH;//加載數據
}
//CH451初始化函數
voidCH451_Init(){
CH451_DIN_LOW;//低電平使能串行接口
CH451_DIN_HIGH;
CH451_WriteCommand(CH451_RESET);//復位CH451
CH451_WriteCommand(CH451_SYSON2);//開顯示、鍵盤
DDRE&=~DOUT;//PE5輸入方向
EICRB|=(1<
EIMSK|=(1<
}
//CH451鍵值讀取函數
voidCH451_GetKeyValue(){
uchari;
ucharGetKeyValue=0x00;//鍵盤代碼
CH451_WriteCommand(CH451_KEY);//發送讀取鍵值命令
for(i=0;i<7;i++){
GetKeyValue<<=1;
if(CH451_DOUT)GetKeyValue|=1;//從高到低讀入451的數據
elseGetKeyValue|=0;
CH451_DCLK_LOW;//下降沿有效
CH451_DCLK_HIGH;
}
if(GetKeyValue==0x00)return;//讀出鍵碼為0跳過
for(i=0;i<16;i++){//查找鍵盤代碼對應的鍵值
if(GetKeyValue==KeyCode){
KeyValue=i;
break;
}
}
}
//CH451顯示一位數碼管,DIG選擇數碼管,Data要顯示的數字,Point是否顯示小數點
voidCH451_DisplayDig(ucharDIG,ucharData,ucharPoint){
if(Point==1)CH451_WriteCommand(DigCode[DIG]|(DSYCode[Data]|0x80));
elseCH451_WriteCommand(DigCode[DIG]|DSYCode[Data]);
}
-
單片機
+關注
關注
6032文章
44514瀏覽量
632951 -
led數碼管
+關注
關注
2文章
73瀏覽量
22065 -
CH451
+關注
關注
0文章
10瀏覽量
12011
原文標題:AVR單片機驅動CH451實例程序_C語言
文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論