打印

初学者遇到DSPIC30F定时器编程问题,向高手请教!

[复制链接]
6100|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
arkprb|  楼主 | 2010-5-31 09:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我现在正在学DSPIC30F系列的单片机,要编一个小程序,就是让一个LED0以1hz频率闪烁,相应的按键SW1按下,LED就一直亮,再按一下SW1,LED0就和之前一样闪烁。

以下是我参照书本编写的C程序:但感觉不对,虽没有语法错误,但在开发板上未能到达其目的。请高手指点一二,最好能详细写出一个效率比较高的程序,感激不尽!
#include <p30f6014a.h> //dsPIC30F6014a标准头文件
/*配置位*/
_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

int main(void)
{
/*设置LED控制寄存器和定时器*/
//初始化LED端口和按键开关端口
LATD = 0xFFFF; //关闭所有LED
TRISD = 0xFFF0; //设定LED引脚为输出
TRISA = 0xFFFF; //设定按键开关引脚为输入
//初始化定时器1为1/2秒
T1CON = 0; //关闭定时器1
TMR1 = 0; //启动定时器1的计数寄存器为0
PR1 = (Fcy/256)/2; //设定1/2秒延时时间
T1CON = 0x8030; //配置定时器1,定时器开, 在空闲模式定时器继续工作,门控时间累加禁止, 预分频比是1:256, 内部时钟

while (1)
{
/*按1Hz的频率闪亮LED*/
if(IFS0bits.T1IF == 1) //检测定时器1的中断标志是否设定
{
IFS0bits.T1IF = 0; //清除定时器1中断标志
LATDbits.LATD0 = !LATDbits.LATD0; // LED1闪亮

}
if(PORTAbits.RA12==0) //检测SW1是否按下
{
T1CON = 0;//关闭定时器1
LATDbits.LATD0=0;//LED1亮
}
if(PORTAbits.RA12==0)//检测SW1是否再次按下
{
TMR1 = 0; //启动定时器1的计数寄存器为0
PR1 = (Fcy/256)/2; //设定1/2秒延时时间
T1CON = 0x8030; ////配置定时器1 ,定时器开, 在空闲模式定时器继续工作,门控时间累加禁止, 预分频比是1:256, 内部时钟
LATDbits.LATD0=0;//LED1亮
}
}

}
沙发
tom3000| | 2010-5-31 10:01 | 只看该作者
路过看看 啊

使用特权

评论回复
板凳
odqqdo| | 2010-5-31 20:53 | 只看该作者
IEC0bits.T1IE = 1; /* 开T1中断 */

应该是没开中断

使用特权

评论回复
地板
zhang362362| | 2017-7-28 09:42 | 只看该作者
本帖最后由 zhang362362 于 2017-7-28 09:44 编辑

我也是看看

使用特权

评论回复
5
柒月的风| | 2017-9-22 17:47 | 只看该作者
开总中断 和定时器中断,最好把中断等级设置到7.

使用特权

评论回复
6
gaobao_1| | 2018-6-21 07:58 | 只看该作者
柒月的风 发表于 2017-9-22 17:47
开总中断 和定时器中断,最好把中断等级设置到7.

中断等级7是最高还是低?

使用特权

评论回复
评论
柒月的风 2019-3-19 11:02 回复TA
最高优先级是7 
7
晓之佩恩33| | 2018-8-27 20:54 | 只看该作者
本帖最后由 晓之佩恩33 于 2018-8-27 21:38 编辑

LATDbits.LATD0 = !LATDbits.LATD0; // LED1闪亮\
是这样的吧LATDbits.LATD0 = ~LATDbits.LATD0; // LED1闪亮\   注意取反符号
写错了!不好意思,是 才是取反。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝