|
MSP430F149單片機(jī)開發(fā)板矩陣鍵盤控制程序,通過數(shù)碼管顯示按鍵值,采用逐行掃描,4X4鍵盤接在P1口,通過控制IO口狀態(tài)變化,逐行掃描按鍵是否按下。調(diào)試環(huán)境:EW430 V5.30- Config.h頭文件
- #define CPU_F ((double)8000000)
- #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
- #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
-
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
-
- /*當(dāng)BRCLK=CPU_F時(shí)用下面的公式可以計(jì)算,否則要根據(jù)設(shè)置加入分頻系數(shù)*/
- #define baud 9600 //設(shè)置波特率的大小
- #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率計(jì)算公式
- #define baud_h (uchar)(baud_setting>>8) //提取高位
- #define baud_l (uchar)(baud_setting) //低位
-
- #define LED8PORT P2OUT //P2接8個(gè)LED燈
- #define LED8SEL P2SEL //P2接8個(gè)LED燈
- #define LED8DIR P2DIR //P2接8個(gè)LED燈
-
- #define DATAPORT P4OUT //數(shù)據(jù)口所在端口P4
- #define DATASEL P4SEL //數(shù)據(jù)口功能寄存器,控制功能模式
- #define DATADIR P4DIR //數(shù)據(jù)口方向寄存器
-
- #define CTRPORT P6OUT //控制線所在的端口P6
- #define CTRSEL P6SEL //控制口功能寄存器,控制功能模式
- #define CTRDIR P6DIR //控制口方向寄存器
-
- #define DCTR0 P6OUT &= ~BIT4 //數(shù)碼管段控制位信號(hào)置低
- #define DCTR1 P6OUT |= BIT4 //數(shù)碼管段控制位信號(hào)置高
- #define WCTR0 P6OUT &= ~BIT3 //數(shù)碼管位控制位信號(hào)置低
- #define WCTR1 P6OUT |= BIT3 //數(shù)碼管位控制位信號(hào)置高
-
- #define KEYPORT P1OUT //按鍵所在的端口P1
- #define KEYSEL P1SEL //控制口功能寄存器,控制功能模式
- #define KEYDIR P1DIR //控制口方向寄存器
- #define KEYIN P1IN //鍵盤掃描判斷需要讀取IO口狀態(tài)值
-
- uchar key; //鍵值變量
-
- //***********************************************************************
- // 共陰數(shù)碼管顯示的斷碼表
- //***********************************************************************
-
- uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
-
- //***********************************************************************
- // 系統(tǒng)時(shí)鐘初始化
- //***********************************************************************
- void Clock_Init()
- {
- uchar i;
- BCSCTL1&=~XT2OFF; //打開XT2振蕩器
- BCSCTL2|=SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ
- do{
- IFG1&=~OFIFG; //清楚振蕩器錯(cuò)誤標(biāo)志
- for(i=0;i<100;i++)
- _NOP();
- }
- while((IFG1&OFIFG)!=0); //如果標(biāo)志位1,則繼續(xù)循環(huán)等待
- IFG1&=~OFIFG;
- }
- //***********************************************************************
- // MSP430內(nèi)部看門狗初始化
- //***********************************************************************
- void WDT_Init()
- {
- WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗
- }
-
- //***********************************************************************
- // 關(guān)閉數(shù)碼管
- //***********************************************************************
- void Close_LED()
- {
- DATASEL = 0x00; //設(shè)置IO口為普通I/O模式,此句可省
- DATADIR = 0xFF; //設(shè)置IO口方向?yàn)檩敵?br />
- DATAPORT = 0xFF; //P4口初始設(shè)置為FF
-
- CTRSEL = 0x00; //設(shè)置IO口為普通I/O模式,此句可省
- CTRDIR |= BIT3 + BIT4; //設(shè)置IO口方向?yàn)檩敵?控制口在P63,P64
- CTRPORT = 0xFF; //P6口初始設(shè)置為FF
-
- DCTR1; //關(guān)掉數(shù)碼管,以免顯示亂碼
- WCTR1;
- DATAPORT=0xFF; //關(guān)數(shù)碼管
- WCTR0;
- }
復(fù)制代碼 |
|