单击计数器以使用C代码点亮LED



我正在为微控制器设计一个点击计数器,并使用C来开发代码。

这里发生的是,当我点击第一个按钮时,它会计算按下按钮的次数。然后我必须按下第二个按钮,以二进制方式显示计数,点亮LED。例如,如果我按下第一个按钮10次,它将点亮第二个LED和第四个LED。

由于有8个指示灯,我使用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;
}           
}

我想用更少的字节数来制作这个代码。那么,有没有任何方法可以使用for循环或任何其他方法来开发这个代码段呢?

我不知道这是否会减少二进制大小,而且没有经过测试。你仍然可以这样做:

unsigned char mask[] = {
0b01000000, 0b10000000, 0b00000001, 0b00000010,
0b00000100, 0b00001000, 0b00010000, 0b00100000};
while(PIND & 0b00100000) {
for (int i = 7, v = 128; i > -1; --i, v /= 2) {
if (clickCount >= v && clickCount > 0) {
if (clickCount >= 4) {
PORTB = PORTB | mask[i];
} else {
PORTD = PORTD | mask[i];
}
clickCount -= v;
break;
}
}
}

或者你可以使用一个循环:

int v = 128, i = 7;
while (v > 0 && (PIND & 0b00100000)) {
if (clickCount >= v) {
if (clickCount >= 4) {
PORTB = PORTB | mask[i];
} else {
PORTD = PORTD | mask[i];
}
clickCount -= v;
} else {
--i;
v /= 2;
}
}

这可以通过将值分别分配给PORTB和PORTD来完成,因为点击次数存储在变量clickCounter中。

PORTB = PORTB | (clickCount & 0b00111111);
PORTD = PORTD | (clickCount & 0b11000000);

为了处理输出,我会做如下操作:

clickCount %= 256; /* because the output is 8-bit */
PORTB = clickCount;

要使输出正好有1条指令长:

unsigned char clickCount = 0;
... /* do things, handle increment, handle 2nd button */
PORTB = clickCount; /* modulo 256 no longer needed, ClickCount cannot be more than 8 bits anyway */

我看不出有什么理由一点一点地做。

最新更新