Arduino学习笔记01:四位数码管的使用以及相关类库的编写

本小白遇到的问题:

Q1:四位数码管怎么接线

拆开包装的一瞬间本小白惊呆了:MD居然有十二个引脚!!老子的OLED屏幕才4个引脚!!
经过一番简单的搜索。本小白找到了这个:在这里插入图片描述
怎么说呢,不明觉厉吧,不过这种高深莫测的图显然不是我这种层次的人能够揣测的,于是我继续搜索,找到了这个:
在这里插入图片描述

如图所示(图片来自百度经验):
从这张图上,可以简单看出四位数码管的工作原理,四位数码管一共8*4个发光二极管,包括四个数管,每个数管为a,b,c,d,e,f,g,h八段(第八段为数管左下角的小数点,图中未画出)。共12个引脚,其中4个引脚控制标号1234的四个数管是否发光,8个引脚控制abcdefgh八段LED灯是否发光。
那么,怎么用ARDUINO来控制呢?
事实上,数码管分为共阳数码管和共阴数码管。顾名思义,共阳即共阳极,共阴即共阴极。对于共阳数码管,因为阳极共用,因此各引脚实际上与阴极相连,因此需给予低电平方能触发,共阴极引脚则相反。本小白采用的是共阳数码管,因此后续均以共阳数码管为基础讨论。
数码管的控制与LED灯的控制类似,比如给予引脚1和引脚a低电平,其余引脚高电平,则1a处的数码管被点亮。
接线也和LED灯类似,引脚1234直接与UNO的IO接口相连即可,控制LED的引脚abcdefgh则需串联一220Ω的电阻。接线时,本小白采用的方案是:引脚a-h分别对应UNO的1-8,引脚1-4分别对于UNO的12-9(注意此处顺序!)
最终接线图:
在这里插入图片描述
(只需要知道接线异常麻烦即可,下边是有源蜂鸣器,另有他用,可以忽略)

接好线以后,就可以开始愉快的玩耍了!

Q2:怎么控制四个数管显示不同的内容

玩耍过程中发现一个严肃的问题,按照数码管的工作原理,四个数管显示的内容始终相同啊。如果我想让数码管显示“5678”,应该怎么办呢?
实验表明,如果我让数管1快速显示“5”然后关闭,数管2快速显示“6”然后关闭……
只要速度够快,人眼看到的就是“5678”!
示例程序如图所示(相关函数省略,简介及功能在注释里面):

	clearLEDs();							//此处为将八个LED的引脚设为高电平,用于防止重影
	pickDigit(1);								//此处为将引脚1设为低电平,其余3引脚为高电平
	pickNumber(5);						//此处为控制八个LED使数码管输出为“5”
	delay(2);

	clearLEDs();
	pickDigit(2);
	pickNumber(6);
	delay(2);

	clearLEDs();
	pickDigit(3);
	pickNumber(7);
	delay(2);

	clearLEDs();
	pickDigit(4);
	pickNumber(8);
	delay(2);

这样,就可以控制数码管显示四个不同内容了

类库的建立:

库函数包括六个:

void begin();

该函数用于引脚的初始化,由于某种特殊的原因(懒),此处要求引脚连接方式固定(见上文)

void pickNumber(int number);

该函数用于将8个LED发光样式设定为对应的数字(0~9)

void pickDigit(int digit);

该函数用于设定某一数管发光(低电平),其余不发光(高电平)

void clearLEDs();

该函数用于清空数码管(设置8个LED均为高电平)

void printNumber(int n);

该函数用于显示不带小点的数字(0~9999)

void pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4);

该函数用于输出带小点的数字(0~9999),后四个参数分别对应四个小点的发光状态(1为发光,0为不发光),
如pointNumber(2134,0,1,1,0)的显示结果为21.3.4

下面为h文件

#ifndef LED4_H
#define LED4_H
#include "Arduino.h"

class LED4 {
public:
	void begin();										//用于引脚的初始化
	void pickNumber(int number);						//用于将8个LED发光样式设定为对应的数字(0~9)
	void pickDigit(int digit);							//用于设定某一数管发光(低电平),其余不发光(高电平)
	void clearLEDs();									//用于清空数码管
	void printNumber(int n);							//用于显示不带小点的数字(0~9999)
	void pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4);						//用于输出带小点的数字(0~9999),后四个参数分别对应四个小点的发光状态(1为发光,0为不发光)

private:
	int a = 1;
	int b = 2;
	int c = 3;
	int d = 4;
	int e = 5;
	int f = 6;
	int g = 7;
	int p = 8;
	int d4 = 9;
	int d3 = 10;
	int d2 = 11;
	int d1 = 12;
};
#endif

下面为cpp文件:(懒得敲注释了,不过应该比较易懂,见谅)

#include "Arduino.h"
#include "LED4.h"

void LED4::begin()
{
	pinMode(d1, OUTPUT);
	pinMode(d2, OUTPUT);
	pinMode(d3, OUTPUT);
	pinMode(d4, OUTPUT);
	pinMode(a, OUTPUT);
	pinMode(b, OUTPUT);
	pinMode(c, OUTPUT);
	pinMode(d, OUTPUT);
	pinMode(e, OUTPUT);
	pinMode(f, OUTPUT);
	pinMode(g, OUTPUT);
	pinMode(p, OUTPUT);
}
void LED4::clearLEDs()
{
	digitalWrite(a, HIGH);
	digitalWrite(b, HIGH);
	digitalWrite(c, HIGH);
	digitalWrite(d, HIGH);
	digitalWrite(e, HIGH);
	digitalWrite(f, HIGH);
	digitalWrite(g, HIGH);
	digitalWrite(p, HIGH);
}
void LED4::pickDigit(int digit)
{
	digitalWrite(d1, LOW);
	digitalWrite(d2, LOW);
	digitalWrite(d3, LOW);
	digitalWrite(d4, LOW);

	switch (digit)
	{
	case 1:
		digitalWrite(d1, HIGH);
		break;
	case 2:
		digitalWrite(d2, HIGH);
		break;
	case 3:
		digitalWrite(d3, HIGH);
		break;
	default:
		digitalWrite(d4, HIGH);
		break;
	}
}
void LED4::pickNumber(int number)
{
	switch (number)
	{
	case 0:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, LOW);
		digitalWrite(f, LOW);
		digitalWrite(g, HIGH);
		break;
	case 1:
		digitalWrite(a, HIGH);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, HIGH);
		digitalWrite(e, HIGH);
		digitalWrite(f, HIGH);
		digitalWrite(g, HIGH);
		break;
	case 2:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, HIGH);
		digitalWrite(d, LOW);
		digitalWrite(e, LOW);
		digitalWrite(f, HIGH);
		digitalWrite(g, LOW);
		break;
	case 3:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, HIGH);
		digitalWrite(f, HIGH);
		digitalWrite(g, LOW);
		break;
	case 4:
		digitalWrite(a, HIGH);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, HIGH);
		digitalWrite(e, HIGH);
		digitalWrite(f, LOW);
		digitalWrite(g, LOW);
		break;
	case 5:
		digitalWrite(a, LOW);
		digitalWrite(b, HIGH);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, HIGH);
		digitalWrite(f, LOW);
		digitalWrite(g, LOW);
		break;
	case 6:
		digitalWrite(a, LOW);
		digitalWrite(b, HIGH);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, LOW);
		digitalWrite(f, LOW);
		digitalWrite(g, LOW);
		break;
	case 7:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, HIGH);
		digitalWrite(e, HIGH);
		digitalWrite(f, HIGH);
		digitalWrite(g, HIGH);
		break;
	case 8:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, LOW);
		digitalWrite(f, LOW);
		digitalWrite(g, LOW);
		break;
	case 9:
		digitalWrite(a, LOW);
		digitalWrite(b, LOW);
		digitalWrite(c, LOW);
		digitalWrite(d, LOW);
		digitalWrite(e, HIGH);
		digitalWrite(f, LOW);
		digitalWrite(g, LOW);
		break;
	}
}
void LED4::printNumber(int n)
{
	int i, j, k, l;

	i = n / 1000;
	j = (n % 1000) / 100;
	k = (n % 100) / 10;
	l = n % 10;

	
	clearLEDs();
	pickDigit(1);
	pickNumber(i);
	delay(2);

	clearLEDs();
	pickDigit(2);
	pickNumber(j);
	delay(2);

	clearLEDs();
	pickDigit(3);
	pickNumber(k);
	delay(2);

	clearLEDs();
	pickDigit(4);
	pickNumber(l);
	delay(2);
}
void LED4::pointNumber(int n, boolean n1, boolean n2, boolean n3, boolean n4)
{
	int i, j, k, l;

	i = n / 1000;
	j = (n % 1000) / 100;
	k = (n % 100) / 10;
	l = n % 10;


	clearLEDs();
	pickDigit(1);
	pickNumber(i);
	if(n1)
		digitalWrite(p, LOW);
	delay(2);

	clearLEDs();
	pickDigit(2);
	pickNumber(j);
	if (n2)
		digitalWrite(p, LOW);
	delay(2);

	clearLEDs();
	pickDigit(3);
	pickNumber(k);
	if (n3)
		digitalWrite(p, LOW);
	delay(2);

	clearLEDs();
	pickDigit(4);
	pickNumber(l);
	if (n4)
		digitalWrite(p, LOW);
	delay(2);
}

keywords.txt文件省略
下面为实例程序,用于番茄钟

#include "LED4.h"
LED4 led4;

int i,j,k;
int worktime = 45;        //番茄钟工作时间
int resttime = 8;         //番茄钟休息时间
int nowtime = 0;          //当前剩余时间
void setup()
{
  led4.begin();
  pinMode(13,OUTPUT);
}

void loop()
{
  start(worktime);        //开始工作
  FMtone(3000);           //工作结束,蜂鸣器发声提示
  start(resttime);        //开始休息
  FMtone(1000);           //休息结束,蜂鸣器发声提示
}

/*用于蜂鸣器发声*/
void FMtone(int t)
{
  digitalWrite(13,HIGH);
  delay(t);
  digitalWrite(13,LOW);
}

/*用于开始时长为t的倒计时*/
void start(int t)
{
  for(k = 0;k < 125;k++)                  /*下面循环默认从XX:59开始,此语句用于修正为从XX:00开始*/
    led4.pointNumber(t * 100,0,1,0,0);
    
  for(i = t - 1;i >= 0;i--)               /*分钟*/
  {           
    for(j = 59;j >= 0;j--)                /*秒*/
    {
      nowtime = i * 100 + j;
      for(k = 0;k < 118;k++)              /*库中pointNumber函数包括4个delay(2),此处理应为1000/8 = 125,但经实际修正,改为118*/
      {
        led4.pointNumber(nowtime,0,1,0,0);
      }
    }
  }
}

库下载地址:
https://download.csdn.net/download/weixin_43771001/10963621




以上

  • 14
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 Arduino 控制四位数码管倒计时的代码示例: ``` // 定义数码管引脚 int digitPins[] = {2, 3, 4, 5}; int segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // 定义倒计时时间(单位:秒) int countDownTime = 60; void setup() { // 初始化数码管引脚 for (int i = 0; i < sizeof(digitPins); i++) { pinMode(digitPins[i], OUTPUT); } for (int i = 0; i < sizeof(segmentPins); i++) { pinMode(segmentPins[i], OUTPUT); } } void loop() { // 计算剩余时间 int remainingTime = countDownTime - (millis() / 1000); // 显示剩余时间 displayTime(remainingTime); // 倒计时结束,停止程序 if (remainingTime <= 0) { while (true) {} } // 延时 100 毫秒 delay(100); } void displayTime(int time) { // 计算千位、百位、十位和个位数字 int thousands = time / 1000; int hundreds = (time % 1000) / 100; int tens = (time % 100) / 10; int ones = time % 10; // 数码管显示 digitalWrite(digitPins[0], LOW); displayDigit(thousands); delay(1); digitalWrite(digitPins[0], HIGH); digitalWrite(digitPins[1], LOW); displayDigit(hundreds); delay(1); digitalWrite(digitPins[1], HIGH); digitalWrite(digitPins[2], LOW); displayDigit(tens); delay(1); digitalWrite(digitPins[2], HIGH); digitalWrite(digitPins[3], LOW); displayDigit(ones); delay(1); digitalWrite(digitPins[3], HIGH); } void displayDigit(int digit) { // 数码管段码定义 byte segments[] = { B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B10111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // 显示数字 if (digit >= 0 && digit <= 9) { for (int i = 0; i < sizeof(segmentPins); i++) { digitalWrite(segmentPins[i], bitRead(segments[digit], i)); } } } ``` 这个代码使用 `digitPins` 和 `segmentPins` 数组来定义数码管引脚,使用 `countDownTime` 变量来定义倒计时时间,使用 `displayTime` 函数来显示剩余时间,使用 `displayDigit` 函数来显示单个数字。在 `loop` 函数中,程序使用 `millis` 函数来计算剩余时间,并且使用 `delay` 函数来延时 100 毫秒。当倒计时结束时,程序会进入死循环。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值