📄 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 + -