Superwinter2 发表于 2014-9-5 16:24

【【【AVR单片机代码问题】】】请教各位大神!!!

小弟写一个程序,主要实现LED灯的亮,弱,暴闪等状态的切换,用的是ATtiny13.
现在遇到两个问题,望坛子里的各位大神指点迷津:
问题1:状态4的目标是想让PB0到PB3轮流输出暴闪信号,结果程序编译没问题,下到单片机上不工作。(再次尝试,如果状态4的子状态中只有一个管脚输出暴闪信号,其余子状态的输出暴闪信号代码注释掉,则单片机可以工作。)
问题2:状态2是想调节LED等亮度,但是调节状态2的“if((tick_counter/10)%2) ”语句,LED等要么没怎么变暗,要么就是会闪烁,没办法调到希望的比较弱的亮度。
多谢!{:5_643:}
代码如下:
#include <avr/io.h>

#define ucharunsigned char
#define uintunsigned int

#define Key_PIN         PINB

#define PB0_set()        PORTB |= (1 << PB0)//设置为高电平
#define PB1_set()        PORTB |= (1 << PB1)
#define PB2_set()        PORTB |= (1 << PB2)
#define PB3_set()        PORTB |= (1 << PB3)

#define PB0_clr()        PORTB &= ~(1 << PB0)//设置为低电平
#define PB1_clr()        PORTB &= ~(1 << PB1)
#define PB2_clr()        PORTB &= ~(1 << PB2)
#define PB3_clr()        PORTB &= ~(1 << PB3)

uchar state_flag = 1;//状态标识位

/*        微秒级延时程序       */
void delay_us(uint time){          
          while (time --);
       }          
/*                            毫秒级延时程序                        */       

void delay_ms(uint time){
          while(time!=0){               
                   delay_us(150);
                   time--;
                  }
       }

uchar key_scan(){
        if(!(Key_PIN&0x10)){//按键按下
                delay_ms(5);//消抖
                if(!(Key_PIN&0x10)){
                        while(!(Key_PIN&0x10));//松手后按键响应
                        return 1;
                }
        }
return 0;
}

void IO_Init(){//管脚配置初始化
        PORTB = 0x10;//PB4-上拉电阻
        DDRB = 0b00001111; //设置输入输出方向,PB0,1,2,3为输出,PB4为输入
}       

int main(void)
{       
        uint tick_counter = 0;//循环计数1ms一次,最大3999,4秒钟时间
        state_flag = 1;//默认状态1
        IO_Init();
        while(1){
/*****按键扫描&四种状态标识位切换*****/       
                if(key_scan()){//有按键按下
                        state_flag ++;
                        if(state_flag > 4)
                                state_flag = 1;
                }       
/****************四种状态切换**********************/
                switch(state_flag){                     //四种状态
                        case 1://状态1
                                PB0_set();
                                PB2_clr();
                                PB3_clr();
                                PB1_clr();   //HDD
                                break;
                        case 2://状态2
                                if((tick_counter/10)%2){   //输出周期方波,控制LED亮度    问题2
                                        PB0_clr();
                                }else{
                                        PB0_set();
                                }
                                PB2_clr();
                                PB3_clr();
                PB1_clr();   //HDD
                                break;       
                        case 3://状态3
                                if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                        PB0_clr();
                                }else{
                                        PB0_set();
                                }
                                PB1_clr();
                                PB2_clr();
                                PB3_clr();   //HDD
                                break;
                        case 4://状态4               问题1
                                switch(tick_counter/1000){                                          
                                        case 0:
                                     if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                        PB0_clr();
                                        }else{
                                        PB0_set();                                        
                                        }
                                        
                                                PB1_clr();
                                                PB2_clr();
                                                PB3_clr();
                                                break;
                                        case 1:
                                  if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                          PB1_clr();
                                        }else{
                                     PB1_set();
                                        }
                                        
                                  PB0_clr();
                                                PB2_clr();
                                                PB3_clr();
                                                break;
                                        case 2:
                                  if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                          PB2_clr();
                                        }else{
                                          PB2_set();
                                        }
                                        
                                                PB0_clr();
                                                PB1_clr();
                                                PB3_clr();
                                                break;
                                        case 3:
                                  if((tick_counter/100)%2){//输出周期方波,控制闪动,每100ms切换一次
                                          PB3_clr();
                                        }else{
                                          PB3_set();
                                        }
                                        
                                                PB0_clr();
                                                PB1_clr();
                                                PB2_clr();
                                                break;
                                        default:
                                                break;
                                }
                                break;
                        default:
                                break;                       
                }                                                                     
/****************计数周期**********************/
                tick_counter ++;
                if(tick_counter >= 4000)
                        tick_counter = 0;
                delay_us(30);//调节延时参数为1周期1ms      问题2
        }
}


Superwinter2 发表于 2014-9-8 00:58

自己顶起!
页: [1]
查看完整版本: 【【【AVR单片机代码问题】】】请教各位大神!!!