51单片机第三篇章-数码管

数码管是什么,在哪里,效果如何?

 

数码管就是这些  单片机中的位置  数码管可以用来显示数字(包括小数),实现流水灯式数字显示,时间(需结合时钟、中断等模块,后续补充)

数码管内部电路

 

 数码管的一个数字-对应八个电位-abcdefgh对应01234567L口

如上图所示,abcdefgh按照电平可组合显示出数字

那这电平应该也是高电平吗

其实不是,显示数字,肯定是同电位的组合合成,而数码管的构造,是有共阳极和共阴极结构之分(下图所示)
若共阳,则8个端的一侧连接vcc,另一侧连接相应的输入端,若输入低电平,则为亮,高电平为暗(不显示)
反之,若共阴,则8个端的一侧接地,另一侧连接相应的输入端,若输入高电平,则为亮,低电平为暗(不显示)
那是哪种结构呢,要看开发板,芯片配置,使用手册。

这里用的51开发板的数码管为共阴极结构

那驱动的整体结构呢

如下,在这里谈及两个知识点,一个叫段选,一个叫位选。段选指的是一个数字使用了abcdefgh哪些个;位选指的是选了那些位。
如何实现段选,这里用到的是74HC245。值得注意的是,由于芯片引脚只有32个,那么不可能8*8=64个都有相应的引脚输入端。这里可见,指定的是8个位的a,b,c,d...都连接到同一个引脚输入端上,比如把b亮,那么八个为的a都会亮
那么为什么驱动时只有一个数字,那是因为位选的原因

 

如何实现位选,这里用到的是74HC138(三八译码器)
三八译码器,能够实现三个口控制8个输出效果,数码管用此节约引脚占用的条件来设置位选
其输出低电平有效:输入111则输出8端会为0--有效(这里开发板第一个就是8端对应的位)
这里解释亮a而只显示一个数字,因为三八译码器,默认三输入为上拉电阻,所以默认为1,1,1---所以输出8口为输出低电平有效。其他都为1无效所以不亮。

                ​​​​​​​        

 

 

数码管编程实现

亮一个数字

 

 P0=0x6F;

一个位从0到f一直循环

#include <REGX52.H>
#include "Delay.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define SMG_A_DP_PORT P0
u8 i;
u8 gsmg_code[16]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
   0x39,0x5e,0x79,0x71
  };

void main() {
for(i=0;i<16;i++)
{
SMG_A_DP_PORT= gsmg_code[i];
Delay(500);
}
}

8位-01234567

 

 主函数

#include <REGX52.H>
#include "smg_display.h"
void main() {
while(1) {
	smg_display();
}
}

核心函数-位选段选执行

原理:for循环-Switch(i)-控制位选--同时赋予数字--延时控制+消隐
#include <REGX52.H>
#include "Delay.h" 
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;  
#define SMG_A_DP_PORT P0
unsigned char gsmg_code[17]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
       0x39,0x5e,0x79,0x71
  };
void  smg_display() {
 unsigned char i=0;
 for(i=0; i<8; i++) {
  switch(i) {
//LSA-B-C是指第几个数码管
//case对应了上面显示上面数字
   case 0:
LSA=1;
LSB=1;
LSC=1;
break;
   case 1:
LSA=0;
LSB=1;
LSC=1;
break;
   case 2:
LSA=1;
LSB=0;
LSC=1;
break;
   case 3:
LSA=0;
LSB=0;
LSC=1;
break;
   case 4:
LSA=1;
LSB=1;
LSC=0;
break;
   case 5:
LSA=0;
LSB=1;
LSC=0;
break;
   case 6:
LSA=1;
LSB=0;
LSC=0;
break;
   case 7:
LSA=0;
LSB=0;
LSC=0;
break;
  }
  SMG_A_DP_PORT=gsmg_code[i];
  Delay(1);//为什么,因为用到了余晖效应,即整一个周期(一个while里)当执行周期不超过50ms,则会保持看上去没有重新执行的效果,明明2已经设置了,但1看上去还是亮的;而每一个位设置值后,Delay(1)能使得相隔极小确保总体小于50ms
  SMG_A_DP_PORT=0x00;//消影,也是由于余晖效应,不会让数字暗下来
 }
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值