一.前言
通過上次的學習,我們學習了如何用按鍵控制led,但是在實際應用中,這種查詢方式占用了cpu的時間,如果通過中斷控制就可以解決這個問題,我們今天就來學習按鍵控制的中斷方式。
二.原理分析
傳統的51單片機如果要使用中斷,也要對相應的寄存器進行控制,cc2530芯片也不例外,而且相對復雜。需要配置多個中斷寄存器,下面來一一介紹。
這個寄存器是來控制端口0中斷使能的,要開啟中斷,應設為1.
這個是配置各種中斷使能的,我們只需要配置P0IE.
這個是配置中斷觸發方式的,根據上次的按鍵原理圖,我們應該選擇低下降沿觸發模式。
中斷狀態標志位,當中斷沒有發生或者結束時,應將標志位置0.
三.程序代碼
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //LED1為P1_0端口控制
#define LED2 P1_1 //LED2為P1_1端口控制
#define LED3 P1_4 //LED3為P1_4端口控制
//函數聲明 void Delayms(uint);
//延時函數 void InitLed(void);
//LED_IO初始化 void KeyInit(void);
//KEY_IO初始化
/************** 函 數 名 : Delayms 功能描述 : 毫秒延時 輸入參數 : xms:延時時間,如 i=xms 即延時i毫秒 輸出參數 : none 返 回 值 : none **/
void Delayms(uint xms)
{ uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/******************* 函 數 名 : InitLed 功能描述 : LED_IO初始化 輸入參數 : none 輸出參數 : none 返 回 值 : none *********************************/
void InitLed(void)
{ P1DIR |= 0xff; //P1端口定義為輸出
LED1 = 1; //LED1燈熄滅
LED2 = 1; //LED2燈熄滅
LED3 = 1; //LED3燈熄滅 }
/********************* 函 數 名 : InitKey 功能描述 : KEY_IO初始化(中斷方式配置) 輸入參數 : none 輸出參數 : none 返 回 值 : none ******************/
void InitKey(void)
{ P0IEN |= 0x10; //設置P0_4為中斷方式
IEN1 |= 0x20; //允許P0口中斷
PICTL |= 0x01; //下降沿觸發
P0IFG = 0x00; //清中斷標志位
EA = 1; //開總中斷 }
/************** 函 數 名 : P0_ISR 功能描述 : 中斷處理函數 輸入參數 : none 輸出參數 : none 返 回 值 : none ***********/
#pragma vector = P0INT_VECTOR //格式:#pragma vector = 中斷向量
__interrupt void P0_ISR(void) //接着是中斷處理程序(函數名可以任意取)
{ LED1=~LED1; //改變LED狀態
LED2=~LED2;
LED3=~LED3;
P0IFG = 0; //清中斷標志
P0IF = 0; }
/******************* 函 數 名 : main 功能描述 : KEY測試(通用IO中斷的使用) 輸入參數 : NONE 輸出參數 : NONE 返 回 值 : NONE ************/
void main(void)
{ InitLed(); //調用初始化函數
InitKey();
while(1); }
四.總結
led的控制函數和之前一樣,大家要注意中斷函數的定義,這是一種定義中斷的格式,還有一定要使POIF=0,用來清除標志位,這樣中斷才能發生,還有大家學會用模塊化的思想去寫程序。