Arduino 用4位共阴数码管造一个计数器

  • 时间:
  • 来源:互联网

 

之前已经学习过单位的数码管,现在来看看4位的数码管是如何工作的。

相对于单位的数码管,

可以看到针脚多了com1,com2,com3,com4,

但控制字符的abcdefgh针脚,仍然是只有8个,

那到底如何实现同时显示不同数字得呢?

 

就是接通不同com口(给高电平),点亮对应的LED组,实现单个字符控制,再通过短时间的刷新,例如3微秒,

 

如此快闪,人类的肉眼已经看不出是一个一个轮着点亮的。

 


实验效果

 

 

针脚说明

abcdefgh 为数码管LED针脚

1-4            为数码管组

 

 

 

BOM表

Arduino Uno        *1

4位共阴数码管     *1

面包板                   *1

电阻 1K Ω              *4

跳线若干

 

 

接线图

 


程序开源源码

 

程序实现按秒增加,只是简单的演示

感兴趣的童鞋可以加个按钮,按一下就开始计算。。。

又或者用那种时钟的数码管(中间有冒号的)改成一个时钟

 

任意门:Arduino 用两个按键分别控制两个LED灯点亮

 

打开你的脑洞吧.....
 

程序打包下载: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]);
}

 

 

 

 

本文链接http://element-ui.cn/news/show-576557.aspx