俩个数码管显示原理交替显示,我这么写哪里错了,编译可以,但数码管显示原理不亮

展开全部下一篇:说到led数码管,相信很多人都不会特别的陌生,在现在的生活中,我们都可以看到led数码管的存在。深圳市芯斯美电子有限公司这一led数码管生产厂家位于深圳宝安恒明珠科技工业园,主要生产LED数码管、发光二极管、点阵模块等,LED数码管是其led数码管屏在我们的日常生活中经常看见,它主要用于广告招牌、酒吧、夜总会、楼宇亮化等场合。led数码管屏在我们的日常生活中经常看见,它主要用于广告招牌、酒吧、夜总会、楼宇亮化等场合。随着科技的进步和信息的发展,现在除了智能手机比较吃香的电子产品之外,还有接下来我们会介绍到的数码相机,因为现在的年轻一族,特别喜欢来拍照,无随着科技的进步和信息的发展,现在除了智能手机比较吃香的电子产品之外,还有接下来我们会介绍到的数码相机,因为现在的年轻一族,特别喜欢来拍照,无现在我们在生活中常见到的水管就是采用我们今天要介绍的cpvc电力管的。cpvc电力管是采用一种名为PVC-C树脂制作出来的。导语:在我们的生活中我们经常可以看到一些发光的广告招牌,或者发亮的高楼大厦,小伙伴们知道这些都是怎么做到的吗?我们走在街上,经常能够看到一些施工现场,这些施工,要不然是在地下要不然就在空中。怎么把苹果手机信号变成数字?介绍一苹果手机从IOS7开始,iphone的信号图标就变成了小白点,不过可以把图标变成直观的数字显示。13:47 提问
下面是我写的代码,为什么数码管一直显示1?哪里写错了吗?
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^0;
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
void shuma0()
weixuan=1;
//把位选全部打开,使8个数码管都能亮
weixuan=0;
duanxuan=1;
duanxuan=0;
void shuma1()
weixuan=1;
//把位选全部打开,使8个数码管都能亮
weixuan=0;
P0=0x00;++
duanxuan=1;
duanxuan=0;
void delay(uchar i)
while(i--);
void main()
delay(20);
delay(10);
delay(10);
按赞数排序
因为单片机的端口的初始化为高电平,由sbit DQ=P1^0;可知上面的程序中DQ=1,因此会一直运行shuma1();这就是为什么会一直显示“1”的原因了。
DQ一直不变啊,所以 main() 里面的 while 循环一直执行 shuma1()。
不是加了一个if判断语句了吗?怎么一直不变,该怎么改才好?
系统卡在shuma1函数中的while(1)中了。看你要写成什么样子,一般没有这样的写法的。
其他相关推荐怎样用keil编写4位数码管显示1234的程序
我的图书馆
怎样用keil编写4位数码管显示1234的程序
为了帮助网友解决“怎样用keil编写4位数码管显示1234”相关的问题,中国学网通过互联网对“怎样用keil编写4位数码管显示1234”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:怎样用keil编写4位数码管显示1234的程序,具体解决方案如下:解决方案1: 你具体哪一步不会呢。 追问: 我就是不懂编程,老师让我们做4位LED数码管动态显示设计,用Keil和protues两个软件 回答: keil是汇编软件生成hex文件,然后加载到proteus里面就可以仿真了。你是不懂代码怎么写呢,还是不会用软件呢 追问: 两个软件都差不多会用了,就是不会写那个程序,你能不能帮帮我呢? 回答: /***************************************************************************标题:&数码管的显示效果:&显示1234,从这个例子可以学习多位数码管的动态显示技术******************************************************************************///头文件:#include 'reg51.h'//变量定义:unsigned char table[]=&&&{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&&&&&//表:共阳数码管 0-9 //引脚定义:&&sbit SMG_q = P1^0;&//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;&//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2;&//定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;&//定义数码管阳级控制脚(个位)//函数声明:void delay(void); //延时子函时//主函数,C语言的入口函数:&&void main(void)& {&unsigned char i=0;&//作为查表的索引号&while(1)&&&//不停的循环扫描,不扫描则不显示或显示不正确,即为动态显示,&{&//数码管显示 1234,可自行修改&&SMG_q=0;&&//选择千位数码管&&P0=table[1];&//查找'1'定义好的数码管段值与P0口输出,显示相应的1&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_q=1;&&//关闭千位数码管&&SMG_b=0;&&//选择百位数码管&&P0=table[2];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_b=1;&&//关闭百位数码管&&&&SMG_s=0;&&//选择十位数码管&&P0=table[3];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_s=1;&&//关闭十位数码管&&SMG_g=0;&&//选择个位数码管&&P0=table[4];&//查找'2'定义好的数码管段值与P0口输出,显示相应的2&&delay();&&//加入短暂延时&&P0=0XFF;&&//清除数码管显示,因是共阳型,所以不是0&&SMG_g=1;&&//关闭个位数码管&}}//延时子函数,短暂延时void delay(void){&&&unsigned char i=10;&while(i--);} 追问: 额,我在那个Keil软件里就写这个吗?全部都要写吗? 回答: 恩,不清楚再问我。 追问: 后面的中文注释也要输进去啊,那我是不是可以直接复制啊? 回答: 后面的中文是注释,不参加编译,只是为了你看着方便。你全部复制下来,一个字都不用改的。不清楚再问我 追问: 我能不能加一下你的QQ啊,我好像有好多问题的,怕说不清楚,拜托啦 回答: 看来你的C语言也没学好。 追问: 就是没学过啦,老师都让我们自学呢,可是我又比较笨啊,额,帮帮忙啦,加一下QQ啦,我不会骚扰你的啊 回答: 留下你的,我加你吧 追问: 太感谢你啦,我的QQ是 解决方案2: 这是用C编的:共阴数码管#include&reg52.h&#define uint unsigned int#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;uint temp=1234;uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71} ;void play(uint);void delay(uint);void main() {while(1) {play(temp); }}void play(uint temp){dula=1;P0=table[temp/1000];dula=0;P0=0 wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[temp%];dula=0;P0=0 wela=1;P0=0wela=0;delay(5);dula=1;P0=table[temp%];dula=0;P0=0wela=1;P0=0wela=0;delay(5);dula=1;P0=table[temp%10];dula=0;P0=0wela=1;P0=0wela=0;delay(5);}void delay(uint z){uint x,y;for(x=z;x&0;x--)for(y=110;y&0;y--);}解决方案3: 刚刚认识keil软件怎么学才能学的好哦。。 有什么好书货好资料推诚下吗。 谢谢。 通过对数据库的索引,我们还为您准备了:问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:#include #include sbit wei=P1^0; sbit duan=P1^1; int w[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; int i, void main() { TMOD=0X01; TH0=()/256; TL0=()%256; EA=1; ET0=1; TR0=1; tt=0; i=0; temp...===========================================问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:很难么?有没有解码器哦,没解码器,用程序来解码。共阴还是共阳。基础还是得你自己去学习。===========================================问:尽量给代码 我是初学者 还有不懂的那些硬件的接法 解读器 还有数码管怎...答:MOV 31H,#01H MOV 32H,#02H MOV 33H,#03H MOV 34H,#04H MOV 35H,#05H MOV 36H,#06H ACALL D0 JMP $-2 D0: MOV R0,#31H MOV R2,#B MOV DPTR,#TAB D1: ORL P1,#B MOV A,@R0 MOVC A,@A DPTR MOV R3,#8 D2: RLC A MOV P3.2,C SETB P...===========================================问:我写的程序如下,第一行四个键盘,摁了没用,数码管没反应,其他的12个...答:第一行四个键盘,摁了没用,数码管没反应, ---- 是 1234 这四个按键吗? 程序,太长。 四行按键的程序,好像都是雷同的,应该没有什么问题。 键盘,是自己焊接的吗? 是不是某一个引脚,虚焊?===========================================问:#include&reg51.h& //#include&INTRINS.H& unsigned char a,b,c,d; unsi...答:/***************显示子程序**********************/ void display(unsigned char bai,unsigned char shi,unsigned char ge,unsigned char xs) { P3=dispbitcode[0]; P0=dispcode[bai]; //显示佰位 delay(5); P3=dispbitcode[1]; P0=dispcode[sh...===========================================问:#include&reg51.h&sbit a=P3^0;sbit b=P3^1;sbit c=P3^2;sbit d=P3^3;un...答:#include sbit a = P3^0; sbit b = P3^1; sbit c = P3^2; sbit d = P3^3; unsigned char code dcode[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay1ms(unsigned int x) { while(x--) for (j = 0...===========================================问:三个按键分别为开始、暂停、加\减。当系统复位后,初试时间为00.00.00,...答:我可以写C语言程序,名是联系 方式===========================================问:让89处1单片机驱动四位数码管,显示 1234.求电路图及程序!!!急!!!...答:下列程序经过实验,可以满足题目要求. ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV 70H, #04H MOV 71H, #03H MOV 72H, #02H MOV 73H, #01H ;------------------------------- M_LOOP: LCALL DISP AJMP M_LOOP ;------------------------------- DI...===========================================很难么?有没有解码器哦,没解码器,用程序来解码。共阴还是共阳。基础还是得你自己去学习。===========================================里边存放数码管显示0~9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数()分解成4哥单个数,然后依次选择要显示的数码管和数据,紧...===========================================希望对你有帮助!呵呵俺又来了怎么还没有调试好呀俺来帮你调试吧 先看看错误的现象:是不是笔画混乱要显示1却显示的好像是8呀===========================================呵呵 俺又来了 怎么还没有调试好呀 俺来帮你调试吧 先看看错误的现象: 是不是笔画混乱 要显示1 却显示的好像是8呀=========================================== MAIN: MOV DPTR, #TABLE MOV R0, #00H MOV R1, #01H START: MOV A, R0 MOVC A, @A DPTR MOV P2, A MOV P1, R1 MOV A, R1 RL A MOV R1, A C...=========================================== n2=N/100%10; n3=N/10%10; n4=N%10; P1_0=0; //P1_0 P1_1 P1_2 P1_3分别为四位的位选,P0为断选, P0=table[n1]; //table为数码管八...===========================================方法一:两个HD7279,正好可以驱动16个数码管,电路简单,不占单片机资源 方法二:74HC154译码扫描,或者两个P口扫描,需要16个三极管驱动或者两片ULN2003之类的,比较占用...===========================================是显示问题,和DS18B20无关。你先做一个简单的四位数码管显示,如显示1234,可以了再找测温程序 的问题。===========================================这是可以的,分别让两个四位数码管显示四位数,合在一起就是八位数。原理:两个四位数码管的数据针脚分别相连后,与P0口相连;位选针脚分别与P3口相连,这样就实现了用两个...=========================================== dis_buf[5]=350.5/100; //得出百位3 count=350.5%100;//得出余数50.5 dis_buf[6]=50.5/10; //得十位 dis_buf[7]=50.5%10; //得余数0.5 dis_buf[8]=0.5/1; //得个位0 dis_buf[8]=0.5%...===========================================
猜你感兴趣:
淘宝热门折扣推荐:
TA的最新馆藏
喜欢该文的人也喜欢树莓派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为主。
源代码下载}

我要回帖

更多关于 数码管显示程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信