如何使用共阳极7段4位数字显示屏?


9

请将此问题作为以下(我自己的)答案的示例。

我有一个7段式4位LED显示屏,但是我不知道如何接线。

我不了解普通阳极/阴极之间的区别,并且每个LED没有2个引脚,这很奇怪。最近,有关“ 7段4位数字共阳极”的问题被删除。就在那一刻,我正在输入答案。

不过,我仍然想与您或提出问题的人分享我的答案。请验证/更新我的答案以获取更多信息。具体来说,有人可以添加工作代码,但目前我不能。


只是好奇。您是否发布了问题以便回答?
PhillyNJ

实际上有一个选择。但是,我的问题中的评论也讲述了“背景故事”。我正在回答一个问题,该问题已删除。并且感到有必要发布我的答案。是的,我做到了。但这是一种有效的方法,在提出问题之前我已经有了答案。所以这对我来说很有意义。如果您有一个非常好的问题(和答案),我只能鼓励您这样做,因为在某些时候它可能对某人有用。
保罗

Answers:


7

作为对Paul的回答的补充,我编写了一个简短的程序来演示如何驱动他的图形的7段4位数字显示:

接线图

这实际上是一个普通的阴极显示器,因此该程序假定该情况以及图中的特定布线。有趣的部分是refresh_display()函数,应该定期调用它。算法如下:

  • 用我们想要显示的数字之一的适当信号驱动7个阳极
  • 设置HIGH通过NPN晶体管控制该数字阴极的输出
  • 等待2.5毫秒(刷新率为100 Hz)
  • 设置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库。该库比上面的示例代码更通用,因为它不对使用的引脚做任何假设。但是库和此代码之间的最大区别在于计时的管理方式:

  • 该库由定时器2溢出中断驱动。这应该提供一个非常稳定的计时,但要为此花费一个计时器。
  • 上面的代码依赖于用户refresh_display()经常调用。它不需要专用的硬件资源,但不能与花费太长时间的程序配合使用loop():它不喜欢您调用delay()

这就是为什么我喜欢开源的东西。您可以与世界其他地方共享工作负载,并创建一些非常好的东西。然后与世界其他地方再次共享它:)您可以从其他开发人员那里学到很多东西,并且这些知识将是持久的,而不仅仅是对其他所有人的隐藏。
Paul

我对Tranistor的基极电阻值有个疑问。我在计算电阻值时遇到很大的问题。在四个2N2222晶体管中使用4.7K电阻的​​原因是什么?如果单个段消耗10mA电流,则包括DP在内的所有段的最大电流消耗为80mA。如果V(BE * sat)= 1.3v,I(B)= 15mA,那么300ohm就足够了。我的计算有问题吗?
maruf

@maruf:所需的最小 I_B是期望的I_C除以最小的晶体管增益。如果您希望在集电极上具有80 mA的电流,并期望至少获得100 mA的增益(这可能是乐观的,我没有检查数据表),那么您在基极上至少需要80/100 = 0.8 mA。然后,基极电阻的最大值是其两端的电压降(约5 V-0.7 V)除以该电流,即约5.3kΩ。
埃德加·波内(Edgar Bonet)

5

我将尝试带您了解LED等的完整基础知识。4位7段显示器是多种“ LED技术”的结合。

接线LED

LED或发光二极管是Arduino的有趣之处之一。

从本质上讲,它们易于使用,接通电源并点亮。

它们可能会令人讨厌,因为它们具有某种极性,这意味着它们只有在正确接线时才能起作用。如果您将正负电压反向,它们将根本不会点亮。

尽管很烦人,但它也很有用。

阴极vs阳极

在传统的LED上,长引线是(+)阳极。另一根引线是(-)阴极。

“或者,如果有人修剪了腿,请尝试在LED外壳上找到平坦的边缘。最靠近平坦边缘的引脚将是负极阴极引脚。” -星火

资料来源:https : //learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

星火娱乐

基本接线

我不确定这是否正确,因为我从互联网上抓取了图像。

基本LED接线

接线LED很容易,阳极(+)最好通过限流电阻连接到正电压。阴极(-)接地(如果没有正极,则用限流电阻器接地)。

限流电阻将避免LED短路,从而损坏LED或Microcontroller / Arduino。

多个LED,矩阵,RGB LED

使用多个LED时,通常将其正极连接到(+),“公共阳极”或全部连接到(-)“公共阴极”。

基本上可以归结为这一点。

RGB共阴极/阳极

对于公共阴极,您要为想要接通的引脚提供电流。

对于公共阳极,可以吸收流过LED的电流。

多路复用(多位,7段)

您应该查看视差教程:http : //learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

视差4digit7seg

当您有很多LED时,“多路复用”它们通常很聪明。通常,您会快速查看“组”的LED,以使它们看起来像同时亮着一样。

通常,您从一列LED吸收电流,并将电流提供给一行的单个LED。

或者,您向一列LED提供电流,并从一行中的单个LED吸收电流。

这样您就可以选择激活哪个列,以及该列的哪个LED点亮。快速更改这些列/行将使您能够用更少的引脚来控制多个LED。

如果您不想在软件中进行切换,甚至可以使用显示控制器。

因此,当您有一个4位多路复用的7段公共阳极

该图将更像这样:

在此处输入图片说明

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.