?? 5_3_2.c
字號:
//6.3.2 程序清單
#include <p30f6014.h> //dsPIC30F6014標準頭文件
/*配置位*/
_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍頻晶振,Failsafe 時鐘關閉
_FWDT(WDT_OFF); //關閉看門狗定時器
_FBORPOR(PBOR_OFF & MCLR_EN); //掉電復位禁止,MCLR復位使能。
_FGS(CODE_PROT_OFF); //代碼保護禁止
#define Fcy 7370000 //7.37MHz外部晶振帶4倍頻,指令周期為7.37MIPs
#define SW1 !PORTAbits.RA12 //按鍵SW1(RA12)低電位有效
int main(void)
{
/*設置LED控制寄存器和定時器*/
//初始化LED端口和按鍵開關端口
LATD = 0xFFFF; //關閉所有LED
TRISD = 0xFFF0; //設定LED引腳為輸出
TRISA = 0xFFFF; //設定按鍵開關引腳為輸入
/*設定CPU的優先級*/
SRbits.IPL = 4; //設定CPU的優先級為4
/*初始化定時器1為1/10秒*/
T1CON = 0; //關閉定時器1
TMR1 = 0; //啟動定時器1的計數寄存器為0
PR1 = (Fcy/256)/10; //設定1/10秒延時時間
T1CON = 0x8030; //配置定時器1 (定時器開, 在空閑模式定時器繼續作,
//門控時間累加禁止, 預分頻比是1:256, 內部時鐘)
/**設定定時器1的中斷優先級并使能中斷/
IPC0bits.T1IP = 3; //設定定時器1的中斷優先級為3
IFS0bits.T1IF = 0; //清定時器1的中斷標志
IEC0bits.T1IE = 1; //使能定時器1中斷
/*初始化定時器2為1秒*/
T2CON = 0; //關閉定時器2
TMR2 = 0; //啟動定時器2的計數寄存器為0
PR2 = (Fcy/256); //設定1秒延時時間
T2CON = 0x8030; //配置定時器1 (定時器開, 在空閑模式定時器繼續工作,
//門控時間累加禁止, 預分頻比是1:256, 內部時鐘)
/*設定定時器2的中斷優先級并使能中斷*/
IPC1bits.T2IP = 5; //設定定時器2的中斷優先級為5
IFS0bits.T2IF = 0; //清定時器2的中斷標志
IEC0bits.T2IE = 1; //使能定時器2中斷
while(!SW1); // 等待按鍵SW1按下
/*按鍵SW1按下,則改變CPU的中斷優先級*/
while (1)
{
if(!SW1) //如果SW1沒有按下
{
LATDbits.LATD3 = 1; //LED4關閉
SRbits.IPL = 2; //設定CPU的優先級為2
}
else //如果SW1按下
{
LATDbits.LATD3 = 0; // LED4 開
SRbits.IPL = 6; //設定CPU的優先級為 6
}
}
}
/*定時器1中斷服務程序*/
void _ISR _T1Interrupt(void)
{
IFS0bits.T1IF = 0; //清除定時1中斷標志
LATDbits.LATD0 = 0; //LED1開
while(IFS0bits.T1IF == 0); //等待下一個定時器1中斷
IFS0bits.T1IF = 0; //清除定時1中斷標志
LATDbits.LATD0 = 1; // LED1關
}
/*定時器2中斷服務程序*/
void _ISR _T2Interrupt(void)
{
IFS0bits.T2IF = 0; //清除定時2中斷標志
LATDbits.LATD1 = 0; // LED2開
while(IFS0bits.T2IF == 0); //等待下一個定時器2中斷
IFS0bits.T2IF = 0; //清除定時2中斷標志
LATDbits.LATD1 = 1; // LED2關
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -