之前已经学习过单位的数码管,现在来看看4位的数码管是如何工作的。
相对于单位的数码管,
可以看到针脚多了com1,com2,com3,com4,
但控制字符的abcdefgh针脚,仍然是只有8个,
那到底如何实现同时显示不同数字得呢?
就是接通不同com口(给高电平),点亮对应的LED组,实现单个字符控制,再通过短时间的刷新,例如3微秒,
如此快闪,人类的肉眼已经看不出是一个一个轮着点亮的。
实验效果
针脚说明
abcdefgh 为数码管LED针脚
1-4 为数码管组
BOM表
Arduino Uno *1
4位共阴数码管 *1
面包板 *1
电阻 1K Ω *4
跳线若干
接线图
程序开源源码
程序实现按秒增加,只是简单的演示
感兴趣的童鞋可以加个按钮,按一下就开始计算。。。
又或者用那种时钟的数码管(中间有冒号的)改成一个时钟
打开你的脑洞吧.....
程序打包下载:https://u16460183.ctfile.com/fs/16460183-295924392
#define d_a 2 //定义数码管a 接引脚 2
#define d_b 3
#define d_c 4
#define d_d 5
#define d_e 6
#define d_f 7
#define d_g 8
#define d_h 9
#define COM1 10 //定义 第一组数码管 com1 接引脚2
#define COM2 11
#define COM3 12
#define COM4 13
//数码管0-F码值
unsigned char num[17][8] =
{
//a b c d e f g h
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 0, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0}, //9
{1, 1, 1, 0, 1, 1, 1, 1}, //A
{1, 1, 1, 1, 1, 1, 1, 1}, //B
{1, 0, 0, 1, 1, 1, 0, 1}, //C
{1, 1, 1, 1, 1, 1, 0, 1}, //D
{1, 0, 0, 1, 1, 1, 1, 1}, //E
{1, 0, 0, 0, 1, 1, 1, 1}, //F
{0, 0, 0, 0, 0, 0, 0, 1}, //.
};
void setup()
{
pinMode(d_a,OUTPUT); //设置为输出引脚
pinMode(d_b,OUTPUT);
pinMode(d_c,OUTPUT);
pinMode(d_d,OUTPUT);
pinMode(d_e,OUTPUT);
pinMode(d_f,OUTPUT);
pinMode(d_g,OUTPUT);
pinMode(d_h,OUTPUT);
pinMode(COM1,OUTPUT);
pinMode(COM2,OUTPUT);
pinMode(COM3,OUTPUT);
pinMode(COM4,OUTPUT);
}
void loop()
{
//累加循环当去到9999自动从0开机计数
for(int l = 0;l < 10;l++ )
{
for(int k = 0; k < 10;k++)
{
for(int j = 0; j < 10; j++)
{
for(int i = 0;i < 10;i++)
{
//一秒钟快闪125次,就等于一秒,
//1000/8=125
for(int q = 0;q<125;q++)
{
Display(1,l);//第一位数码管显示l的值
delay(2);
Display(2,k);
delay(2);
Display(3,j);
delay(2);
Display(4,i);
delay(2);
}
}
}
}
}
}
void Display(unsigned char com,unsigned char n) //显示函数,com可选数值范围1-4,num可选数值范围0-9
{
digitalWrite(d_a,LOW); //去除余晖
digitalWrite(d_b,LOW);
digitalWrite(d_c,LOW);
digitalWrite(d_d,LOW);
digitalWrite(d_e,LOW);
digitalWrite(d_f,LOW);
digitalWrite(d_g,LOW);
digitalWrite(d_h,LOW);
switch(com) //选通位选
{
case 1:
digitalWrite(COM1,LOW); //选择位1
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 2:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,LOW); //选择位2
digitalWrite(COM3,HIGH);
digitalWrite(COM4,HIGH);
break;
case 3:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,LOW); //选择位3
digitalWrite(COM4,HIGH);
break;
case 4:
digitalWrite(COM1,HIGH);
digitalWrite(COM2,HIGH);
digitalWrite(COM3,HIGH);
digitalWrite(COM4,LOW); //选择位4
break;
default:break;
}
digitalWrite(d_a,num[n][0]); //a查询码值表
digitalWrite(d_b,num[n][1]);
digitalWrite(d_c,num[n][2]);
digitalWrite(d_d,num[n][3]);
digitalWrite(d_e,num[n][4]);
digitalWrite(d_f,num[n][5]);
digitalWrite(d_g,num[n][6]);
digitalWrite(d_h,num[n][7]);
}