|
|
//AI寫的定時(shí)器0應(yīng)用:PA4接一個LED(低電平亮,高電平滅),1秒亮1秒滅,這樣循環(huán)。看看代碼有沒有問
題
#include "SYSCFG.h"
#include "FT60F21X.h"
// 宏定義:LED引腳(PA4)及中斷計(jì)數(shù)變量
#define LED_PIN PA4
unsigned char timer0_cnt = 0; // Timer0溢出計(jì)數(shù)(16ms/次)
bit led_flag = 0; // LED狀態(tài)標(biāo)志(0:滅,1:亮)
/*-------------------------------------------------
* 函數(shù)名:interrupt ISR
* 功能:中斷處理(Timer0溢出中斷)
* 說明:每16ms進(jìn)入一次中斷,計(jì)數(shù)62次后翻轉(zhuǎn)LED狀態(tài)
--------------------------------------------------*/
void interrupt ISR(void)
{
if (INTCON & 0x04) // 檢查Timer0溢出標(biāo)志(T0IF=1)
{
timer0_cnt++; // 溢出次數(shù)累加
if (timer0_cnt >= 62) // 62次×16ms≈1秒
{
timer0_cnt = 0; // 計(jì)數(shù)清零
led_flag = ~led_flag; // 翻轉(zhuǎn)LED狀態(tài)標(biāo)志
LED_PIN = led_flag; // 更新PA4電平(低電平亮)
}
INTCON &= ~(1 << 2); // 清除T0IF中斷標(biāo)志
TMR0 = 0; // 重置Timer0計(jì)數(shù)初值
}
}
/*----------------------------------------------------
* 函數(shù)名:TIMER0_INITIAL
* 功能:Timer0初始化
* 定時(shí)計(jì)算:(1/8MHz)×4(指令周期)×128(預(yù)分頻)×255≈16ms
----------------------------------------------------*/
void TIMER0_INITIAL(void)
{
T0ON = 0; // 關(guān)閉Timer0(配置期間)
TMR0 = 0; // 計(jì)數(shù)初值清零
T0CON0 = 0x00; // 時(shí)鐘源選擇指令周期,禁止Timer0(后續(xù)手動使能)
OPTION = 0x06; // 配置預(yù)分頻:1:128(PS2-PS0=110),分頻器分配給Timer0(PSA=0)
T0ON = 1; // 使能Timer0
}
/*-------------------------------------------------
* 函數(shù)名:POWER_INITIAL
* 功能:系統(tǒng)上電初始化(時(shí)鐘、IO口、中斷)
--------------------------------------------------*/
void POWER_INITIAL(void)
{
// 1. 系統(tǒng)時(shí)鐘配置:內(nèi)部8MHz(IRCF=110)
OSCCON = 0x60; // IRCF[6:4]=110 → HIRC=8MHz
while (!(OSCCON & 0x04)); // 等待HIRC穩(wěn)定(HTS=1)
// 2. IO口配置:PA4為輸出,初始高電平(LED滅)
TRISA &= ~(1 << 4); // PA4方向:輸出(TRISA[4]=0)
PSRCA &= ~(0x03); // PA4源電流:3mA(PSRCA[1:0]=00)
PSINKA &= ~(0x01); // PA4灌電流:最小(PSINKA[0]=0)
LED_PIN = 1; // 初始狀態(tài):PA4高電平(LED滅)
// 3. 中斷初始化:禁止所有中斷(后續(xù)手動開啟所需中斷)
INTCON = 0x00;
WPUA = 0x00; // 關(guān)閉PA口上拉(LED為輸出,無需上拉)
}
/*-------------------------------------------------
* 函數(shù)名:main
* 功能:主函數(shù)(初始化+死循環(huán))
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); // 系統(tǒng)初始化(時(shí)鐘、IO口)
TIMER0_INITIAL(); // Timer0初始化(16ms溢出)
// 開啟中斷:全局中斷(GIE)+ Timer0中斷(T0IE)
GIE = 1;
T0IE = 1;
// 死循環(huán):等待中斷觸發(fā)(無需額外操作)
while (1)
{
NOP();
}
}
大伙看看代碼有沒有問題,寫得規(guī)范嗎? |
|