代码如下,用自定义的 delay_ms() 函数时 OCR0A/OCR0B 脚位(PD6/PD5)的LED一直亮,不会变化,但用for循环代替 delay_ms函数则正常,两个LED都会渐亮、渐暗的变化,求解;
//ICC-AVR application builder : 2015/9/24 22:04:07
// Target : M328p
// Crystal: 16.000Mhz
// Serial send and receive function
#include <iom328pv.h>
#include <avrdef.h>
//#include <macros.h>
void delay_ms(int n);
void timer0_init(void);
void main(void)
{
int i;
int j,k;
DDRD=0XFF; //PORTD输出模式
PORTD=0X00;
DDRB=0XFF; //PORTD输出模式
PORTB=0X0F;
CLI();
timer0_init();
SEI();
while(1)
{
for(i=0;i<255;i++)
{
OCR0A=i;
OCR0B=i;
for(j=0;j<5;j++)
{
for(k=0;k<10000;k++);
}
//delay_ms(5);
}
for(i=254;i>0;i--)
{
OCR0A=i;
OCR0B=i;
for(j=0;j<5;j++)
{
for(k=0;k<10000;k++);
}
//delay_ms(5);
}
}
}
void delay_ms(int n)
{
int k,j;
for(j=0;j<n;j++)
{
for(k=0;k<10000;k++);
}
}
void timer0_init(void)
{
TCNT0=0X00; //定时器初始值
TCCR0A|=(1<<COM0A0)|(1<<COM0A1)|(1<<COM0B0)|(1<<COM0B1)|(1<<WGM00); //WGM00置位1,Phase correct PWM模式,COM0A1/B1 COM0A0/B0置位1
TCCR0B|=(1<<CS00); //无时钟分频
OCR0A=1;
OCR0B=0;
//TIMSK0=0x01; //定时器计数器0比较匹配开启,溢出开启
}
|