| 
 
| 我现在正在学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亮
 }
 }
 
 }
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |