代码如下,用自定义的 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比较匹配开启,溢出开启
- }
|