MSP430學(xué)習(xí)筆記7-4*4鍵盤的對(duì)應(yīng)數(shù)碼管顯示
這個(gè)例程也是開發(fā)板上面的一個(gè)經(jīng)典例程,我對(duì)程序的框架進(jìn)行了修改,更適合以后的調(diào)用。具體的4*4鍵盤掃描原理較為基礎(chǔ)這里不再贅述,這里我認(rèn)為比較重要的是要養(yǎng)成一個(gè)良好的寫程序的習(xí)慣,想4*4鍵盤掃描這樣的函數(shù)可以寫成一個(gè)固定的C或者H文件,便于以后調(diào)用。先看看主程序:
/***********************************************
程序功能:掃描4X4鍵盤并將鍵值在數(shù)碼管上顯示
------------------------------------------------
測(cè)試說明:按動(dòng)K1~K16按鍵,觀察數(shù)碼管顯示
************************************************/
#include
#include"Keypad.C"
//數(shù)碼管7位段碼:0--f
unsignedcharscandata[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//記錄顯示位數(shù)的全局變量
unsignedcharcnt=0;
//顯示緩存
unsignedcharDispbuf[2];
//引用外部變量的聲明
externunsignedcharkey_Pressed;
externunsignedcharkey_val;
externunsignedcharkey_Flag;
/********************主函數(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;
P6DIR|=BIT2;P6OUT|=BIT2;//關(guān)閉電平轉(zhuǎn)換
WDTCTL=WDT_ADLY_1_9;//設(shè)置內(nèi)部看門狗工作在定時(shí)器模式,1.9ms中斷一次
IE1|=WDTIE;//使能看門狗中斷
_EINT();//打開全局中斷
Init_Keypad();
while(1)
{
Key_Event();
if(key_Flag==1)
{
key_Flag=0;
Dispbuf[1]=key_val/10;
Dispbuf[0]=key_val%10;
}
}
}
/*******************************************
函數(shù)名稱:watchdog_timer
功能:看門狗中斷服務(wù)函數(shù),在這里輸出數(shù)碼管的
段選和位選信號(hào)
參數(shù):無
返回值:無
********************************************/
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
P4OUT=0xff;
P5OUT=scandata[Dispbuf[cnt]];//輸出段選信號(hào)
P4OUT&=~(1<<(cnt+2));//輸出位選信號(hào)
cnt++;//位計(jì)數(shù)變量在0~1之間循環(huán)
if(cnt==2)cnt=0;
}
主程序較為簡(jiǎn)單,具體的原理參見上一個(gè)筆記,在主程序中與鍵盤掃描相關(guān)的函數(shù)被擊中在Keypad.C中,需要說明的是在主函數(shù)中需要對(duì)Keypad.C的部分變量做聲明,這樣才能使用Keypad.C中的變量。Keypad.C代碼如下:
/********************************************************
4*4鍵盤掃描函數(shù)
作者:孫浩
修改時(shí)間:2010.8.2
程序說明:
此程序以開發(fā)板的例程做部分修改,更方便程序調(diào)用。
在調(diào)用之前需要注意需要在主函數(shù)中對(duì)程序中使用的變量做外部變量聲明
需要在主函數(shù)中聲明的變量如下:
//引用外部變量的聲明
externunsignedcharkey_Pressed;//按鍵是否被按下:1--是,0--否
externunsignedcharkey_val;//存放鍵值
externunsignedcharkey_Flag;//按鍵是否已放開:1--是,0--否
另外對(duì)應(yīng)的鍵值可以在本文件的全局變量中修改,只需要對(duì)應(yīng)修改
數(shù)組ucharkey_Map[]的對(duì)應(yīng)的值即可。
調(diào)用示例如下:
Init_Keypad();//先進(jìn)行初始化
while(1)
{
Key_Event();//在死循環(huán)中進(jìn)行鍵值掃描
if(key_Flag==1)//用來判斷有無按鍵按下,從而讀取鍵值進(jìn)行操作
{
key_Flag=0;//key_Flag需要手動(dòng)清零
}
}
**********************************************************/
#include
//相應(yīng)的函數(shù)聲明
voidInit_Keypad(void);//鍵盤初始化
voidCheck_Key(void);
voiddelay();
voidKey_Event(void);//讀取鍵盤函數(shù),在使用時(shí)通過此函數(shù)進(jìn)行鍵盤掃描
//選擇對(duì)應(yīng)的端口
#defineKEYOUTP1OUT
#defineKEYINP1IN
#defineKEYDIRP1DIR
typedefunsignedcharuchar;
typedefunsignedintuint;
/***************全局變量***************/
ucharkey_Pressed;//按鍵是否被按下:1--是,0--否
ucharkey_val;//存放鍵值
ucharkey_Flag;//按鍵是否已放開:1--是,0--否
//設(shè)置鍵盤邏輯鍵值與程序計(jì)算鍵值的映射
ucharkey_Map[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
/*******************************************
函數(shù)名稱:Init_Keypad
功能:初始化掃描鍵盤的IO端口
參數(shù):無
返回值:無
********************************************/
voidInit_Keypad(void)
{
KEYDIR=0xf0;//KEY.0~KEY.3設(shè)置為輸入狀態(tài),KEY.4~KEY.7設(shè)置為輸出狀態(tài)
KEYOUT|=0xf0;//KEY.4~KEY.7輸出高電平
key_Flag=0;
key_Pressed=0;
key_val=0;
}
/*********************************************
*Check_Key(),檢查按鍵,確認(rèn)鍵值
*********************************************/
/*******************************************
函數(shù)名稱:Check_Key
功能:掃描鍵盤的IO端口,獲得鍵值
參數(shù):無
返回值:無
**********************************