#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "mmu.h"
#include "stdio.h"
/*中斷處理函數(shù)按下不同按鈕進入該中斷處理,并根據(jù)按下的不同按鈕啟動不同功能,實現(xiàn)功能控制面板的按鈕功能*/
void __irq Eint_Isr(void)
{
switch(rEINTPEND)
{
case 1<<13: //功能1啟動,同時關閉功能2
rGPBDAT=0<<6|1<<7;
rEINTPEND=1<<13; //等待下一個自己的中斷進入
break;
case 1<<14: //功能2啟動,同時關閉功能1
rGPBDAT=1<<6|0<<7;
rEINTPEND=1<<14; //等待下一個自己的中斷進入
break;
case 1<<8: //關閉功能1和2
rGPBDAT=1<<6|1<<7;
rEINTPEND=1<<8; //等待下一個自己的中斷進入
break;
default:
rGPBDAT=1<<6|1<<7;
break;
}
ClearPending(BIT_EINT8_23); //等待下一個該中斷向量內(nèi)的任意中斷到來
}
/*設置啟動后的默認功能*/
void Led_on()
{
// 設置LED燈
rGPBCON=0x155555; //設置GPB為輸出
rGPBDAT=(0x1<<6)|(0x1<<7); //GPB7腳置位,led滅
}
/*設置按鈕出發(fā)方式*/
void Eint_func()
{
// 按鍵中斷源設置
rGPGCON=(rGPGCON&~((0x3<<0)|(0x3<<10)|(0x3<<12)))|(0x1<<1)|(0x1<<11)|(0x1<<13); //設置GPG0、5、6腳為EINT8、13、14
rGPGUP|=(0x1<<0)|(0x1<<5)|(0x1<<6); //引腳使用第二功能
rEXTINT1=rEXTINT1&~(0x7<<0);//|(0x1<<2); //按鈕1設置為低電平沿觸發(fā)
rEXTINT1=rEXTINT1&~(0x7<<20);//|(0x1<<22); //按鈕2設置為低電平沿觸發(fā)
rEXTINT1=rEXTINT1&~(0x7<<24);//|(0x1<<26); //按鈕3設置為低電平沿觸發(fā)
}
/*中斷初始化*/
void Eint_init()
{
rEINTMASK=rEINTMASK&~((0x1<<8)|(0x1<<13)|(0x1<<14)); // 使能外部中斷屏蔽,為0時不屏蔽中斷
/*設置中斷控制器*/
rINTMOD&=~BIT_EINT8_23; //設置中斷模式為IRQ
rINTMSK&=~BIT_EINT8_23; //啟動中斷使能
}
/*中斷掛起,等中斷*/
void Eint_wait()
{
rSRCPND=rSRCPND; //中斷掛起寄存器清除
rINTPND=rINTPND; //中斷源掛起寄存器清除
rEINTPEND|=(0x1<<8)|(0x1<<13)|(0x1<<14); //外部中斷掛起寄存器,Eint13掛起等待中斷
rSRCPND=BIT_EINT8_23; //中斷源掛起寄存器相應位置1等待中斷
rINTPND=BIT_EINT8_23; //中斷掛起寄存器相應位置1等待中斷
}
/*設置中斷指針*/
void Eint_p()
{
pISR_EINT8_23 =(U32)Eint_Isr; //設置中斷為Eint11響應
}
/*主程序開始*/
void Main()
{
// isr_asm(); //使能CPSR寄存器的I位
Led_on(); //啟動時將led熄滅
Eint_init(); //中斷初始化
Eint_func(); //中斷觸發(fā)狀態(tài)初始化
Eint_wait(); //等待中斷
Eint_p(); //中斷指針
}
|