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