dun*_*008 5 c atmelstudio arduino-uno
我正在为微控制器设计一个点击计数器,并使用C来开发代码。
这里发生的是,当我单击第一个按钮时,它将计算按钮按下的次数。然后,我必须按第二个按钮以二进制方式点亮LED来显示计数。例如,如果我按第一个按钮10次,它将点亮第二个LED和第四个LED。
因为有8个LED,所以我使用2个不同的端口。(PORTB有6位,PORTD有2位)。为此,我使用if / else开发了一个代码。但是我想在没有多个if / else操作的情况下实现此操作,因为这种方法似乎效率不高。
while(PIND & 0b00100000){ //while PD5 switch is not pressed
if(clickCount>=128){ //if click count>=128
PORTB = PORTB | 0b00100000; //set PB5 HIGH
clickCount-=128; //deduct 128 from clickCount
}else if(clickCount>=64){
PORTB = PORTB | 0b00010000;
clickCount-=64;
}else if(clickCount>=32){
PORTB = PORTB | 0b00001000;
clickCount-=32;
}else if(clickCount>=16){
PORTB = PORTB | 0b00000100;
clickCount-=16;
}else if(clickCount>=8){
PORTB = PORTB | 0b00000010;
clickCount-=8;
}else if(clickCount>=4){
PORTB = PORTB | 0b00000001;
clickCount-=4;
}else if(clickCount>=2){
PORTD = PORTD | 0b10000000;
clickCount-=2;
}else if(clickCount==1){
PORTD = PORTD | 0b01000000;
clickCount = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我想用更少的字节数来编写此代码。那么,有什么方法可以使用for循环或任何其他方法来开发此代码段?
这可以通过分别为 PORTB 和 PORTD 分配值来完成,因为您将点击次数存储在变量 clickCounter 中。
PORTB = PORTB | (clickCount & 0b00111111);
PORTD = PORTD | (clickCount & 0b11000000);
Run Code Online (Sandbox Code Playgroud)