//AI写的定时器0应用:PA4接一个LED(低电平亮,高电平灭),1秒亮1秒灭,这样循环。看看代码有没有问
题
#include "SYSCFG.h"
#include "FT60F21X.h"
// 宏定义:LED引脚(PA4)及中断计数变量
#define LED_PIN PA4
unsigned char timer0_cnt = 0; // Timer0溢出计数(16ms/次)
bit led_flag = 0; // LED状态标志(0:灭,1:亮)
/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能:中断处理(Timer0溢出中断)
* 说明:每16ms进入一次中断,计数62次后翻转LED状态
--------------------------------------------------*/
void interrupt ISR(void)
{
if (INTCON & 0x04) // 检查Timer0溢出标志(T0IF=1)
{
timer0_cnt++; // 溢出次数累加
if (timer0_cnt >= 62) // 62次×16ms≈1秒
{
timer0_cnt = 0; // 计数清零
led_flag = ~led_flag; // 翻转LED状态标志
LED_PIN = led_flag; // 更新PA4电平(低电平亮)
}
INTCON &= ~(1 << 2); // 清除T0IF中断标志
TMR0 = 0; // 重置Timer0计数初值
}
}
/*----------------------------------------------------
* 函数名:TIMER0_INITIAL
* 功能:Timer0初始化
* 定时计算:(1/8MHz)×4(指令周期)×128(预分频)×255≈16ms
----------------------------------------------------*/
void TIMER0_INITIAL(void)
{
T0ON = 0; // 关闭Timer0(配置期间)
TMR0 = 0; // 计数初值清零
T0CON0 = 0x00; // 时钟源选择指令周期,禁止Timer0(后续手动使能)
OPTION = 0x06; // 配置预分频:1:128(PS2-PS0=110),分频器分配给Timer0(PSA=0)
T0ON = 1; // 使能Timer0
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能:系统上电初始化(时钟、IO口、中断)
--------------------------------------------------*/
void POWER_INITIAL(void)
{
// 1. 系统时钟配置:内部8MHz(IRCF=110)
OSCCON = 0x60; // IRCF[6:4]=110 → HIRC=8MHz
while (!(OSCCON & 0x04)); // 等待HIRC稳定(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; // 初始状态:PA4高电平(LED灭)
// 3. 中断初始化:禁止所有中断(后续手动开启所需中断)
INTCON = 0x00;
WPUA = 0x00; // 关闭PA口上拉(LED为输出,无需上拉)
}
/*-------------------------------------------------
* 函数名:main
* 功能:主函数(初始化+死循环)
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); // 系统初始化(时钟、IO口)
TIMER0_INITIAL(); // Timer0初始化(16ms溢出)
// 开启中断:全局中断(GIE)+ Timer0中断(T0IE)
GIE = 1;
T0IE = 1;
// 死循环:等待中断触发(无需额外操作)
while (1)
{
NOP();
}
}
大伙看看代码有没有问题,写得规范吗? |