MSP430學(xué)習(xí)筆記6-動態(tài)數(shù)碼管的顯示
這個程序主要部分是我改寫的,程序把看門狗當(dāng)做普通定時器使用,在看門狗中斷中進(jìn)行數(shù)碼管掃描,另外我加入了顯示的緩沖區(qū),想在數(shù)碼管上顯示什么數(shù)字只需要對緩沖數(shù)組中的值進(jìn)行操作即可。最后加入了小數(shù)點的操作,可以很方便的加入小數(shù)點,程序如下:
/**********************************************
程序功能:在八位數(shù)碼管上顯示任意數(shù)字
-----------------------------------------------
撥碼開關(guān)設(shè)置:將SMG位撥至ON,其余撥至OFF
測試說明:觀察數(shù)碼管顯示
***********************************************/
#include
typedefunsignedcharuchar;
//數(shù)碼管7位段碼:0--f
ucharscandata[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//段碼
uchardispbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//將端口的片選信號編碼
uchardisbuf[8]={8,8,1,3,1,9,4,2};//存放要顯示的數(shù)據(jù)
//記錄顯示位數(shù)的全局變量
ucharcnt=0;//用來掃描計數(shù)
uchardotn=2;//用來選擇第幾位后面顯示小數(shù)點
/********************主函數(shù)********************/
voidmain(void)
{
/*下面六行程序關(guān)閉所有的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;
//這里面看門狗用作普通的定時器,要來對數(shù)碼管進(jìn)行動態(tài)掃描,如果看門狗有其他作用
//可以用定時器代替
WDTCTL=WDT_ADLY_1_9;//設(shè)置內(nèi)部看門狗工作在定時器模式,1.9ms中斷一次
//可以去看頭文件中具體的配置,這里使用的手表晶振64分頻計算可得是1.9ms
IE1|=WDTIE;//使能看門狗中斷
P6DIR|=BIT2;P6OUT|=BIT2;//關(guān)閉電平轉(zhuǎn)換
P5DIR=0xff;//設(shè)置P4,P5的IO方向為輸出
P4DIR=0xff;
P5OUT=0x00;//設(shè)置P4,P5的輸出初值
P4OUT=0xff;
_BIS_SR(LPM3_bits+GIE);//CPU進(jìn)入LPM3低功耗模式,同時打開全局中斷
//這個地方要注意LPM3低功耗模式下其他時鐘源是關(guān)閉的,只能使用ACLK時鐘源
}
/*******************************************
函數(shù)名稱:watchdog_timer
功能:看門狗中斷服務(wù)函數(shù),在這里輸出數(shù)碼管的
段選和位選信號
參數(shù):無
返回值:無
********************************************/
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
P4OUT=0xff;
uchartemp;
if(cnt==(dotn-1))//判斷要不要顯示小數(shù)點
{
temp=scandata[disbuf[cnt]]&0x7F;//如果要顯示的就將要顯示的段碼先進(jìn)行一步運(yùn)算
P5OUT=temp;
}
else
P5OUT=scandata[disbuf[cnt]];//輸出段選信號
P4OUT^=dispbitcode[7-cnt];//輸出位選信號由于用了三極管驅(qū)動,實際是低電平選通因此翻一下。
//發(fā)現(xiàn)顯示的順序是倒著的,減一下把順序正過來
cnt++;//位計數(shù)變量在0~8之間循環(huán)
if(cnt==8)cnt=0;
}