天天看點

MSP430學習筆記6-動态數位管的顯示

這個程式主要部分是我改寫的,程式把看門狗當做普通定時器使用,在看門狗中斷中進行數位管掃描,另外我加入了顯示的緩沖區,想在數位管上顯示什麼數字隻需要對緩沖數組中的值進行操作即可。最後加入了小數點的操作,可以很友善的加入小數點,程式如下:

/********************************************** 

程式功能:在八位數位管上顯示任意數字 

----------------------------------------------- 

撥碼開關設定:将SMG位撥至ON,其餘撥至OFF 

測試說明:觀察數位管顯示 

***********************************************/  

#include  <msp430x14x.h>  

typedef unsigned char uchar;  

//數位管7位段碼:0--f  

uchar scandata[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,  

                      0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//段碼  

uchar dispbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//将端口的片選信号編碼  

uchar disbuf[8] = {8,8,1,3,1,9,4,2};//存放要顯示的資料  

//記錄顯示位數的全局變量  

uchar cnt = 0;//用來掃描計數  

uchar dotn = 2;//用來選擇第幾位後面顯示小數點  

/********************主函數********************/  

void main(void)  

{  

    /*下面六行程式關閉所有的IO口*/  

    P1DIR = 0XFF;P1OUT = 0XFF;  

    P2DIR = 0XFF;P2OUT = 0XFF;  

    P3DIR = 0XFF;P3OUT = 0XFF;  

    P4DIR = 0XFF;P4OUT = 0XFF;  

    P5DIR = 0XFF;P5OUT = 0XFF;  

    P6DIR = 0XFF;P6OUT = 0XFF;  

    //這裡面看門狗用作普通的定時器,要來對數位管進行動态掃描,如果看門狗有其他作用  

    //可以用定時器代替  

    WDTCTL = WDT_ADLY_1_9;        // 設定内部看門狗工作在定時器模式,1.9ms中斷一次  

    //可以去看頭檔案中具體的配置,這裡使用的手表晶振64分頻計算可得是1.9ms  

    IE1 |= WDTIE;                 // 使能看門狗中斷  

    P6DIR |= BIT2;P6OUT |= BIT2;  //關閉電平轉換  

    P5DIR = 0xff;                 //設定P4,P5的IO方向為輸出  

    P4DIR = 0xff;                   

    P5OUT = 0x00;                 //設定P4,P5的輸出初值  

    P4OUT = 0xff;  

    _BIS_SR(LPM3_bits + GIE);     //CPU進入LPM3低功耗模式,同時打開全局中斷  

    //這個地方要注意LPM3低功耗模式下其他時鐘源是關閉的,隻能使用ACLK時鐘源  

}  

/******************************************* 

函數名稱:watchdog_timer 

功    能:看門狗中斷服務函數,在這裡輸出數位管的 

          段選和位選信号 

參    數:無 

傳回值  :無 

********************************************/  

#pragma vector=WDT_VECTOR  

__interrupt void watchdog_timer(void)  

{   

    uchar temp;  

     if(cnt == (dotn-1))//判斷要不要顯示小數點  

    {  

      temp = scandata[disbuf[cnt]]&0x7F;//如果要顯示的就将要顯示的段碼先進行一步運算  

      P5OUT = temp;  

    }  

    else  

    P5OUT = scandata[disbuf[cnt]];        //輸出段選信号  

    P4OUT ^= dispbitcode[7-cnt];           //輸出位選信号由于用了三極管驅動,實際是低電平選通是以翻一下。  

    //發現顯示的順序是倒着的,減一下把順序正過來  

    cnt++;                        //位計數變量在0~8之間循環  

    if(cnt == 8) cnt = 0;  

本文轉自emouse部落格園部落格,原文連結:http://www.cnblogs.com/emouse/archive/2010/07/22/2198219.html,如需轉載請自行聯系原作者

繼續閱讀