历史上的今天
今天是: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; // 消隐,注意不要漏掉了
}
}
史海拾趣
|
在组合逻辑中,有时候需要使输出一脚的驱动能力加强,就要用集电极开路的输出引脚。 但是两者差别不大,只是在调用时,从不同的库中调用。 集电极开路的输入与非门电路调用STD库的std_ttloc包集合,二一般的输入与非门电路则调用std库的std-tll包 ...… 查看全部问答> |
|
如何让机械表省电←省电精灵c卡预付费电表控制器※电表倒转QQ:272208552 电话:13115998303 如何让插卡电表倒走,【网站打不开请点百度快照】如何使电表慢走 电表倒转的原因 ic卡电表偷电方法 电表节电器控制器电表控制器,电表干扰器:微电脑控表器 ...… 查看全部问答> |
|
使用winio方式动态加载ctrl2cap.sys,无法createFile 各位高人我现在学习键盘过滤驱动,用ctrl2cap改的,可是我却不能动态加载,我使用winio的形式做,发现能启动服务,但是在services.msc中找不到(我用同样方式做的一个应用程序的服务,就可以找到). 但是却不能打开hanlde. HANDLE hDriver = CreateF ...… 查看全部问答> |
|
有一组数据,存放在文本文件里面,格式是: \"时间1\" \"数据1\" \"时间2\" \"数据2\" . . . \"时间N\" \"数据N\" 要求打印相关数据的曲线图~~ 想了半天头都想痛了~给源代码的再加100分… 查看全部问答> |
|
关于shell里面 d 查看内存数据命令的详细用法 ---在线等 关于shell里面 d 查看内存数据命令的详细用法,没有在网上查到,很困扰 只知道简单的使用 d 0x1231231这个命令,但是显示多长,何种格式显示如何设置就不清楚了… 查看全部问答> |
|
上海新成立物联网公司招募创业团队!!!-待遇:工资+奖金+上市期权 上海新成立物联网公司定位为物联网行业解决方案供应商,为行业客户提供物联网应用全面解决方案!美国上市公司投资、注册资金1000万,目标2年内上市待遇:工资+项目奖金+上市前分配期权现招聘创业团队,.NET方面开发人员,RF工程师、硬件工程师、mcu ...… 查看全部问答> |
|
我现在要用FPGA做一个 ICX274CCD 驱动 里面有AD9949,问题来了 AD9949里面的双采样SHP SHD 默认 SHP = 0X24 SHD = 0X00 可是我老觉得不对 我觉得SHP=0x18 而SHD = 0x56 才对 各位大哥 到底是用默认值还是要自己设定 ...… 查看全部问答> |




