请将此问题作为以下(我自己的)答案的示例。
我有一个7段式4位LED显示屏,但是我不知道如何接线。
我不了解普通阳极/阴极之间的区别,并且每个LED没有2个引脚,这很奇怪。最近,有关“ 7段4位数字共阳极”的问题被删除。就在那一刻,我正在输入答案。
不过,我仍然想与您或提出问题的人分享我的答案。请验证/更新我的答案以获取更多信息。具体来说,有人可以添加工作代码,但目前我不能。
请将此问题作为以下(我自己的)答案的示例。
我有一个7段式4位LED显示屏,但是我不知道如何接线。
我不了解普通阳极/阴极之间的区别,并且每个LED没有2个引脚,这很奇怪。最近,有关“ 7段4位数字共阳极”的问题被删除。就在那一刻,我正在输入答案。
不过,我仍然想与您或提出问题的人分享我的答案。请验证/更新我的答案以获取更多信息。具体来说,有人可以添加工作代码,但目前我不能。
Answers:
作为对Paul的回答的补充,我编写了一个简短的程序来演示如何驱动他的图形的7段4位数字显示:
这实际上是一个普通的阴极显示器,因此该程序假定该情况以及图中的特定布线。有趣的部分是refresh_display()
函数,应该定期调用它。算法如下:
HIGH
通过NPN晶体管控制该数字阴极的输出LOW
阴极控制输出应该注意的是,通过使用Blink Without Delay Arduino教程中描述的技术,可以在不阻塞CPU的情况下完成等待。这是程序:
const int NB_DIGITS = 4; // 4-digit display
const int FIRST_ANODE = 2; // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9; // cathodes, right to left, on pins 9..12
// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];
// Set all the used pins as outputs.
void init_display()
{
for (int i = 0; i < 7; i++)
pinMode(FIRST_ANODE + i, OUTPUT);
for (int i = 0; i < NB_DIGITS; i++)
pinMode(FIRST_CATHODE + i, OUTPUT);
}
// This should be called periodically.
void refresh_display()
{
// Our 7-segment "font".
static const uint8_t font[10] = {
//abcdefg
0b1111110, // 0
0b0110000, // 1
0b1101101, // 2
0b1111001, // 3
0b0110011, // 4
0b1011011, // 5
0b1011111, // 6
0b1110000, // 7
0b1111111, // 8
0b1111011 // 9
};
// Wait for 2.5 ms before switching digits.
static uint32_t last_switch;
uint32_t now = micros();
if (now - last_switch < 2500) return;
last_switch = now;
// Switch off the current digit.
static uint8_t pos;
digitalWrite(FIRST_CATHODE + pos, LOW);
// Set the anodes for the next digit.
pos = (pos + 1) % NB_DIGITS;
uint8_t glyph = font[digits[pos]];
for (int i = 0; i < 7; i++)
digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));
// Switch digit on.
digitalWrite(FIRST_CATHODE + pos, HIGH);
}
/***********************************************************************
* Example usage.
*/
void setup()
{
init_display();
}
void loop()
{
uint32_t now = millis();
// Change the number displayed every second.
static uint32_t last_change;
if (now - last_change >= 1000) {
digits[3] = digits[2];
digits[2] = digits[1];
digits[1] = digits[0];
digits[0] = (digits[0] + 1) % 10;
last_change = now;
}
refresh_display();
}
Paul提供了有关Parallax教程的链接,该链接 建议使用 Multiplex7Seg Arduino库。该库比上面的示例代码更通用,因为它不对使用的引脚做任何假设。但是库和此代码之间的最大区别在于计时的管理方式:
refresh_display()
经常调用。它不需要专用的硬件资源,但不能与花费太长时间的程序配合使用loop()
:它不喜欢您调用delay()
。我将尝试带您了解LED等的完整基础知识。4位7段显示器是多种“ LED技术”的结合。
接线LED
LED或发光二极管是Arduino的有趣之处之一。
从本质上讲,它们易于使用,接通电源并点亮。
它们可能会令人讨厌,因为它们具有某种极性,这意味着它们只有在正确接线时才能起作用。如果您将正负电压反向,它们将根本不会点亮。
尽管很烦人,但它也很有用。
阴极vs阳极
在传统的LED上,长引线是(+)阳极。另一根引线是(-)阴极。
“或者,如果有人修剪了腿,请尝试在LED外壳上找到平坦的边缘。最靠近平坦边缘的引脚将是负极阴极引脚。” -星火
资料来源:https : //learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
基本接线
我不确定这是否正确,因为我从互联网上抓取了图像。
接线LED很容易,阳极(+)最好通过限流电阻连接到正电压。阴极(-)接地(如果没有正极,则用限流电阻器接地)。
限流电阻将避免LED短路,从而损坏LED或Microcontroller / Arduino。
多个LED,矩阵,RGB LED
使用多个LED时,通常将其正极连接到(+),“公共阳极”或全部连接到(-)“公共阴极”。
基本上可以归结为这一点。
对于公共阴极,您要为想要接通的引脚提供电流。
对于公共阳极,可以吸收流过LED的电流。
多路复用(多位,7段)
您应该查看视差教程:http : //learn.parallax.com/4-digit-7-segment-led-display-arduino-demo
当您有很多LED时,“多路复用”它们通常很聪明。通常,您会快速查看“组”的LED,以使它们看起来像同时亮着一样。
通常,您从一列LED吸收电流,并将电流提供给一行的单个LED。
或者,您向一列LED提供电流,并从一行中的单个LED吸收电流。
这样您就可以选择激活哪个列,以及该列的哪个LED点亮。快速更改这些列/行将使您能够用更少的引脚来控制多个LED。
如果您不想在软件中进行切换,甚至可以使用显示控制器。
因此,当您有一个4位多路复用的7段公共阳极
该图将更像这样:
http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm