打印

流水灯问题

[复制链接]
1088|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dfsa|  楼主 | 2014-2-25 19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
型号是PIC18F452,用proteus仿真的。流水灯延时是用T0实现的。代码:
#include<p18f452.h>

unsigned int num=0;

void init();
void high_isr();
void low_isr();

#pragma code high_vector_section=0x08
void high_vector()
{
_asm goto high_isr _endasm
}

#pragma code low_vector_section=0x18
void low_vector()
{
_asm goto low_isr _endasm
}
#pragma code

#pragma interrupt high_isr
void high_isr()
{
num++;
TMR0L=56;
        if(num==50000)
{
num=0;
LATD=LATD<<1;
}
}

#pragma interruptlow low_isr
void low_isr()
{
}



int main(void)
{       
init();
while(1)
{

}
}

void init()
{     
INTCONbits.GIE=0;

RCONbits.IPEN=1;     //使能中断优先级


T0CON=0x42;         //TMR0设置:停止运行、8位定时,预分频1:8
TMR0L=56;         //  0.4ms  晶振频率16MHZ
INTCONbits.TMR0IF=0;
INTCONbits.TMR0IE=1;
INTCON2bits.TMR0IP=1;
T0CONbits.TMR0ON=1;     //启动TMR0

INTCONbits.GIE=1;      //开全局中断


TRISD=0x00;            //亮第一盏灯
PORTD=0x01;
}

疑问:
if(num==50000)
{
num=0;
LATD=LATD<<1;
}
   这里,1. 如果写num==50000的话,总共有8个灯,亮到第5个灯的时候就会重新从第1个灯亮起来
            如果写num==25000的话,能8个灯轮流亮,但是不稳定,有时候会跳过1个灯亮

         2. 要是在if语句结束后加上INTCONbits.TMR0IF=0,那就灯只永远亮着第1个灯

         3.要是在if语句结束后加上 if(LATD==0)
                          {
                    LATD=0x01;
                          }       
           流水灯还是会不稳定的流水1轮半就重新开始。

          4.写LAT和PORT到底有什么区别啊?为什么推荐写LAT?

   请问下这些问题都是为什么啊?  INTCONbits.TMR0IF=0,标志位清0不是一定要加的吗?

相关帖子

沙发
火箭球迷| | 2014-2-25 19:20 | 只看该作者
强大的STC咋就不用呢

使用特权

评论回复
板凳
baidudz| | 2014-2-25 19:24 | 只看该作者
既然只有8个灯,num 计数到50000有什么特别意义吗?
建议试一下:
if(num == 8) num = 0;
LATD = 1<<num;

使用特权

评论回复
地板
从小木丁丁| | 2014-2-26 15:24 | 只看该作者
咋不用stc

使用特权

评论回复
5
骗子的片子| | 2014-2-26 16:08 | 只看该作者
流水灯跟hello

使用特权

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

本版积分规则

282

主题

2404

帖子

2

粉丝