Createdon:2012-9-7Author:zhangbin
本文引用地址:http://www.ex-cimer.com/article/201611/322844.htm
學(xué)習(xí)筆記
formsp430g2553
redesignedbyzhangbin
2012-09-07
versions:12_09_01
AllRightsReserved
HD7279的基本說(shuō)明如下:
HD7279是一片具有串行接口的,可同時(shí)驅(qū)動(dòng)8位共陰式數(shù)碼管(或64只獨(dú)立led)的智能顯示驅(qū)動(dòng)芯片,該芯片同時(shí)還可連接多達(dá)64鍵的鍵盤矩陣,單片即可完成led顯示、鍵盤接口的全部功能。
HD7279內(nèi)部含有譯碼器,可直接接受BCD碼或16進(jìn)制碼,并同時(shí)具有2種譯碼方式。此外,還具有多種控制指令,如消隱、閃爍、左移、右移、段尋址等。
HD7279具有片選信號(hào),可方便地實(shí)現(xiàn)多于8位的顯示或多于64鍵的鍵盤接口。
典型應(yīng)用:
儀器儀表,工業(yè)控制,條形顯示器,控制面板
特點(diǎn):
1串行接口,無(wú)需外圍元件可直接驅(qū)動(dòng)led
2各位獨(dú)立控制譯碼/不譯碼及消隱和閃爍屬性
3(循環(huán))左移/(循環(huán))右移指令
4具有段尋址指令,方便控制獨(dú)立led
564鍵鍵盤空盒子器,內(nèi)含去抖動(dòng)電路
6有DIP和SOIC兩種封裝形式供選擇
2.引腳說(shuō)明:
VDD:正電源VSS:地
CS:片選CLK:時(shí)鐘輸入端
DATA:串行數(shù)據(jù)輸入/輸出端CLK0:振蕩輸出端
KEY:按鍵有效輸出端RES:復(fù)位端
SG-SA:段g—段a驅(qū)動(dòng)輸出
DP:小數(shù)點(diǎn)驅(qū)動(dòng)輸出DIG0-7:數(shù)位0-7驅(qū)動(dòng)輸出
RC:RC振蕩器連接端
HD7279A的控制指令分為二大類——純指令和帶有數(shù)據(jù)的指令
具體的這兩種指令的詳解,參考數(shù)據(jù)手冊(cè)。
上面的說(shuō)明是摘錄數(shù)據(jù)手冊(cè)上的,只介紹了HD7279的基本大概情況,更詳細(xì)的介紹如:讀寫時(shí)序、詳細(xì)命令等,就要參考數(shù)據(jù)手冊(cè)了。
用單片機(jī)對(duì)各種外圍芯片、器件進(jìn)行操作的時(shí)候,主要是處理好相互的通信。那么就要特別注意手冊(cè)上介紹的操作的時(shí)序,寫程序的時(shí)候,要嚴(yán)格按照時(shí)序?qū)懢托辛恕?/p>
下面是我寫的對(duì)HD7279進(jìn)行操作的一個(gè)程序,是基于msp430g2553單片機(jī)的,可以控制4*4的16矩陣鍵盤。目前對(duì)led的操作還沒(méi)有實(shí)現(xiàn),需要繼續(xù)完善程序,程序貼在了下面,注釋的也比較詳細(xì):
//本程序是為了測(cè)試鍵盤、led驅(qū)動(dòng)芯片HD7279所寫的,主要完成HD7279讀,寫操作,控制4*4矩陣鍵盤和4led
//4個(gè)led分別接到了DIG0~DIG3
//目前這4個(gè)led還沒(méi)有控制得住,要繼續(xù)努力
#include
#include"ser_12864.h"
//HD7279各個(gè)管腳定義
#defineSET_CSP1OUT|=BIT0;
#defineCLR_CSP1OUT&=~BIT0;
#defineSET_CLKP1OUT|=BIT1;
#defineCLR_CLKP1OUT&=~BIT1;
#defineDATA_INP1DIR&=~BIT2;//data腳設(shè)為輸入
#defineDATA_OUTP1DIR|=BIT2;//data腳設(shè)為輸出
#defineSET_DATAP1OUT|=BIT2;
#defineCLR_DATAP1OUT&=~BIT2;
//#defineDATAP1IN&BIT2;
//#defineKEYP1IN&BIT3;
//HD7279基本命令定義
#defineCMD_RESET0xa4//復(fù)位(清除)指令
#defineCMD_TEST0xbf//測(cè)試指令
#defineRTL_UNCYL0xa1//左移指令
#defineRTR_UNCYL0xa0//右移指令
#defineRTL_CYCLE0xa3//循環(huán)左移指令
#defineRTR_CYCLE0xa2//循環(huán)右移指令
#defineDECODE00x80//方式0譯碼
#defineDECODE10xc8//方式1譯碼
#defineUNDECODE0x90//不帶小數(shù)點(diǎn)顯示
#defineBLINKCTL0x88//閃爍控制
#defineACTCTL0x98//消隱控制
#defineSEGON0xe0//段點(diǎn)亮指令
#defineSEGOFF0xc0//段關(guān)閉指令
#defineCMD_READ0x15//讀取鍵盤數(shù)據(jù)指令
//long_delayshort_delay延時(shí)57us延時(shí)11us
#definelong_delay()delay_us(57);
#defineshort_delay()delay_us(11);
uintkey_code[]={61,36,37,38,44,45,46,52,53,54};//鍵盤上的數(shù)字鍵對(duì)應(yīng)的鍵值,在程序中要進(jìn)行處理,要轉(zhuǎn)化為0~9
//數(shù)組中為數(shù)字0~9對(duì)應(yīng)的鍵值,順序不能變
ucharkey=0;//按下的鍵碼
//向HD7279中發(fā)送指令相當(dāng)于寫純指令
voidsend_byte(ucharcom)
{
uchari=0;
CLR_CS;
long_delay();
for(i=0;i<8;i++)//發(fā)送命令,高位在前一個(gè)時(shí)鐘脈沖,送一位數(shù)據(jù)到7279中
{
if(com&0x80)//高位在前
{
SET_DATA;
}
else
{
CLR_DATA;
}
SET_CLK;//發(fā)生脈沖
short_delay();
CLR_CLK;
short_delay();
com<<=1;//左移一位
}
CLR_DATA;
}
//從7279中讀取數(shù)據(jù)
ucharreceive_byte(void)
{
unsignedchari,in_byte;
SET_DATA;//settoinputmode
long_delay();
for(i=0;i<8;i++)
{
SET_CLK;
short_delay();
in_byte=in_byte<<1;
DATA_IN;//把DATA腳設(shè)為輸入DATA為P12
if(P1IN&BIT2)
{
in_byte=in_byte|0x01;
}
CLR_CLK;
short_delay();
}
DATA_OUT;//把data設(shè)為輸出
CLR_DATA;
return(in_byte);
}
//向7279中寫入帶數(shù)據(jù)的指令
voidwr_data_com(ucharcom,uchardata)//先發(fā)送指令,再發(fā)送數(shù)據(jù)
{
send_byte(com);//發(fā)送指令
send_byte(data);//發(fā)送數(shù)據(jù)
}
//從7279中讀取鍵盤數(shù)據(jù)函數(shù)
ucharrd_key()
{
send_byte(CMD_READ);//先寫入讀取鍵盤數(shù)據(jù)的指令
return(receive_byte());//返回接收到的數(shù)據(jù),即為鍵值
}
//7279的初始化函數(shù)
voidhd7279_init()
{
delay_ms(50);//上電延遲
P1DIR|=BIT0+BIT1+BIT2;//單片機(jī)相關(guān)IO口設(shè)置
//P1DIR&=~BIT3;//KEY為輸入
send_byte(CMD_RESET);//輸入清除指令
delay_ms(50);
}
//因?yàn)楫?dāng)HD7279A檢測(cè)到有效的按鍵時(shí),KEY引腳從高電平變?yōu)榈碗娖?,并一直保持到按鍵結(jié)束,所以可以用下降沿出發(fā),也可以用上升沿出發(fā)
voidinterrupt_init()
{
//在本程序中,按鍵按下于不按下,key的電平要么為高,要么為低,是確定的,不會(huì)有懸空浮動(dòng)狀態(tài),所以下面兩句內(nèi)部拉電阻的設(shè)置可以不用要
//P1REN|=BIT3;//pullup內(nèi)部上拉電阻使能
//////使用中斷時(shí),使能內(nèi)部的上拉電阻這樣當(dāng)該腳懸空是,電平不會(huì)跳變,防止懸空時(shí)電平跳變不停的觸發(fā)中斷
//P1OUT=BIT3;//當(dāng)引腳上的上拉或下拉電阻使能時(shí),PxOUT選擇是上拉還是下來(lái)
//////0:下拉,1:上拉
P1IE|=BIT3;//P1.3interruptenabledP13中斷使能
P1IES|=BIT3;//P1.3Hi/loedge下降沿中斷
P1IFG&=~BIT3;//P1.3IFGcleared中斷標(biāo)志位清零
}
voidmain(void)
{
unsignedchars1[]={"key:"};
WDTCTL=WDTPW+WDTHOLD;//停止看門狗定時(shí)器
BCSCTL1=CALBC1_12MHZ;//設(shè)定cpu時(shí)鐘DCO頻率為12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT5+BIT4;//液晶的兩條線
init_lcd();
hd7279_init();
interrupt_init();//IO中斷初始化
P1DIR|=BIT6;
P1OUT&=~BIT6;
wr_string(0,0,s1);//第一行第一個(gè)位置顯示s1
_BIS_SR(LPM4_bits+GIE);//進(jìn)入LPM4開(kāi)中斷
}
//Port1interruptserviceroutine
#pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
{
uchari=0;
_DINT();
P1OUT|=BIT6;
key=rd_key();//讀取鍵值
//while((P1IN&BIT3)==0);//等待按鍵松開(kāi)
for(i=0;i<10;i++)
{
if(key==key_code[i])//利用數(shù)組進(jìn)行鍵值轉(zhuǎn)化
key=i;//轉(zhuǎn)化為了對(duì)應(yīng)的數(shù)字
}
wr_int(1,0,key);//顯示
P1IFG&=~BIT3;//中斷標(biāo)志位清零
_EINT();//打開(kāi)中斷
}
//下面是用死循環(huán)檢測(cè)按鍵按下,這種方法可以,但是不靈敏,并且浪費(fèi)cpu資源改進(jìn)是用key出發(fā)IO口中斷,然后進(jìn)行鍵盤處理
//for(;;)//用死循環(huán)檢測(cè)按鍵按下
//{
//if((P1IN&BIT3)==0)//當(dāng)HD7279A檢測(cè)到有效的按鍵時(shí),KEY引腳從高電平變?yōu)榈碗娖?,并一直保持到按鍵結(jié)束。在此期間,
////如果HD7279A接收到‘讀鍵盤數(shù)據(jù)指令’,則輸出當(dāng)前按鍵的鍵盤代碼;如果在收到‘讀鍵盤指令’時(shí)沒(méi)有有效按鍵,HD7279A將輸出FFH。
//
//{
//key=rd_key();//讀取鍵值
//while((P1IN&BIT3)==0);//等待按鍵松開(kāi)
//}
//wr_int(2,0,key);//顯示
//}
//對(duì)應(yīng)鍵值:1-362-373-384-445-456-467-528-539-540-61*-60#-62A-39B-47C-55D-63
評(píng)論