51单片机数码管,看这一篇就够了。

LED数码显示器的结构

对照表:点击跳转

由发光二极管显示字段组成,在单片机应用系统中通常使用七段LED数码管,根据LED的不同接法可以分为共阴和共阳两种。七段LED显示器中有八个发光二极管,其中从a-g管脚输入7位显示代码,可显示不同的数字或字符,Dp的构成小数点。
  共阴极数码管:将8个LED的阴极接到同一管脚上(开发板使用)
      段选端:0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00
        ( 0 1 2 3 4 5 6 7 8 9 熄灭)   
     共阳极数码管:将8个LED的阳极接到同一管脚上(BOX使用)
   段选端:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
        ( 0 1 2 3 4 5 6 7 8 9 熄灭)

共阴极LED显示器的公共端为发光二极管阴极,通常接地,所以另一端要接高电平才会产生电势差亮灯,即共阴极段选段要是高电平1才会被选中。

共阳极的LED显示器的公共端为阳极通常接+5V电源,所以另一端要接低电平才会产生电势差亮灯,即共阳极段选段要是低电平0才会被选中)。


编码方式:

共阴数码管段选端编码:0-9,A-F

 

关于数码管段选端:

单片机段码是按照:dp、g~a 这样排列的。比如:共阴极数码管数字1,它是0000 0110 其中bc是高电平1。需要特别注意数码管上的数字和平时手写的样式不一样,吸取教训。
|由于几个共阴/共阳数码管的段选端是连接在一起的,这样共同段选端引脚就导致,在几个数码管都插了电的同一时刻下,如果对段选端赋值,则几个数码管都会显示同一个数字,不可能显示多个数字。

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

关于数码管位选端:

LED 数码管是由发光二极管组成的,是单向导电,公共端是位控制(位选)端,共阳极就是LED 正极连接在一起,正极通常是高电平正电,所以需要高电平驱动,电流流向低电平的段控制端(段选),共阴极正好相反。
当你用箱子排线连接8个数码管的时候,写P24=P2^4; P24=0; 则表示我们让P24对应的数码管不被选中,所以只会亮另外的7个数码管。通电情况下,不另外编程对位选端赋值则默认位选端都是1被选中状态。
当你板子上电后,写P24=P2^4; P24=1; 则表示我们让P24对应的数码管不被选中,所以只会亮另外的3个数码管。通电情况下,不另外编程对位端赋值则默认位选端都是1b不被选中状态。
tip:箱子某个位选口接了线所以就意味着已经被选中了。而板子没有接线,也没法接线。所以默认情况下,都没有被选中。


Q:静态显示和动态显示在数码管上的显示特点?
A:
静态显示:同一时刻下,只能显示同一个数字。

查看代码
 //一个数码管上显示数字“1”
#include<reg51.h>
void main() {
	while (1) 
	{
		P2=0X7F;
		P0=0X06;
	}
}


动态显示:利用人眼视觉驻留效应,短暂的延时,选下一位的位选段,改变段选码。这样实现几个数码管在同一时刻显示不同的数字。

查看代码
 //钟表显示	不足一分钟就是显示00xx 显示分钟的就是显示两个0
//位选-段选    小延时   对段选清零    位选-段选
void ZB(unsigned char m,s)
{
	//分的显示
	P24=0;P25=P26=P27=1;    //特别注意:对每一位操作时,另外几个数码管要关掉位选端,否则另外那几个数码管保持上次的数字,且此时会被附同一个值。
    P0=SMG[m/10];
	delayms(70);
	P0=0X00;

	P25=0;P24=P26=P27=1;
	P0=SMG[m%10];
	delayms(70);
	P0=0X00;	
	//秒的显示
	P26=0;P24=P25=P27=1;
	P0=SMG[s/10];
	delayms(70);
	P0=0X00;

	P27=0;P24=P25=P26=1;
	P0=SMG[s%10];
	delayms(70);
	P0=0X00;
}

其实我一向觉得P24=0;P25=P26=P27=1;这样位选  很低级,直接串口整体的方法P24,则写0XEF不就好了,还少些这么多字。但是我发过一篇博客点击跳转,就是关于这样整体定义然后出现的问题都自己检查不出来的情况,并不是检查不出来,就是在理论上写得一点毛病都没有,但是就是有问题能通过编译但是达不到效果。所以只有这样老老实实的写。

Q:动态显示的时候,写下一个数码管的时候要不要屏蔽另外几个,还是说也不用关?
A:必须关,否则就是同一时刻这几个管子都显示对目标数码管赋的段码了。
例如:
不屏蔽另外的数码管 位选端的情况:

查看代码
//P24显示1 P27显示2 
#include<reg51.h>
 sbit P24=P2^4;
 sbit P27=P2^7;
 char SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
 void main(){
 while(1){
  	unsigned char i=0;
	P24=0;    //P27=1;    //不关闭其他位选端
	P0=SMG[1];
	for(i=0;i<70;i++);
	P0=0X00;

 	P27=0;     //P24=1;    //不关闭其他位选端
	P0=SMG[2];        
	for(i=0;i<70;i++);
	P0=0X00;
 	}
 }
//总结:运行过程是,P24开启位选端了,然后对P0赋值数字1的段选码,并让这个数字稳定70us,然后关闭段选码,使数码管灭;
//        其次,P27=0,P27开启位选端了,但是此时并没有关掉P24对吧,所以数字2的段选码都同时赋给了这两个管子,此时两
//        个管子都稳定延时70us显示数字2;
//        开始第二轮循环,此时P24=0;即P24这个管子被选中,并赋值数字1,但是并没有关掉P27的位选码对吧,所以此时两个数码管同时显示1。
//        由于代码执行是us秒级别,所以我们会看到两个管子同时显示1,且同时显示2的情况,这种现象不是我们期望的。
//        另外,由于代码执行是us秒级别,P0=0X00;管子灭的时候你眼睛也是看不出来的。
//        所以我们写动态显示的时候 务必记得同时刻屏蔽不需要的管子位选端,不要造成乱码的情况

板子效果:

关闭其他位选端:

查看代码
 //P24显示1 P27显示2 
#include<reg51.h>
 sbit P24=P2^4;
 sbit P27=P2^7;
 char SMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
 void main(){
 while(1){
  	unsigned char i=0;
	P24=0; P27=1;    //关闭其他位选端
	P0=SMG[1];
	for(i=0;i<70;i++);
	P0=0X00;

 	P27=0; P24=1;    //关闭其他位选端
	P0=SMG[2];        
	for(i=0;i<70;i++);
	P0=0X00;
 	}
 }
//总结:运行过程是,P24开启位选端 并 屏蔽关闭P27,然后对P0赋值数字1的段选码,并让这个数字稳定70us,然后关闭段选码,使数码管灭;
//        其次,P27=0;P24=1;P27开启位选端 并 屏蔽关闭P24,此时仅仅数码管P27显示数字2,稳定延时70us后,P0=0X00;管子灭。
//        然后第二轮循环,P27被关闭,P24被选中,并赋值数字1的段选码,此时仅仅P24显示数字1,P27不被选中且是灭的状态。
//        .....
//        从而达到稳定的P24显示1,P27显示2状态

板子效果:


Q:静态显示和动态显示在硬件连接上的特点,实际应用中怎么选择?
A:静态显示是指使用数码管显示字符时,数码管的位选端恒定共阴极或共阳极。将每个数码管的 8 个段选端分别与单片机的一个 8 位 I/O 端口相连(就是全都连起的)。动态显示电路通常是将所有数码管的 8 个段选端分别并联起来,仅用一个并行 I/O 端口控制;各位数码管的位选端,由另一个 I/O 端口控制。 在实际应用时,当显示位数2位及以上时,采用动态显示方式。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码实例:

效果:

Q:为什么会造成这成这种乱位拖影现象?

A:动态显示数码管通常要消影,就是消除在其他位上的影子。因为数码管显示过程:位选 段选  位段选 。  在第一次段选完成之后和下一段选之后(下一位选还没选之前),下一位的段码是上一轮的段码 。通俗点语言讲就是,太快了,还忘不了前任。所以我们要做个上一轮的段码清零操作,清零之前记得加一个小延时让它稳定显示,立即清零会导致数码管比较暗。

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  另外注意,箱子的排线一定要注意正反:红的下面 另一端红的也是在下面

板子是共阴的  箱子是共阳。 板子不另外赋值的情况下,因为没有插电(插线),各个位选口默认是1;
箱子如果用排线把公共端(位选口)连接起,不另外赋值的情况下,默认是1
Q:我想知道箱子 如果用单线连接某个位选口,如果用代码对另外一个位选口赋值0,可不可以实现选中。
A:不行哦。箱子某个位选口接了线所以就意味着已经被选中了。而板子没有接线,也没法接线。所以默认情况下,都没有被选中。

Tips:十六进制中的C是1100 D是1101 E是1110 F是1111

 

部分内容转载:https://zhuanlan.zhihu.com/p/549198999

posted @   iZJ"Qq4577105  阅读(3612)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示