新手:怎样让数码管显示程序2个不同的数字

3567人阅读
转自我的博客:
数码管,其实就是8个发光二极管按顺序排列而成的,所以让数码管显示特定的数字,只需要将该亮的二极管点亮,不该亮的灭了就好了。为了达到这个目的,就得参考电路图了,51HEI开发板的电路图在我的相册里有,但是整张贴出来就太大了,所以这里只显示部分。电路图如下:
乍一看这张图比较明显的就是最左边的单片机和两个锁存器U1和U2的引脚信息了,从D00到D07,两个锁存器是共用的,D00对应输出Y1和X1,D07对应输出Y8和X8。锁存器,从它的名字大概就可以知道它的用途了!其作用就是有的引脚输入改变的时候输出保持之前的状态,达到锁和存的效果(我目前的理解是这样的,不理解的可以上网搜官方解释)。查查74HC573是怎么用的,表格如下:
图中引脚1代表输出使能,11引脚代表锁存使能。锁存器嘛,打开锁存,让输出使能引脚处于低电平,锁存使能引脚输入高电平,传入对应的D,然后再使锁存使能引脚处于低电平,这样就能让输出保持不变。使用的过程就是打开锁,传数据,关锁保持。
说完了锁存器,回到第一张电路图,途中的锁存器1号引脚都接地,自然是低电平,11号引脚分别对应单片机的D26和D27,所以控制U1和U2就靠这2个引脚啦!
按道理说,8个数码管,应该有8*8=64根线才对啊,而第一张图中只有24个引脚,里面肯定有复用的引脚,所以不知道内部电路是没办法写滴,还好51HEI给的资料比较全。
2个LED管的内部电路如下:&
& & & &ABCDEFG &DP总共8个二极管,分别由11、7、4、2、1、10、5、3引脚控制,而1这8个引脚对应第一个图中的Y1到Y8,12、9、8、6呢则有两组,一组是共阴极的数码管,一组是共阳极的数码管。12、9、8、6呢则对应X1到X8,有2个,一组是X1到X4,一组是X4到X8,X1到X4是共阴极的,X5到X8是共阳极的。本实验只让共阴极的DIG1那个数码管显示数据,把别的都关掉。那只要12(X1)引脚输入低电平,986输入高电平,其他的都不会亮了,让DIG1显示什么数字,就由Y1到Y7来决定了。
经计算,让DIG1显示0到9还有小数点的表格如下:
table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80
最终代码如下:#include
typedef unsigned char uint8;
typedef unsigned int
D24 = P2^4;
D25 = P2^5;
U1 = P2^6;
//U1锁存器的开关
U2 = P2^7;
//U2锁存器的开关
table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80
void main(void)
uint8 counter = 0;
uint8 offset = 0;
TH0 = 0x3C;
TL0 = 0xB0;
TMOD = 0x01;
//计时模式选01模式
//关闭8X8点阵LED
if(TF0==1)
//每次计时是50ms,达到50ms后计时器0的溢出位位1,进行软件清零和计时器初始化.
counter++;
TH0 = 0x3C;
//12MHZ的晶振算出来是从15536开始计时,十六进制就是 0x3CB0
TL0 = 0xB0;
//高位取0x3C,低位取0xB0
if(counter==20)
//20*50ms=1000ms=1s
counter=0;
P0 = table[offset++];
if(offset==11)
offset = 0;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:68762次
积分:1084
积分:1084
排名:千里之外
原创:38篇
评论:12条
(1)(3)(1)(3)(1)(2)(23)(5)(2)(1)3个数码管同时显示,2个不是很亮,一个亮。怎么解决呢?|我爱单片机 - 数码之家
查看完整版本: [--
赞助商链接
#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit duan=P1^0;uchar m,n;uchar code xianshi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};&&&&&&&&&&&&&&&&&&&&&&//段码控制uchar code weixuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};&&&&&&&&&&&&&&&&//位码控制void delayms(uchar a){&&&&uchar b,c;&&&&for(b=0;b&a;b++)&&&&{&&&&&&&&c=10;&&&&&&&&while(c--);&&&&}}void AD_liang(uchar a){&&&&&&&&&&&&P1=0&&&&&&&&&&&&&&&&&&&&duan=1;&&&&&&&&P3=xianshi[a]|0x80;&&&&&&&&duan=0;&&&&&&&&delayms(5);}void AD_liang1(uchar b){&&&&&&&&&&&&P1=0&&&&&&&&&&&&&&&&&&&&duan=1;&&&&&&&&P0=xianshi;&&&&&&&&duan=0;&&&&&&&&delayms(5);}void AD_liang2(uchar c){&&&&&&&&&&&&P1=0&&&&&&&&&&&&&&&&&&&&duan=1;&&&&&&&&P0=xianshi[c];&&&&&&&&duan=0;&&&&&&&&delayms(5);}void Timer0(){&&&&TMOD=0x01;&&&&TH0=0x3c;&&&&TL0=0xb0;&&&&EA=1;&&&&TR0=1;&&&&ET0=1;}void main(){&&&&uchar m1=195;&&&&uchar a,b,c;&&&&Timer0();&&&&&&&&&&&& &&&&while(1)&&&&{&&&&&&&&if(n==1)&&&&&&&&{&&&&&&&&&&&&n=0;&&&&&&&&&&&&m1++;&&&&&&&&&&&&if(m1==202)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&m1=195;&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&&&&&&&&&a=m1/100;&&&&&&&&AD_liang(a);&&&&&&&&b=m1%100/10;&&&&&&&&AD_liang1(b);&&&&&&&&&&&&&&&&&&&&c=m1%10;&&&&&&&&AD_liang2(c);&&&&&&&&&&&&&&&&&&&&}}void Timer0_interrupt(void)interrupt 1{&&&&TH0=0x3c;&&&&TL0=0x0b;&&&&m++;&&&&if(m==20)&&&&{&&&&&&&&m=0;&&&&&&&&n=1;&&&&}}P1接位选P3段选不知道为啥,a,b亮的不明显,c很亮~我感觉是不是我延时程序不对,但是修改很多,都不对。希望大家帮我解决一下。
赞助商链接
略测试了一下,应该是元件连接问题AD_liang1函数中的参数未使用
赞助商链接
请在数码管段码端串联阻值相同的限流电阻,请加入数码管消影程序
程序逻辑的问题,简单说就是前两个数字显示占的时间比较短,最后一个占的时间长你的main中是这样循环的1. 一段比较复杂的处理或说是延时(没仔细看)2. 点亮第一个数码管3. 延时4. 点亮第二个数码管5. 延时6. 点亮第三个数码管7. 延时8. 回到1有没有发现第三个点亮的周期要比前两个多的多?解决办法,用定时器扫描,力求三个数码管点亮时间比例一致
楼主的程序里,屏显扫描并没有规定确切的扫描时序,a和b能正常按顺序扫描,到c以后就出现问题了,是返回大循环还是继续停留一会,这存在不确定因素,先不考虑其它吧,最起码要写个收尾,就是c扫描完以后,在写一个与上面格式相同,语句数量相同的消隐函数,只是这个函数里位写1,段写0,相当于原来扫描ABC,现在再加一句D.
点亮完C后,再加一句,送一个不让数码管亮的程序,然后延时一会儿,就可以了, 后面就是回到A继续循环扫描显示
第一个问题:AD_liang1里应该是P0=xianshi;,第二个,在三个AD_liang函数delayms后面加上P1 = 0xFF;编辑:擦,【b】显示不出来,那楼主恐怕也没有第一个问题了
查看完整版本: [--
Powered by
Time 0.079331 second(s),query:5 Gzip enabled21ic官方微信-->
后使用快捷导航没有帐号?
查看: 2688|回复: 4
新手求教另一种让两个以上数码管同时亮的方法
&&未结帖(15)
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
#include&reg52.h&
#include&intrins.h&
#define uint&&unsigned int
#define uchar unsigned char
uchar aa=0,bb,temp,
uchar code table[10]=& && && &
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};& & //亮什么
uchar code W[8]= {0,1,2,3,4,5,6,7};& && && && && && && &//谁亮
void delay(uint x);& && && && && && && && && && &&&
void main()
& &&&P0=0x00;& && && && && && && && && && && && && && &//先把所有数码管灯熄灭
& &&&while(1)
& && &&&P1=0& && &//控制第一列按键让第三个数码显示相应数字,出现问题:在后面有控制第二列按键的程序
& && &&&temp=P1;& && &//如果先按下第一列的某一按键,则之后在按第二列的就没用,只保留第一列出现的数字。
& && &&&temp=temp&0xf0; //同理,先按下第二列效果同上。想请教一下大家,这个应该怎么改才& && && && && && && &
& && &&&while(temp!=0xf0)&&//能在按下第一列后,显示相应的数字,并且在按下第二列的数字后,也显示&&
& && && &&&{& && && && && &//相应的数字,且两个数字皆保留呢?
& && && && &delay(5);
& && && && &temp=P1;
& && && && &temp=temp&0xf0;
& && && & while(temp!=0xf0)& &
& && && && &{
& && && && && & temp=P1;
& && && && && & switch(temp)
& && && && && && &&&{
& && && && && && && && &case 0xee:num=1;
& && && && && && && && && &
& && && && && && && && &case 0xde:num=5;
& && && && && && && && && &
& && && && && && && && &case 0xbe:num=3;
& && && && && && && && && &
& && && && && && && && &case 0x7e:num=4;
& && && && && && && && && && &
& && && && && && &&&}
& && && && && & P2=W[2];
& && && && && & P0=table[num];
& && && && & }
& && &&&P1=0& && && && && && && && && && && &/*这一段控制第二列按键
& && &&&temp=P1;& && && && && && && && && && && && &让第四个数码管亮*/
& && &&&temp=temp&0xf0;
& && &&&while(temp!=0xf0)& &
& && && &&&{& &
& && && && &delay(5);
& && && && &temp=P1;
& && && && &temp=temp&0xf0;
& && && & while(temp!=0xf0)& &
& && && && &{
& && && && && & temp=P1;
& && && && && & switch(temp)
& && && && && && &&&{
& && && && && && && && &case 0xed:num=1;
& && && && && && && && && &
& && && && && && && && &case 0xdd:num=5;
& && && && && && && && && &
& && && && && && && && &case 0xbd:num=3;
& && && && && && && && && &
& && && && && && && && &case 0x7d:num=4;
& && && && && && && && && && &
& && && && && && &&&}
& && && && && & P2=W[3];
& && && && && & P0=table[num];
& && && && & }
& && &&&}& && && && &
void delay(uint x)
& & uint i,j;
& & for(i=500;i&0;i--);
& & for(j=x;j&0;j--);
本帖子中包含更多资源
才可以下载或查看,没有帐号?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
助理工程师, 积分 1795, 距离下一级还需 205 积分
助理工程师, 积分 1795, 距离下一级还需 205 积分
主题帖子积分
专家等级:结帖率:66%
主题帖子积分
助理工程师, 积分 1795, 距离下一级还需 205 积分
助理工程师, 积分 1795, 距离下一级还需 205 积分
扫描函数,包含在按钮延时确认函数中即可。
有按钮按下?& &否 -& 扫描显示
右按钮按下?&&否 -& 扫描显示
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
谢谢你啊,不过还是有些不明白啊
第一步中,否定之后,扫描显示是扫描哪些东西? 而且这个单片机控制那些数码管亮时是一个一个控制的,无法同时打开多个数码管。这块我觉得挺棘手的。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 27, 距离下一级还需 23 积分
实习生, 积分 27, 距离下一级还需 23 积分
[谢谢你啊,不过还是有些不明白啊
第一步中,否定之后,扫描显示是扫描哪些东西? 而且这个单片机控制那些数码管亮时是一个一个控制的,无法同时打开多个数码管。这块我觉得挺棘手的。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 821, 距离下一级还需 179 积分
高级技术员, 积分 821, 距离下一级还需 179 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
高级技术员, 积分 821, 距离下一级还需 179 积分
高级技术员, 积分 821, 距离下一级还需 179 积分
是一个个控制的,如果速度购快,人眼分辨不出来,比如5ms点亮一位,人眼看了就像同时点亮的
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
社区建设奖章
等级类勋章
湍急之河流
发帖类勋章
技术奇才奖章
人才类勋章
希望之星奖章
等级类勋章
时间类勋章
技术高手奖章
人才类勋章
热门推荐 /4}

我要回帖

更多关于 数码管显示原理 的文章

更多推荐

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

点击添加站长微信