历史上的今天
返回首页

历史上的今天

今天是:2025年03月15日(星期六)

2020年03月15日 | 51单片机【三】静态与动态驱动数码管

2020-03-15 来源:eefocus

数码管结构及分类


数码管是发光器件之一,内部由七个条形发光二极管(a,b,c,d,e,f,g)和一个小圆点发光二极管(dp)构成,51单片机开发板上为八段数码管,如下图所示,根据各段的组合不同,显示的字符也就不同。

按八个数码管的公共端接线不同,数码管又可分类为共阴极数码管和共阳极数码管两种。共阴极数码管的公共端接地,而共阳极数码管的公共端接电源,接线如下图所示(左为共阴极,右为共阳极)。当连接的单片机接口为高电平时共阴极数码管亮;反之,连接的接口为低电平时则共阳极数码管亮。

void DigDisplay(void)

{

unsigned char i = 0;

 

// 首先确定位码,选中最左侧数码管,注意查38译码器的真值表,gagbgc为38译码器的ABC端口

gA = 0;

gB = 0;

gC = 0;

// 依次显示0-F

for (i=0; i<16; i++)

{

DIG_PORT = gDuanMa[i];/*这个数组已经定义16个元素对应0-f的段码,DIG_PORT是共阴极数码管段码经74HC573接P0端口*/

//Delay();

delay800ms();

J6是一个跳线 当接LE和P10时可以通过软件调节P10电压从而影响LE从而影响数码管的效果(设置这个主要是因为p0会接入多个原件) 而接VCC始终保持高电压

上面是38译码器简单点说就是输入三个信号输出八种信号,因为三种0或1可以有八种组合

上面是74HC573是将电压放大使二极管发亮强度更大,逻辑上并不存在。


上面是38译码器的真值表可以通过查找此表判断输入那三个值使8个led中的那个亮

驱动过程是这样的


1.选择哪一组led亮(同一时间只有一组LED会亮)


使用38译码器选择一组led灯使之一侧电压为低 其他全部为高


2.使这组显示确切的数字


从CPU引脚到73再到数码管 给的全是高电压因此只有选中的那组可以亮 下面通过p0端口将段码输入产生确切的高低电压使每颗正确的led发光出确切的数字 


下面是动态驱动数码管


其基本原理不变 本质上也是一个一个去点亮数码管 但是运用了人眼的视觉暂留 导致视觉上看是始终存在的


void DigDisplay1(void)

{

// 第1个数码管上显示1

gA = 1; gB = 1; gC = 1; // 位选第1个数码管

DIG_PORT = gDuanMa[1]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第2个数码管上显示2

gA = 0; gB = 1; gC = 1; // 位选第2个数码管

DIG_PORT = gDuanMa[2]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第3个数码管上显示3

gA = 1; gB = 0; gC = 1; // 位选第3个数码管

DIG_PORT = gDuanMa[3]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第4个数码管上显示4

gA = 0; gB = 0; gC = 1; // 位选第4个数码管

DIG_PORT = gDuanMa[4]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第5个数码管上显示5

gA = 1; gB = 1; gC = 0; // 位选第5个数码管

DIG_PORT = gDuanMa[5]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第6个数码管上显示6

gA = 0; gB = 1; gC = 0; // 位选第6个数码管

DIG_PORT = gDuanMa[6]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第7个数码管上显示7

gA = 1; gB = 0; gC = 0; // 位选第7个数码管

DIG_PORT = gDuanMa[7]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

 

// 第8个数码管上显示8

gA = 0; gB = 0; gC = 0; // 位选第8个数码管

DIG_PORT = gDuanMa[8]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

}

 

 

 

消隐的原因是当程序在执行位选下一个数码管时但是传输的还是上一个数码管的段码导致在显示上会闪动一下


void DigDisplay2(void)

{

u8 i;

 

for (i=0; i<8; i++)

{

switch (i) //位选,选择点亮哪个数码管

{

case 0:

gA = 1; gB = 1; gC = 1; 

break; //显示第0位

case 1:

gA = 0; gB = 1; gC = 1; 

break; //显示第1位

case 2:

gA = 1; gB = 0; gC = 1; 

break; //显示第2位

case 3:

gA = 0; gB = 0; gC = 1; 

break; //显示第3位

case 4:

gA = 1; gB = 1; gC = 0; 

break; //显示第4位

case 5:

gA = 0; gB = 1; gC = 0; 

break; //显示第5位

case 6:

gA = 1; gB = 0; gC = 0; 

break; //显示第6位

case 7:

gA = 0; gB = 0; gC = 0; 

break; //显示第7位

default:

break;

}

DIG_PORT = gDuanMa[i+1]; // 发送段码

delay1ms(); // 间隔一段显示时间

DIG_PORT = 0x00; // 消隐,注意不要漏掉了

}

}

推荐阅读

史海拾趣

Adam Tech公司的发展小趣事

随着电子行业的快速发展,Adam Tech意识到只有不断创新才能在激烈的市场竞争中立于不败之地。因此,公司加大了对研发的投入,不断推出具有创新性的电子连接器产品。同时,公司还积极拓展产品线,从最初的插头、插座逐渐扩展到线束、端子、电缆组件等多个领域。这些举措不仅提升了公司的市场竞争力,也为客户提供了更加丰富的选择。

博林(BL)公司的发展小趣事

博林公司自创立以来,一直致力于电子行业的技术创新。公司拥有一支专业的研发团队,不断投入巨资进行技术研发和创新。在某一时期,博林公司成功开发出了一款具有颠覆性的电子产品,凭借其卓越的性能和独特的设计,迅速在市场上获得了广泛认可。这款产品的成功推出,不仅为博林公司带来了巨大的经济效益,也进一步巩固了其在电子行业的领导地位。

Discera公司的发展小趣事

Discera公司的产品在性能和稳定性上表现出色,很快就引起了美国军方的关注。经过严格的测试和评估,Discera的CMOS MEMS谐振器成功通过了美国军方的质量可靠性测试,并获得了军方的认证。这一成就不仅证明了Discera产品的卓越性能,也为公司进一步拓展军用市场打下了坚实的基础。

Eby Company公司的发展小趣事

1995年,皮埃尔·奥米迪亚(Pierre Omidyar)以AuctionWeb的名字推出了eBay,最初只是一个在线拍卖个人物品的平台。随着互联网的普及和用户对在线交易需求的增长,eBay迅速吸引了大量用户。其独特的商业模式和用户友好的界面使eBay成为在线拍卖市场的领军者。1998年,eBay成功上市,成为当时最成功的互联网公司之一。

Hirose Electric公司的发展小趣事

eBay的成功不仅仅局限于美国市场。从早期开始,eBay就积极寻求全球化扩张。通过与不同国家和地区的合作伙伴建立合作关系,eBay逐步进入了欧洲、亚洲和拉丁美洲等市场。这种全球化战略使eBay能够接触到更广泛的用户群体,进一步巩固了其在全球在线拍卖市场的领先地位。

Delta Electronics Manufacturing Corp公司的发展小趣事

品质是Delta的生命线。公司建立了完善的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的质量监控。此外,Delta还注重可持续发展,积极推广环保理念,采用环保材料和节能技术,降低产品对环境的影响。这些措施不仅提高了产品的质量,也为企业赢得了良好的社会声誉。

问答坊 | AI 解惑

用VHDL语言设计一般的与非门和集电极开路的与非门

在组合逻辑中,有时候需要使输出一脚的驱动能力加强,就要用集电极开路的输出引脚。 但是两者差别不大,只是在调用时,从不同的库中调用。 集电极开路的输入与非门电路调用STD库的std_ttloc包集合,二一般的输入与非门电路则调用std库的std-tll包 ...…

查看全部问答>

如何让机械表省电←省电精灵

如何让机械表省电←省电精灵c卡预付费电表控制器※电表倒转QQ:272208552 电话:13115998303 如何让插卡电表倒走,【网站打不开请点百度快照】如何使电表慢走 电表倒转的原因 ic卡电表偷电方法 电表节电器控制器电表控制器,电表干扰器:微电脑控表器 ...…

查看全部问答>

使用winio方式动态加载ctrl2cap.sys,无法createFile

各位高人我现在学习键盘过滤驱动,用ctrl2cap改的,可是我却不能动态加载,我使用winio的形式做,发现能启动服务,但是在services.msc中找不到(我用同样方式做的一个应用程序的服务,就可以找到). 但是却不能打开hanlde. HANDLE hDriver = CreateF ...…

查看全部问答>

EVB的打印问题,100分求助,在线急等~~

有一组数据,存放在文本文件里面,格式是: \"时间1\" \"数据1\" \"时间2\" \"数据2\"   .   .   . \"时间N\" \"数据N\" 要求打印相关数据的曲线图~~ 想了半天头都想痛了~给源代码的再加100分…

查看全部问答>

关于shell里面 d 查看内存数据命令的详细用法 ---在线等

关于shell里面 d 查看内存数据命令的详细用法,没有在网上查到,很困扰 只知道简单的使用 d 0x1231231这个命令,但是显示多长,何种格式显示如何设置就不清楚了…

查看全部问答>

verify failded?

哪位大哥能帮我看看这是出了什么问题啊,总是VERIFY FAILDE...        …

查看全部问答>

上海新成立物联网公司招募创业团队!!!-待遇:工资+奖金+上市期权

上海新成立物联网公司定位为物联网行业解决方案供应商,为行业客户提供物联网应用全面解决方案!美国上市公司投资、注册资金1000万,目标2年内上市待遇:工资+项目奖金+上市前分配期权现招聘创业团队,.NET方面开发人员,RF工程师、硬件工程师、mcu ...…

查看全部问答>

各位弄个CCD的兄弟们帮帮忙进来看看 实在是没办法了

我现在要用FPGA做一个 ICX274CCD 驱动 里面有AD9949,问题来了 AD9949里面的双采样SHP SHD    默认 SHP = 0X24 SHD = 0X00 可是我老觉得不对 我觉得SHP=0x18    而SHD = 0x56 才对 各位大哥 到底是用默认值还是要自己设定 ...…

查看全部问答>

求高手

本帖最后由 paulhyde 于 2014-9-15 04:27 编辑 有没有人平时比较空的,能帮助我解决一些问题啊,我在单片机方面不是很专业,需要一个师傅带着,我可以拜他为师,还请师傅不要嫌弃我,回一下我的帖吧!跪谢!!我的qq:335947998 加我的时候最 ...…

查看全部问答>

串口

调试串口时,把驱动库拷贝到工程下面了,但是uart.h无法找到sysctl.h文件或路径不对,等把路径定位到该工程时,出现main.c: Error: C3065E: type of input file \'com\' unknown问题,如何解决啊,高手们啊?…

查看全部问答>