/**
- 通过串口接收 Esp8266或其他 MCU 发过来的 数字,并用数码管显示出来
- 真是案例,已通过验证
- 数码管引脚与其LED对应图(0.28,共阳,1位),参见:
-
https://www.jianshu.com/p/4428ac81933a
*/
char in_num = 0;
byte pins[7] = {4,5,9,12,13,14,16}; // 根据数组下标,从数码管的最上方的led开始,按顺时针方向开始数,然后在中间结束,位0-6(即最上方的led的下标为0,中间的led的下标为6)
void setup()
{
for(byte i=0;i<7;i++) pinMode(pins[i], OUTPUT);
Serial.begin(9600);
while (!Serial);
if(Serial) Serial.println("Serial ok !");
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available() > 0)
{
int sr = Serial.read();
if(sr > 47 && sr < 58) in_num = char(sr);
}
if(in_num > 47 && in_num < 58) setNum(in_num);
}
// 1位数码管数字显示;根据传入的1位数数字,在数码管上显示出对应的数字
void setNum(int num)
{
for(byte i=0;i<7;i++) digitalWrite(pins[i], 1); // 先熄灭全部的led,然后在根据要显示的数字点亮对应的led
switch(num)
{
case '0':
for(byte i=0;i<6;i++) digitalWrite(pins[i], 0);
break;
case '1':
digitalWrite(pins[1], 0);
digitalWrite(pins[2], 0);
break;
case '2':
for(byte i=0;i<7;i++) if(i != 2 && i != 5) digitalWrite(pins[i], 0);
break;
case '3':
for(byte i=0;i<7;i++) if(i != 4 && i != 5) digitalWrite(pins[i], 0);
break;
case '4':
digitalWrite(pins[1], 0);
digitalWrite(pins[2], 0);
digitalWrite(pins[5], 0);
digitalWrite(pins[6], 0);
break;
case '5':
for(byte i=0;i<7;i++) if(i != 1 && i != 4) digitalWrite(pins[i], 0);
break;
case '6':
for(byte i=0;i<7;i++) if(i != 1) digitalWrite(pins[i], 0);
break;
case '7':
digitalWrite(pins[0], 0);
digitalWrite(pins[1], 0);
digitalWrite(pins[2], 0);
break;
case '8':
for(byte i=0;i<7;i++) digitalWrite(pins[i], 0);
break;
case '9':
for(byte i=0;i<7;i++) if(i != 4) digitalWrite(pins[i], 0);
break;
}
}
网友评论