c - 在 C 语言中使用 LEDS 进行二进制仿真

标签 c loops raspberry-pi binary led

目标是取任何 int 负数或正数并得到它的二进制。然后,如果该二进制数为 4 位或更少,则将其显示在树莓派上的 LED 上。不管用printf显示什么二进制文件。它需要可扩展,因此如果您想添加更多 LED,只需将引脚号添加到数据结构中就应该很容易,而无需修改程序。这需要是一个循环,因此在打印二进制文件后,它会要求再次找到它,我用于 LED 的接线 pi 编号是 0,2,3,5

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>


int main()
{

int displayNumber;

wiringPiSetup();

pinMode(0, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);


digitalWrite(0, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);

printf("Please select a number to display!\n");

scanf("%i", &displayNumber);


switch (displayNumber) {

case 0:
printf("0");
digitalWrite(0, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
break;

case 1:
printf("1");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
break;

case 2:
printf("10");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
break;

case 3:
printf("11");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
break;

case 4:
printf("100");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);

break;

case 5:
printf("101");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(5, LOW);

break;

case 6:
printf("110");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(5, LOW);

break;
case 7:
printf("111");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, LOW);

break;
case 8:
printf("1000");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);

break;
case 9:
printf("1001");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, HIGH);

break;
case 10:
printf("1010");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(5, LOW);

break;
case 11:
printf("1011");
digitalWrite(0, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);

break;
case 12:
printf("1100");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(5, LOW);

break;
case 13:
printf("1101");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(5, HIGH);

break;
case 14:
printf("1110");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, LOW);

break;
case 15:
printf("1111");
digitalWrite(0, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
break;


}



return 0;

}

最佳答案

您可以使用如下所示的函数来写入引脚。请注意,我使用了 unsigned int 作为参数。这是为了避免按位运算中未定义的行为。

#define NO_PINS 4
#define MAXNO 16
int pinnos[NO_PINS] = {0,2,3,5}

void writetopin (unsigned int num)
{ 
  if (num >MAXNO) {
     // handle this condition
  }
  else {
     unsigned int mask = 0x01;
     for (i=0; i<NO_PINS; i++) {
        unsigned int curr = num & mask;
        if (curr == 0) {
          digitalWrite(pinnos[i], LOW);
        }
        else {
          digitalWrite(pinnos[i], HIGH);
        }
        mask = mask << 1; 
     }
  }
}

该函数仅处理正整数。要处理负数,您需要定义符号位以及用于显示的位数。

关于c - 在 C 语言中使用 LEDS 进行二进制仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58946880/

相关文章:

c++ - opencv2/photo/photo.hpp c++​​ 的条件包含取决于 OpenCV 版本

c - 将二维数组作为单个指针传递给函数

c - fopen() 返回 "No such file or directory"

c - 用C实现 "strings"的堆栈

猜硬币的C#程序

vba - Word VBA Selection.TypeText 和 Selection.InsertParagraph 以错误的顺序插入文本

database - 将数据库添加到树莓派 kubernetes 集群

c - "for"的多个语句循环无 block

list - 从列表中循环 flextable 不会在 Word 中创建表格

python - 我无法从 Express 应用程序执行 python 脚本