TA的每日心情 | 难过 2014-12-21 17:30 |
---|
签到天数: 5 天 [LV.2]偶尔看看I
|
小弟写一个程序,主要实现LED灯的亮,弱,暴闪等状态的切换,用的是ATtiny13.
现在遇到两个问题,望坛子里的各位大神指点迷津:
问题1:状态4的目标是想让PB0到PB3轮流输出暴闪信号,结果程序编译没问题,下到单片机上不工作。(再次尝试,如果状态4的子状态中只有一个管脚输出暴闪信号,其余子状态的输出暴闪信号代码注释掉,则单片机可以工作。)
问题2:状态2是想调节LED等亮度,但是调节状态2的“if((tick_counter/10)%2) ”语句,LED等要么没怎么变暗,要么就是会闪烁,没办法调到希望的比较弱的亮度。
多谢!
代码如下:
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned 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
}
}
|
|