本示例演示如何使用Arduion UNO开发板驱动4位共阳极数码管,可自定义码值表定义数码管可显示的字符。示例中,可显示小数数字及一些字母。
共阳:低电平点亮
共阴:高电平点亮






//4位共阳数码管示例
#define SEG_A 12 //A引脚
#define SEG_B 8 //B引脚
#define SEG_C 4 //C引脚
#define SEG_D 6 //D引脚
#define SEG_E 7 //E引脚
#define SEG_F 11 //F引脚
#define SEG_G 3 //G引脚
#define SEG_H 5 //小数点引脚
#define LED1 13 //第一个二极管引脚
#define LED2 10 //第二个二极管引脚
#define LED3 9 //第三个二极管引脚
#define LED4 2 //第四个二极管引脚
//LED显示字符的字典表
unsigned char table[31][8] = {
{0,0,0,0,0,0,1,1}, //0
{1,1,1,1,0,0,1,1}, //1
{0,0,1,0,0,1,0,1}, //2
{0,0,0,0,1,1,0,1}, //3
{1,0,0,1,1,0,0,1}, //4
{0,1,0,0,1,0,0,1}, //5
{0,1,0,0,0,0,0,1}, //6
{0,0,0,1,1,1,1,1}, //7
{0,0,0,0,0,0,0,1}, //8
{0,0,0,0,1,0,0,1}, //9
{0,0,0,0,0,0,1,0}, //0.
{1,1,1,1,0,0,1,0}, //1.
{0,0,1,0,0,1,0,0}, //2.
{0,0,0,0,1,1,0,0}, //3.
{1,0,0,1,1,0,0,0}, //4.
{0,1,0,0,1,0,0,0}, //5.
{0,1,0,0,0,0,0,0}, //6.
{0,0,0,1,1,1,1,0}, //7.
{0,0,0,0,0,0,0,0}, //8.
{0,0,0,0,1,0,0,0}, //9.
{0,1,1,0,0,0,1,1}, //C
{0,1,1,0,0,0,0,1}, //E
{0,1,1,1,0,0,0,1}, //F
{1,0,0,1,0,0,0,1}, //H
{1,0,0,1,1,1,1,1}, //I
{1,0,0,0,1,1,1,1}, //J
{1,1,1,0,0,0,1,1}, //L
{0,0,1,1,0,0,0,1}, //P
{0,0,0,1,1,0,0,1}, //Q
{0,0,0,1,0,0,0,1}, //R
{1,0,0,0,0,0,1,1} //U
};
//LED数码管
unsigned int ledTable[4] = {LED1,LED2,LED3,LED4};
void setup() {
pinMode(SEG_A, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(SEG_H, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
//不知道为什么,打开串口,可以正常显示类似FULL四个字母。注释掉最多显示三个字母。
//有懂的朋友可以在留言中评论
Serial.begin(9600);
}
void loop() {
//char str[] = {'8'};
//char str[] = {'1','.','3','4','5'};
//char str[] = {'7','5','3','0','.'};
//char str[] = {'3','8','.','0'};
char str[] = {'2','6','9','.','8'};
//char str[] = {'E'};
//char str[] = {'E','R','R'};
//char str[] = {'E','R','R','E'};
//char str[] = {'E','E','R','0'};//ERRO
//char str[] = {'L','E','0'};//LED
//char str[] = {'F','U','L','L'};//FULL
displayStr(str);
}
//显示某个字符
void displayChar(int led, int tblIdx){
//去除余晖
digitalWrite(SEG_A,HIGH);
digitalWrite(SEG_B,HIGH);
digitalWrite(SEG_C,HIGH);
digitalWrite(SEG_D,HIGH);
digitalWrite(SEG_E,HIGH);
digitalWrite(SEG_F,HIGH);
digitalWrite(SEG_G,HIGH);
digitalWrite(SEG_H,HIGH);
//当前显示LED高电平
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
digitalWrite(LED4,LOW);
digitalWrite(led,HIGH);
//查询码值表
digitalWrite(SEG_A,table[tblIdx][0]);
digitalWrite(SEG_B,table[tblIdx][1]);
digitalWrite(SEG_C,table[tblIdx][2]);
digitalWrite(SEG_D,table[tblIdx][3]);
digitalWrite(SEG_E,table[tblIdx][4]);
digitalWrite(SEG_F,table[tblIdx][5]);
digitalWrite(SEG_G,table[tblIdx][6]);
digitalWrite(SEG_H,table[tblIdx][7]);
}
//显示字符串
void displayStr(const char *str){
int len = strlen(str);
if (len > 5)
len = 5;
int ledIdx = 0;
for(int i = 0; i < len; i++){
int tblIdx = 0;
char c = str[i];
//字母编码表
if (c == 'C')
tblIdx = 20;
else if (c == 'E')
tblIdx = 21;
else if (c == 'F')
tblIdx = 22;
else if (c == 'H')
tblIdx = 23;
else if (c == 'I')
tblIdx = 24;
else if (c == 'J')
tblIdx = 25;
else if (c == 'L')
tblIdx = 26;
else if (c == 'P')
tblIdx = 27;
else if (c == 'Q')
tblIdx = 28;
else if (c == 'R')
tblIdx = 29;
else if (c == 'U')
tblIdx = 30;
else{//数字及小数点编码表
tblIdx = str[i] - '0';
if (i < len - 1 && str[i+1]=='.'){
tblIdx += 10;
i++;
}
}
displayChar(ledTable[ledIdx], tblIdx);
ledIdx++;
}
}
操作步骤:
- 将数码管插入面包板,共两边单边6个引脚,从面包板30处插入,方便记忆
- 将杜邦线插入到Arduion,从13-2引脚,从左到右
- 13-8引脚插入面包板数码管的外侧(上边缘),从左到右
- 7-2 引脚插入面包板数码管的内侧(下边缘),从左到右
- 编译并上传程序,即可看到示例
