型号是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不是一定要加的吗?
------解决方案--------------------
unsigned int num=0;
num=50000,超过32167了
关于LAT和PORT,好好看datasheet吧,英文的有点别扭,个人也不是很的很懂,听同事讲的大概意思是LAT写进去什么读就是什么,PORT你写了之后,如果这个口接有上拉或者下拉什么的,你写进去的值会受到影响,
仅供参考。
------解决方案--------------------
既然只有8个灯,num 计数到50000有什么特别意义吗?
建议试一下:
if(num == 8) num = 0;
LATD = 1<<num;