讲解如何使用最少的机房硬件讲解资源实现多位LED数码管显示方法

LED数码管显示原理及LED数码管的应用-知识课堂-电子元件技术网
你的位置: >
LED数码管显示原理及LED数码管的应用
发布时间:
LED数码管显示原理
随着社会的发展,科技也日益蓬勃发展,因此数码管的发展不断的生产,如今的LED数码管被广泛应用,今天本文将为大家介绍LED数码管的相关内容,说明LED数码管的基础及显示基本原理,并对其应用作了简要说明。
一: LED显示器件的基础
LED发光器件一般常用的有2类、数码管和点阵。
a,数码管常用的一般8字型,分为A B C D E F G P段,其中P位小数点;
b,数码管常用的有10根管脚(单位),每段一根管脚,另外两根管脚为 公共端,2根是通的;
c,从尺寸上分的话种类很多, 常用的有0.3 0.5 0.8 1.0 1.2 1.5 1.8 2.3 3.0 4.0 5.0 等等;
d,一般小于1.0的为单管芯,(1.0有单有双),1.2~~1.5 为双管芯,1.8以上为3个以上的管芯, 因而他们的供电电压要求不同,一般每个关芯的压降为2.1v左右, 我的经验是0.8以下5v供电,1.0~2.3为12v,3.0以上更高;
e,数码管分共阴和共阳两种;
a,点阵常用的为8*8,以前还有5*8(现在不大用了);
b,点阵都是单管芯,分(行)共阴和(行)共阳,一般都用5v供电;
c,8*8点阵为16根管脚(单色, 也有24根的, 可能是作废的双色点阵或者为了能在同一种线路板上实现单色双色都可用而设计的, 也比较常见)8根行8根绿,双色为24根管脚, 8根行, 8根列红, 8根列绿。
二: LED数码管显示基本原理
分为静态(只有数码管能实现)和动态。
1:静态的比较好实现,在此不多讲了
2:数码管动态
a,硬件连接
数码管一般为1/13 能扫描, 再高的话亮度损失比较大,在此假设为列为13列, 行为16行, 共阳管, 每行数码管的各段连在一起,每列数码管的公共段连在一起. 列开关用tip127, 他可以直接用154驱动, 达林顿管5安培, 注意127输出不要加电阻行用595(164不建议)+2803或者2003+一个9013, 在2003的输出要加上限流电阻,一般为56~330欧姆(如果是&1.0的数码管,可以直接用595加电阻驱动)。
采用89c51为cpu, 存储器可采用24c系列,或者28c系列,注意他们的写入速度都不是很快, 不过一般数码管的输入设备为键盘或遥控器,速度足够了, 还有24c系列的读出速度也比较慢,我发现每次读出的数据大概只有20以内才不会影响更新显示显示采用时钟中断1, 中断时间不能超过1.5ms,最好为1.2ms左右, 可以在中断服务程序中读24c02,也可以在中断的间隙中读取,但必须保证能够读出所有的一列数据! 读出的数据放到一块显示区中, (在内存中定义一个数组buf[16]), 在中断子程序中把数据发送的595中即可,最好采用串口发送, 编程最简单。发送完毕后,关掉控制行的154,给595的RCLK(12脚)一个脉冲,把数据从移位寄存器传输到锁存器,而后打开154并输入列信号即可。
a,点阵一般采用1/16扫描,控制原理和数码管差不多;
b,硬件: 行用154+tip127,列用595加电阻(0~56欧姆)直接驱动;
c,软件: 方案比较多,见下面
三: 先说说信息的存储
1:一种为固化的汉字, 汉字点阵信息存于27c256 中, 最多存 点阵汉字, 要修改只能重新写27c256, 优点是不丢失, 一般银行做的都是这种。
2: 另一种是可以用户自己修改的, 修改方式又分为2种, 早期一般用键盘或者遥控器修改, 那样必须在主办上固化有汉字字库, 可用27c040固化ucdos的hzk16全角字库和asc16半角字库, 用户输入区位吗进行修改, 用户需要显示的汉字以区位码的方式存到一片E2POM中, 显示的时候程序根据区位吗读取点阵信息送到屏上显示, 还有一种近年来常用的方式就是利用微机串口进行修改,这里面还分为两种:
A,控制板上没有字库, 微机发送的是显示的点阵信息, 控制板接受后把信息存到带电池的RAM中(也可用E2PROM,但速度很慢), 这种的缺点是掉电池的RAM不太可靠, 常常丢失信息;
B,控制板上带字库, 微机发送汉字的机器码(内码)即可, 其他同上。
四: 显示的控制
信息的发送可以有好多方式, 根据采用器件的不同而不同, 有的厂家采用374控制而不采用595, 那样的话直接写一个外部端口即可, 374级连方式, (如果用1 排374 的话在传输中必须关掉显示, 显示字较多的话影响亮度, 用2 排374 不必关掉显示但增加硬件成本), 目前用得较少了,595的很常见。 发送可以用传口, 很简单, 也可以用别的口模拟串口发送 (因为传口还有可能随时接受微机的信号), 也可以采用串口复用。
采用的是用 374+165 向595 发送数据, 硬件比较复杂, 但是在以后的显示花样中很好用!
提示一下: 最近用双龙的90S8515发现很好, 因为他还有一个SPI口, 用来送595信号更爽! 速度可到3M,(12M晶体)。
五: 一些注意事项
1: 显示时间,每行&1.5MS;
2: 根据经验,89C51 12M晶体最大控制48个16*16点阵,再大的话可以提高晶体频率和优化程序,(就是发送程序的时间最短);
3: 在显示的字比较多时, 一定要注意发送子程序的代码效率, 因为发送是一个循环, 所以循环体内的处理越快越好, 大家现在大都用C51, 更得注意。
大家看下面的例子:
if(hangno==0x10)hangno=0; //hangno为显示的行序号
for(i=0;i&32;i++)
{PORT1=*(addr+hangno*0x600+i); //我的汉字信息是0~600为第一行信息//600~0c00为第二行信息...PORT2=0x0}
每次发送32个字节(16个字), 程序编译通过, 没有问题, 可是当显示64个汉字时(假设)显示就乱了, 改为if(hangno==0x10)hangno=0; //hangno为显示的行序号w=hangno*0x600;for(i=0;i&128;i++)
{PORT1=*(addr+w+i); //我的汉字信息是0~600为第一行信息//600~0c00为第二行信息...PORT2=0x0}
LED数码管的应用
主要用于楼体墙面,广告招牌、高档的DISCO、酒吧、夜总会、会所的门头广告牌 等。特别适合应用于广告牌背景、立交桥、河、湖护栏、建筑物轮廓等 大型动感光带之中,可产生彩虹般绚丽的效果。
用护栏管装饰建筑物的轮廓,可以起到突出美彩亮化建筑物的效果。事实证明,它已经成为照明产品中的一只奇葩,绽放在动感都市。
总之,因LED数码管能产生彩虹般的绚丽效果,因此LED数码管主要应用于酒吧、高档的酒店、夜总会及广告招牌灯等豪华的场所。不过LED数码管的设计还是还有一些要注意的事项的,所以设计师们要注意好一些所要注意的细节,才能更好的发展LED数码管的功能。
浏览过本文&LED数码管显示原理及LED数码管的应用&的人也浏览了:
技术白皮书下载
反馈意见:
客服电话:1树莓派GPIO入门05-驱动数码管显示数字 - 简书
树莓派GPIO入门05-驱动数码管显示数字
这次我们用树莓派的GPIO口驱动数码管来显示数字,进而制作一个简单的电子钟,通过按钮来切换显示时间或日期。
树莓派GPIO入门05-驱动数码管显示数字
数码管一只。因为需要显示日期时间所以需要能显示4个数字的数码管,也称4位数码管。淘宝买1块多钱一只。注意数码管有共阳和共阴的。我这里使用的是共阳的。至于区别,下面的原理说明里会详细解释。
杜邦线若干。
面包板一块。
标准的数码管从显示内容上分7段和8段数码管两种。8段比7段多一个右下角的小数点。还有一些其他特殊的如可以显示米字形的数码管不在本文讨论范围内,其实原理都是一样的。
8段数码管由8个发光二极管组成,其中7个用于组成数字,1个用于显示小数点。每一根的编号如下图的右上角所示(A-G,DP)。
4位共阳8段数码管原理图
数码管从电源极性上分共阳和共阴两种。解释一下,如果数码管上每一个独立的发光二极管都单独引出两根引脚,一根接正极(阳)一根接负极(阴),那么一个8段数码管就需要16根引脚来控制。但其实这8段数码管完全可以在内部共用一个阳级,只控制各段发光二极管的阴级联通即可,这就是共阳。反之亦然,叫共阴。共阳或共阴的每个8段数码管只需要引出9个引脚,1个阳(阴)级接到树莓派vcc(gnd)上,另外8个分别连到gpio口上,通过控制io口高低电平即可显示所需数字。比如一只共阳数码管想显示数字1,看LED编号图可知需要点亮b段和c段,其他全灭。那么连到共阳端引脚的io口输出高电平,连到引脚b、c的io口输出低电平,连到引脚a、d、e、f、g、dp的io口均输出高电平即可。写成代码就是:
# 定义各段发光二极管对应的GPIO口
LED_A = 26
LED_B = 19
LED_C = 13
LED_F = 11
LED_DP = 10
# 定义数码管共阳极对应的GPIO口
# 避免闪烁,在输出数字字形信号前先拉低共阳端,关闭显示
RPi.GPIO.output(VCC, False)
# 输出数字1的字形信号
RPi.GPIO.output(LED_A, True)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, True)
# 最后拉高共阳段,显示数字
RPi.GPIO.output(VCC, True)
本文使用的数码管是8段共阳4位(4个数字)数码管,型号是F3461BH。上面说了共阳数码管每个数字需要9个引脚来控制,那么4个数字就需要36个引脚吗?显然不现实,树莓派的io口也完全不够用。这就引出另一个概念,静态显示和动态扫描显示。
静态显示,就是前面说的每一个数字需要占用8个io口,每多一个数字就需要额外的8个io口,如果数字位数不多,io口够用的话,这样做完全没问题。实际应用中往往需要显示多个数字,io口基本上是不够用的。这就需要动态扫描显示了。下面摘一段百度百科关于动态扫描显示的说明(稍有改动):
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起引出8个引脚,每个数字再单独引出共阳(阴)端,这样总引脚数就只要8 + 数字个数即可,本文使用的8段4位数码管正是引出了12个引脚。至于哪个引脚对应哪一段,哪几个引脚分别对应各数字的共阳(阴)端,就需要商家提供电路图了。当然也可以自己慢慢试,这不在本文讨论范围,大家可以自己摸索。当树莓派输出8个段信号时,所有数码管都会接收到相同的信号,但究竟是哪个数码管会显示出字形,取决于这个数码管对应的共阳(阴)极(后统称位选端)有无导通。所以我们只要将需要显示的数码管的位选端选通,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的位选端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
综上,比如我们想要在4位共阳数码管上显示1234这4个数字,要做的就是:
避免闪烁,在输出数字字形信号前先拉低所有4个共阳极,关闭所有显示。
拉低1号数码管的共阳极,关闭显示。
输出1号数码管上希望显示的数字字形信号。
只拉高1号数码管的共阳极,让1号数码管显示上面设置好的数字字形。
延时一段时间(1ms左右)
拉低1号数码管的共阳极,关闭显示。
输出2号数码管上希望显示的数字字形信号。
只拉高2号数码管的共阳极,让2号数码管显示上面设置好的数字字形。
延时一段时间(1ms左右)
拉低2号数码管的共阳极,关闭显示。
输出3号数码管上希望显示的数字字形信号。
只拉高3号数码管的共阳极,让3号数码管显示上面设置好的数字字形。
延时一段时间(1ms左右)
拉低3号数码管的共阳极,关闭显示。
输出4号数码管上希望显示的数字字形信号。
只拉高4号数码管的共阳极,让4号数码管显示上面设置好的数字字形。
延时一段时间(1ms左右)
返回step2,循环执行。
取得日期和时间的方法不是本文的重点,大家自己看代码。
#!/usr/bin/env python
# encoding: utf-8
import RPi.GPIO
import time
# 定义单个数码管各段led对应的GPIO口
LED_A = 26
LED_B = 19
LED_C = 13
LED_F = 11
LED_DP = 10
# 定义1到4号数码管阳极对应的GPIO口
DIGIT1 = 12
DIGIT2 = 16
DIGIT3 = 20
DIGIT4 = 21
# 定义按钮输入的GPIO口
RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(LED_A, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_B, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_C, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_D, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_E, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_F, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_G, RPi.GPIO.OUT)
RPi.GPIO.setup(LED_DP, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT1, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT2, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT3, RPi.GPIO.OUT)
RPi.GPIO.setup(DIGIT4, RPi.GPIO.OUT)
RPi.GPIO.output(DIGIT1, True)
RPi.GPIO.output(DIGIT2, True)
RPi.GPIO.output(DIGIT3, True)
RPi.GPIO.output(DIGIT4, True)
RPi.GPIO.setup(btn, RPi.GPIO.IN, pull_up_down=RPi.GPIO.PUD_UP)
# 指定no(1-4)号数码管显示数字num(0-9),第三个参数是显示不显示小数点(true/false)
def showDigit(no, num, showDotPoint):
# 先将正极拉低,关掉显示
RPi.GPIO.output(DIGIT1, False)
RPi.GPIO.output(DIGIT2, False)
RPi.GPIO.output(DIGIT3, False)
RPi.GPIO.output(DIGIT4, False)
if (num == 0) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 1) :
RPi.GPIO.output(LED_A, True)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 2) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, True)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 3) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 4) :
RPi.GPIO.output(LED_A, True)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 5) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, True)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 6) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, True)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 7) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, True)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, True)
RPi.GPIO.output(LED_G, True)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 8) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, False)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
elif (num == 9) :
RPi.GPIO.output(LED_A, False)
RPi.GPIO.output(LED_B, False)
RPi.GPIO.output(LED_C, False)
RPi.GPIO.output(LED_D, False)
RPi.GPIO.output(LED_E, True)
RPi.GPIO.output(LED_F, False)
RPi.GPIO.output(LED_G, False)
RPi.GPIO.output(LED_DP, not showDotPoint)
if (no == 1) :
RPi.GPIO.output(DIGIT1, True)
elif (no == 2) :
RPi.GPIO.output(DIGIT2, True)
elif (no == 3) :
RPi.GPIO.output(DIGIT3, True)
elif (no == 4) :
RPi.GPIO.output(DIGIT4, True)
while True:
# 按钮按下时显示日期,否则显示时间
# 为了区别左右的数字,让第二个数码管的小数点显示出来
#(本来应该是一个冒号,我们这个数码管没有,就用小数点代替了)
if (RPi.GPIO.input(btn) == 1):
time.sleep(t)
showDigit(1, int(time.strftime("%H",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(2, int(time.strftime("%H",time.localtime(time.time()))) % 10, True)
time.sleep(t)
showDigit(3, int(time.strftime("%M",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(4, int(time.strftime("%M",time.localtime(time.time()))) % 10, False)
time.sleep(t)
showDigit(1, int(time.strftime("%m",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(2, int(time.strftime("%m",time.localtime(time.time()))) % 10, True)
time.sleep(t)
showDigit(3, int(time.strftime("%d",time.localtime(time.time()))) / 10, False)
time.sleep(t)
showDigit(4, int(time.strftime("%d",time.localtime(time.time()))) % 10, False)
except KeyboardInterrupt:
# 最后清理GPIO口(不做也可以,建议每次程序结束时清理一下,好习惯)
RPi.GPIO.cleanup()
当你照着这篇文章成功在数码管上显示出数字后,你可能会郁闷的发现数字有一点点闪烁,显示的不是非常稳定,这种情况在树莓派1代上更明显。
python库对gpio口不停操作时对cpu的占用率很高,而一旦cpu的占用率一高,就不能保证延时函数的准确性,而在动态扫描时延时的不准确会导致数码管的亮度不稳定,比如第一只数码管显示了2ms而第二只显示了1ms的话,第一只数码管的亮度就会略高于第二只数码管,而参差不齐的延时最后就表现为数字显示有闪烁的感觉。
python库本身翻转gpio口的效率就不高,有兴趣可以参照,有各种语言各种库对gpio的操作速度比较。比较结果是c的wiringPi库完胜其他方式。其实python库已经是表现不错的了,但还是被c甩了N条街。python翻转io口的频率在70kHz左右,而wiringPi则可以达到4MHz!这个已经是数量级上的差距了。
抱着试一试的心情,我用c语言的wiringPi库把上面这个程序重写了一遍,代码是这个样子的:
#include &wiringPi.h&
#include &unistd.h&
#include &time.h&
// 定义单个数码管各段led对应的GPIO口
// 使用命令 "gpio readall" 来获取当前pi版本对应的各引脚的wiringPi和BCM的编号
// 再本程序中应该使用wiringPi编号
// 我的pi2 Mode B执行结果如下:(wPi列就是wiringPi编号)
// 之前Python版本的代码使用的是BCM编号,所以在不改变硬件接线的情况下,我们需要把原来BCM编号改成对应的wiringPi编号。
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi |
| Mode | V | Physical | V | Mode | Name
| wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
7 | GPIO. 7 |
| 1 | ALT0 | TxD
9 || 10 | 1 | ALT0 | RxD
0 | GPIO. 0 |
OUT | 0 | 11 || 12 | 0 | IN
| GPIO. 1 | 1
2 | GPIO. 2 |
IN | 0 | 13 || 14 |
3 | GPIO. 3 |
IN | 0 | 15 || 16 | 0 | IN
| GPIO. 4 | 4
| 17 || 18 | 0 | IN
| GPIO. 5 | 5
IN | 0 | 19 || 20 |
IN | 0 | 21 || 22 | 0 | IN
| GPIO. 6 | 6
IN | 0 | 23 || 24 | 1 | IN
| 25 || 26 | 1 | IN
IN | 1 | 27 || 28 | 1 | IN
21 | GPIO.21 |
IN | 1 | 29 || 30 |
22 | GPIO.22 |
IN | 1 | 31 || 32 | 0 | IN
| GPIO.26 | 26
23 | GPIO.23 |
IN | 0 | 33 || 34 |
24 | GPIO.24 |
IN | 0 | 35 || 36 | 0 | IN
| GPIO.27 | 27
25 | GPIO.25 |
IN | 0 | 37 || 38 | 0 | IN
| GPIO.28 | 28
| 39 || 40 | 0 | IN
| GPIO.29 | 29
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi |
| Mode | V | Physical | V | Mode | Name
| wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
#define LED_A 25 //BCM:26
#define LED_B 24 //BCM:19
#define LED_C 23 //BCM:13
#define LED_D 22 //BCM:6
#define LED_E 21 //BCM:5
#define LED_F 14 //BCM:11
#define LED_G 13 //BCM:9
#define LED_DP 12 //BCM:10
// 定义1到4号数码管阳极对应的GPIO口
#define DIGIT1 26 //BCM:12
#define DIGIT2 27 //BCM:16
#define DIGIT3 28 //BCM:20
#define DIGIT4 29 //BCM:21
// 定义按钮输入的GPIO口
#define btn 2 //BCM:27
#define FALSE 0
#define TRUE
#define t 5000 //usleep延时长度(单位um微秒,1000um=1ms,1000ms=1s)
// 指定no(1-4)号数码管显示数字num(0-9),第三个参数是显示不显示小数点(1/0)
void showDigit(int no, int num, int showDotPoint);
struct tm *tm_
int main (void) {
wiringPiSetup () ;
pinMode (LED_A, OUTPUT) ;
pinMode (LED_B, OUTPUT) ;
pinMode (LED_C, OUTPUT) ;
pinMode (LED_D, OUTPUT) ;
pinMode (LED_E, OUTPUT) ;
pinMode (LED_F, OUTPUT) ;
pinMode (LED_G, OUTPUT) ;
pinMode (LED_DP, OUTPUT) ;
pinMode (DIGIT1, OUTPUT) ;
pinMode (DIGIT2, OUTPUT) ;
pinMode (DIGIT3, OUTPUT) ;
pinMode (DIGIT4, OUTPUT) ;
pinMode (btn, INPUT) ;
pullUpDnControl (btn, PUD_UP) ;
digitalWrite (DIGIT1, HIGH) ;
digitalWrite (DIGIT2, HIGH) ;
digitalWrite (DIGIT3, HIGH) ;
digitalWrite (DIGIT4, HIGH) ;
for (; ; )
time(&now);
tm_now=localtime(&now);
// 按钮按下时显示日期,否则显示时间
// 为了区别左右的数字,让第二个数码管的小数点显示出来
//(本来应该是一个冒号,我们这个数码管没有,就用小数点代替了)
if (digitalRead(btn) == HIGH) {
usleep(t);
showDigit(1, tm_now-&tm_hour / 10, FALSE);
usleep(t);
showDigit(2, tm_now-&tm_hour % 10, TRUE);
usleep(t);
showDigit(3, tm_now-&tm_min / 10, FALSE);
usleep(t);
showDigit(4, tm_now-&tm_min % 10, FALSE);
// 取得的月份和日期都是从0开始的,所以显示前需要加1
usleep(t);
showDigit(1, (tm_now-&tm_mon+1) / 10, FALSE);
usleep(t);
showDigit(2, (tm_now-&tm_mon+1) % 10, TRUE);
usleep(t);
showDigit(3, (tm_now-&tm_mday+1) / 10, FALSE);
usleep(t);
showDigit(4, (tm_now-&tm_mday+1) % 10, FALSE);
return 0 ;
void showDigit(int no, int num, int showDotPoint) {
// 先将正极拉低,关掉显示
digitalWrite (DIGIT1, LOW) ;
digitalWrite (DIGIT2, LOW) ;
digitalWrite (DIGIT3, LOW) ;
digitalWrite (DIGIT4, LOW) ;
if (num == 0) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, LOW) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, HIGH) ;
} else if (num == 1) {
digitalWrite (LED_A, HIGH) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, HIGH) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, HIGH) ;
digitalWrite (LED_G, HIGH) ;
} else if (num == 2) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, HIGH) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, LOW) ;
digitalWrite (LED_F, HIGH) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 3) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, HIGH) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 4) {
digitalWrite (LED_A, HIGH) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, HIGH) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 5) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, HIGH) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 6) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, HIGH) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, LOW) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 7) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, HIGH) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, HIGH) ;
digitalWrite (LED_G, HIGH) ;
} else if (num == 8) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, LOW) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, LOW) ;
} else if (num == 9) {
digitalWrite (LED_A, LOW) ;
digitalWrite (LED_B, LOW) ;
digitalWrite (LED_C, LOW) ;
digitalWrite (LED_D, LOW) ;
digitalWrite (LED_E, HIGH) ;
digitalWrite (LED_F, LOW) ;
digitalWrite (LED_G, LOW) ;
if (showDotPoint == 1) {
digitalWrite (LED_DP, LOW) ;
digitalWrite (LED_DP, HIGH) ;
if (no == 1) {
digitalWrite (DIGIT1, HIGH) ;
} else if (no == 2) {
digitalWrite (DIGIT2, HIGH) ;
} else if (no == 3) {
digitalWrite (DIGIT3, HIGH) ;
} else if (no == 4) {
digitalWrite (DIGIT4, HIGH) ;
c的wiringPi库的安装和代码的编译执行方法请自行百度。
c语言测试结果是显示稳定了很多,但仍然有一点不稳定不仔细观察基本看不出来了。这个应该跟我代码的效率有关,逻辑应该还可以精简节省cpu资源。这个以后再试了。我们这个系列主要是让大家了解各种基本外设传感器的原理和使用方法。用c语言也只是做一点延伸,以后的教程还是以python为主。
源代码下载
这节课,来学习如何控制单位数码管来显示数字。 电路原理 要使用一个电子元器件,首先是要掌握它的电路原理图,来看一下单位数码管的电路原理图: 我们选择的是5611B型号的单位数码管 可以看到上面第一行的第一个图是正面的尺寸图 第一行的第二个图是侧面的尺寸图 第一行的第3个图是...
这节课,来学习如何控制双位数码管来显示时间的秒数。 电路原理 要使用一个电子元器件,首先是要掌握它的电路原理图,来看一下双位数码管的电路原理图: 关键看最下面的电路原理图 10号引脚和5号引脚,分别是数码管第一个数字和第二个数字的公共阳极。 如果要让数码管1的A管亮起来,需...
【作者】:0113-孙珂 ;0125-刁梦雅; 0135-钟文悦 1.发光LED 发光二极管(LED)是常见的显示器件,位于Diodes(二极管库)中,通常用于指示电子系统的工作状态,它有红、黄、绿等多种不同颜色,以及不同的大小(直径),还有高亮等型号,它们主要的差别在于外...
这次做的是用单片机控制数码管显示学号,比用纯数字电路简单方便了许多。相信会有更多的人能够顺利完成。 数码管的介绍: 其实数码管只是LED的一种有序组合,在忘记引脚排序的情况下可以用万用表的通断档来进行测量,从而区分出哪个引脚对应着数码管的哪段LED,同时也可以知道该数码管是...
【作者】:0123_刘春芝;0131_曹清华1、发光LED 2、7段数码管7段数码管主要分为BCD数码管,共阳极数码管及共阴极数码管三类。(1)BCD数码管 功能介绍:应用广泛,用于仿真电路中有关的数字显示使用说明:数码管下方连线遵从8421规则,从左到右依次为从高到低。在...
在1月7-8号的WEAIVR开启世界国际年会,我们广州分会场连同全国八大区一起共同开了一次年会。在这次年会中,我们迎来了一批伙伴,和我们一起度过了两天的绽放之旅。 这次年会两天《爱的智慧》课程由阿勋老师给我们讲解爱的科学,并且现场带领全体同学进行一对多互动心智升级体验。除此...
虽然这事不好的风气和事实,那就是在中国出去旅游要注意小心些,当然并不是说只有在中国是这样,到其他国家去就可以高枕无忧,而是说在中国确实要更加注意些。
首先一点,你是外来人,你没有当地的势力,你的方法和套路在那个地方不一定行得通,或者说基本行不通。吃了闷亏,你又能怎样去追...
缕缕轻烟 忽入眼帘 曲曲笛笛 不曾停歇 似诉衷肠 不为人见 似酌心怀 不许他粘 歇歇 歇歇 一曲调毕 燥声起 曲又复曲 婉转如崎 不曾停歇 似唱夕阳 不为人见 似抚内伤 调又复调 旋转如窑 又闻轻烟 渺渺扑鼻 带不走 回不去 不曾停歇 自在逍遥 留与不留 早已蜕现
想要变得更好是每个人在自己生活、工作清醒回顾总结自己的时候都会有的想法。 每个人为人处世的方式、受教育的程度、工作类别……等等这一切的一切都不能改变自己想要遇见更好的自己决心。 在生活中一般我碰到的有三种人: 有些人,做事之前。会把前前后后都模拟一遍后,在去有条理的做。这样...
清晨醒来,我翻了个身,竟不小心压到了我家小猫。小猫吓得尖锐地喵了一声,落荒而逃。临逃还不忘在我胳膊上抓了一道。可能是惊恐的力量太强大,被抓的地方流血了。有点疼,辣辣的疼,可是我不明白,我为何如此享受,像被挚爱爱抚了一般。不过想到连猫都欺负我,我心中莫名不爽。但看着伤口流出的...

我要回帖

更多关于 信息系统硬件资源估算 的文章

 

随机推荐