新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 我的HD7279學習筆記——基于msp430g2553

        我的HD7279學習筆記——基于msp430g2553

        作者: 時間:2016-11-28 來源:網絡 收藏
        Createdon:2012-9-7

        Author:zhangbin

        本文引用地址:http://www.104case.com/article/201611/322844.htm

        學習筆記

        formsp430g2553

        redesignedbyzhangbin

        2012-09-07

        versions:12_09_01

        AllRightsReserved

        HD7279的基本說明如下:

        HD7279是一片具有串行接口的,可同時驅動8位共陰式數碼管(或64只獨立led)的智能顯示驅動芯片,該芯片同時還可連接多達64鍵的鍵盤矩陣,單片即可完成led顯示、鍵盤接口的全部功能。

        HD7279內部含有譯碼器,可直接接受BCD碼或16進制碼,并同時具有2種譯碼方式。此外,還具有多種控制指令,如消隱、閃爍、左移、右移、段尋址等。

        HD7279具有片選信號,可方便地實現多于8位的顯示或多于64鍵的鍵盤接口。

        典型應用:

        儀器儀表,工業控制,條形顯示器,控制面板

        特點:

        1串行接口,無需外圍元件可直接驅動led

        2各位獨立控制譯碼/不譯碼及消隱和閃爍屬性

        3(循環)左移/(循環)右移指令

        4具有段尋址指令,方便控制獨立led

        564鍵鍵盤空盒子器,內含去抖動電路

        6有DIP和SOIC兩種封裝形式供選擇

        2.引腳說明:
        VDD:電源VSS:
        CS:片選CLK:時鐘輸入端
        DATA:串行數據輸入/輸出端CLK0:振蕩輸出端
        KEY:按鍵有效輸出端RES:復位端
        SG-SA:段g—段a驅動輸出
        DP:小數點驅動輸出DIG0-7:數位0-7驅動輸出
        RC:RC振蕩器連接端

        HD7279A的控制指令分為二大類——純指令和帶有數據的指令

        具體的這兩種指令的詳解,參考數據手冊。

        上面的說明是摘錄數據手冊上的,只介紹了HD7279的基本大概情況,更詳細的介紹如:讀寫時序、詳細命令等,就要參考數據手冊了。

        單片機對各種外圍芯片、器件進行操作的時候,主要是處理好相互的通信。那么就要特別注意手冊上介紹的操作的時序,寫程序的時候,要嚴格按照時序寫就行了。

        下面是我寫的對HD7279進行操作的一個程序,是基于msp430g2553單片機的,可以控制4*4的16矩陣鍵盤。目前對led的操作還沒有實現,需要繼續完善程序,程序貼在了下面,注釋的也比較詳細:

        //本程序是為了測試鍵盤、led驅動芯片HD7279所寫的,主要完成HD7279讀,寫操作,控制4*4矩陣鍵盤和4led

        //4個led分別接到了DIG0~DIG3

        //目前這4個led還沒有控制得住,要繼續努力

        #include

        #include"ser_12864.h"

        //HD7279各個管腳定義

        #defineSET_CSP1OUT|=BIT0;

        #defineCLR_CSP1OUT&=~BIT0;

        #defineSET_CLKP1OUT|=BIT1;

        #defineCLR_CLKP1OUT&=~BIT1;

        #defineDATA_INP1DIR&=~BIT2;//data腳設為輸入

        #defineDATA_OUTP1DIR|=BIT2;//data腳設為輸出

        #defineSET_DATAP1OUT|=BIT2;

        #defineCLR_DATAP1OUT&=~BIT2;

        //#defineDATAP1IN&BIT2;

        //#defineKEYP1IN&BIT3;

        //HD7279基本命令定義

        #defineCMD_RESET0xa4//復位(清除)指令

        #defineCMD_TEST0xbf//測試指令

        #defineRTL_UNCYL0xa1//左移指令

        #defineRTR_UNCYL0xa0//右移指令

        #defineRTL_CYCLE0xa3//循環左移指令

        #defineRTR_CYCLE0xa2//循環右移指令

        #defineDECODE00x80//方式0譯碼

        #defineDECODE10xc8//方式1譯碼

        #defineUNDECODE0x90//不帶小數點顯示

        #defineBLINKCTL0x88//閃爍控制

        #defineACTCTL0x98//消隱控制

        #defineSEGON0xe0//段點亮指令

        #defineSEGOFF0xc0//段關閉指令

        #defineCMD_READ0x15//讀取鍵盤數據指令

        //long_delayshort_delay延時57us延時11us

        #definelong_delay()delay_us(57);

        #defineshort_delay()delay_us(11);

        uintkey_code[]={61,36,37,38,44,45,46,52,53,54};//鍵盤上的數字鍵對應的鍵值,在程序中要進行處理,要轉化為0~9

        //數組中為數字0~9對應的鍵值,順序不能變

        ucharkey=0;//按下的鍵碼

        //向HD7279中發送指令相當于寫純指令

        voidsend_byte(ucharcom)

        {

        uchari=0;

        CLR_CS;

        long_delay();

        for(i=0;i<8;i++)//發送命令,高位在前一個時鐘脈沖,送一位數據到7279中

        {

        if(com&0x80)//高位在前

        {

        SET_DATA;

        }

        else

        {

        CLR_DATA;

        }

        SET_CLK;//發生脈沖

        short_delay();

        CLR_CLK;

        short_delay();

        com<<=1;//左移一位

        }

        CLR_DATA;

        }

        //從7279中讀取數據

        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腳設為輸入DATA為P12

        if(P1IN&BIT2)

        {

        in_byte=in_byte|0x01;

        }

        CLR_CLK;

        short_delay();

        }

        DATA_OUT;//把data設為輸出

        CLR_DATA;

        return(in_byte);

        }

        //向7279中寫入帶數據的指令

        voidwr_data_com(ucharcom,uchardata)//先發送指令,再發送數據

        {

        send_byte(com);//發送指令

        send_byte(data);//發送數據

        }

        //從7279中讀取鍵盤數據函數

        ucharrd_key()

        {

        send_byte(CMD_READ);//先寫入讀取鍵盤數據的指令

        return(receive_byte());//返回接收到的數據,即為鍵值

        }

        //7279的初始化函數

        voidhd7279_init()

        {

        delay_ms(50);//上電延遲

        P1DIR|=BIT0+BIT1+BIT2;//單片機相關IO口設置

        //P1DIR&=~BIT3;//KEY為輸入

        send_byte(CMD_RESET);//輸入清除指令

        delay_ms(50);

        }

        //因為當HD7279A檢測到有效的按鍵時,KEY引腳從高電平變為低電平,并一直保持到按鍵結束,所以可以用下降沿出發,也可以用上升沿出發

        voidinterrupt_init()

        {

        //在本程序中,按鍵按下于不按下,key的電平要么為高,要么為低,是確定的,不會有懸空浮動狀態,所以下面兩句內部拉電阻的設置可以不用要

        //P1REN|=BIT3;//pullup內部上拉電阻使能

        //////使用中斷時,使能內部的上拉電阻這樣當該腳懸空是,電平不會跳變,防止懸空時電平跳變不停的觸發中斷

        //P1OUT=BIT3;//當引腳上的上拉或下拉電阻使能時,PxOUT選擇是上拉還是下來

        //////0:下拉,1:上拉

        P1IE|=BIT3;//P1.3interruptenabledP13中斷使能

        P1IES|=BIT3;//P1.3Hi/loedge下降沿中斷

        P1IFG&=~BIT3;//P1.3IFGcleared中斷標志位清零

        }

        voidmain(void)

        {

        unsignedchars1[]={"key:"};

        WDTCTL=WDTPW+WDTHOLD;//停止看門狗定時器

        BCSCTL1=CALBC1_12MHZ;//設定cpu時鐘DCO頻率為12MHz

        DCOCTL=CALDCO_12MHZ;

        P2DIR|=BIT5+BIT4;//液晶的兩條線

        init_lcd();

        hd7279_init();

        interrupt_init();//IO中斷初始化

        P1DIR|=BIT6;

        P1OUT&=~BIT6;

        wr_string(0,0,s1);//第一行第一個位置顯示s1

        _BIS_SR(LPM4_bits+GIE);//進入LPM4開中斷

        }

        //Port1interruptserviceroutine

        #pragmavector=PORT1_VECTOR

        __interruptvoidPort_1(void)

        {

        uchari=0;

        _DINT();

        P1OUT|=BIT6;

        key=rd_key();//讀取鍵值

        //while((P1IN&BIT3)==0);//等待按鍵松開

        for(i=0;i<10;i++)

        {

        if(key==key_code[i])//利用數組進行鍵值轉化

        key=i;//轉化為了對應的數字

        }

        wr_int(1,0,key);//顯示

        P1IFG&=~BIT3;//中斷標志位清零

        _EINT();//打開中斷

        }

        //下面是用死循環檢測按鍵按下,這種方法可以,但是不靈敏,并且浪費cpu資源改進是用key出發IO口中斷,然后進行鍵盤處理

        //for(;;)//用死循環檢測按鍵按下

        //{

        //if((P1IN&BIT3)==0)//當HD7279A檢測到有效的按鍵時,KEY引腳從高電平變為低電平,并一直保持到按鍵結束。在此期間,

        ////如果HD7279A接收到‘讀鍵盤數據指令’,則輸出當前按鍵的鍵盤代碼;如果在收到‘讀鍵盤指令’時沒有有效按鍵,HD7279A將輸出FFH。

        //

        //{

        //key=rd_key();//讀取鍵值

        //while((P1IN&BIT3)==0);//等待按鍵松開

        //}

        //wr_int(2,0,key);//顯示

        //}

        //對應鍵值:1-362-373-384-445-456-467-528-539-540-61*-60#-62A-39B-47C-55D-63



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 武汉市| 九龙坡区| 辛集市| 交口县| 绥化市| 北辰区| 昔阳县| 富阳市| 财经| 富裕县| 襄城县| 郁南县| 韶山市| 岳普湖县| 樟树市| 仙桃市| 石城县| 五原县| 五台县| 洪泽县| 太原市| 凤庆县| 平乐县| 泗阳县| 英吉沙县| 东方市| 翁牛特旗| 中卫市| 绍兴市| 荥经县| 汪清县| 台南县| 营口市| 甘谷县| 渝北区| 合江县| 辉南县| 齐齐哈尔市| 拉萨市| 白河县| 梓潼县|