C语言中的Arduino编码

C语言中的Arduino编码,c,arduino,C,Arduino,我对使用C语言编写Arduino代码非常熟悉。 我有这个电路: 我试图让那些黄色的LED以二进制(100010010101011)显示十进制数字(8,9,10,11)。 我写了这段代码,但是led灯没有正常点亮 #include <avr/io.h> #include <util/delay.h> float m[] = {0b00100000, 0b00100000, 0b00100000, 0b00100000}; float n[] = {0b00000000,

我对使用C语言编写Arduino代码非常熟悉。 我有这个电路:

我试图让那些黄色的LED以二进制(100010010101011)显示十进制数字(8,9,10,11)。 我写了这段代码,但是led灯没有正常点亮

#include <avr/io.h>
#include <util/delay.h>

float m[] = {0b00100000, 0b00100000, 0b00100000, 0b00100000};
float n[] = {0b00000000, 0b00000100, 0b00001000, 0b00001000};
float b[] = {0b00000000, 0b00000000, 0b00000000, 0b00000100};


int main() {

    int size = sizeof(m);

    while(1) {
        for(int i = 0; i < size; i++) {
            DDRB = m[i];
            PORTB = m[i];
            DDRB = n[i];
            PORTB = n[i];
            DDRB = b[i];
            PORTB = b[i];
            _delay_ms(1000);
        }
    }

    return 0;
}
#包括
#包括
浮点m[]={0b00100000,0b00100000,0b00100000,0b00100000};
浮点数n[]={0b00000000,0B000000100,0b00001000,0b00001000};
浮点数b[]={0b00000000,0b00000000,0b00000000,0B000000100};
int main(){
int size=sizeof(m);
而(1){
对于(int i=0;i
不要可变地设置数据方向寄存器。例如,如果您希望所有端口B引脚都是输出,则只向寄存器写入一次,将它们设置为输出:

DDRB = 0xFF;
...
for(int i=0; ...)
  PORTB = whatever;
通常,大多数微控制器可能需要一段时间来设置数据方向,直到端口访问生效,因此,如果您只是在这样的循环中写入DDR+端口,物理管脚可能无法足够快地作出反应,因为MCU本身的运行速度可能比管脚的电气特性能够跟上的速度还要快

此外,在运行时实际使用GPIO引脚作为输入和输出也是很少见的。在绝大多数应用中,管脚将始终是输入或输出,并且从程序启动时起永不改变

此外,在Arduino上使用
float
没有任何意义,尤其是在这种情况下。AVR不是PC,而是一个非常有限的8位MCU,没有FPU。如果使用浮点数,编译器将链接到软件浮点数库中,这将破坏所有所谓的性能

在将值写入8位AVR寄存器时,始终使用
uint8\u t
from
stdint.h

首先,行

    int size = sizeof(m);
这是错误的
sizeof
返回以字节为单位的数据大小,因此必须将其除以一个元素的大小才能得到元素的数量

然后,看看循环体

            DDRB = m[i];
            PORTB = m[i];
            DDRB = n[i];
            PORTB = n[i];
不会产生可见的效果,因为
DDRB
PORTB
的值很快将被行覆盖

            DDRB = b[i];
            PORTB = b[i];
数组不正确时的值。您应该将
DDRB
中的位设置为
1
以使管脚输出信号

在这种情况下,我认为您不需要数组。试试这个:

#include <avr/io.h>
#include <util/delay.h>

int main() {

    DDRB = 0b00111100;

    while(1) {
        for(int i = 8; i < 12; i++) {
            PORTB = i << 2;
            _delay_ms(1000);
        }
    }

    return 0;
}
#包括
#包括
int main(){
DDRB=0b00111100;
而(1){
对于(int i=8;i<12;i++){

非常感谢!关于您的代码的问题:PORTB=i-um…
8感谢您的解释!'float m[]={0b00100000,0b00100000,0b00100000,0b00100000};“float”?你真的想定义一个由四个float组成的数组吗?无符号字符不是更合适吗?@MartinJames它用于设置引脚浮动:)严肃地说,这可能只是一个奇怪的打字错误。@Lundin是一个标记为“Arduino”的东西,那么它就不是打字错误了/