gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:58:34 25 4
gpt4 key购买 nike

我正在为微 Controller 设计点击计数器,我正在使用 C 来开发代码。

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

因为有 8 个 LED,我使用了 2 个不同的端口。(6 位来自 PORTB,2 位来自 PORTD)。为此,我开发了一个使用 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;
}
}

关于单击计数器以使用 C 代码点亮 LED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53128423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com