单片机学习小组
登录
直播中
一曲作罢
9年用户
865经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信
关注
如何去实现八位数码管的静态与动态显示代码呢
开启该帖子的消息推送
单片机
数码管
动态显示
八位数码管的原理是什么?
如何去实现八位数码管的静态与动态显示代码呢?
回帖
(1)
张鑫
2022-2-23 09:27:08
一、数码管原理图
开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。
当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。
由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下:
二、数码管显示代码
下面举几个例子:
1、让数码管八个位都显示6(数码管静态显示)
#include"reg52.h"
***it HC138_A = P2^5;//定义译码器中ABC所在引脚
***it HC138_B = P2^6;
***it HC138_C = P2^7;
void Show_SMG()
{
HC138_C = 1; //给CBA赋值,打通U6
HC138_B = 1;
HC138_A = 0;
P0 = 0xff; //com1-8设为高电平
HC138_C = 1; //给CBA赋值,打通U7
HC138_B = 1;
HC138_A = 1;
P0 = 0x82; //给八个段赋值显示6
}
void main()
{
while(1)
{
Show_SMG();
}
}
2、让数码管八个位从0显示到9(数码管静态显示)
为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。
#include"reg52.h"
unsigned char SMG_Duanma[12] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned channel) //选择锁存器
{
switch(channel)
{
case 6: //选择U6锁存器
P2 = P2 & 0x1f | 0xc0;
break;
case 7: //选择U7锁存器
P2 = P2 & 0x1f | 0xe0;
break;
}
}
unsigned char i;
void ShowSMG()
{
SelectHC573(6);
P0 = 0xff; //com1-8设为高电平
SelectHC573(7);
for(i = 0; i<=9; i++)
{
P0 = SMG_Duanma
;
Delay(50000);
Delay(50000);
}
}
void main()
{
while(1)
{
ShowSMG();
}
}
3、让数码管从0显示到99(数码管动态显示)
动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。
上代码:
#include"reg52.h"
unsigned char SMG_Duanma[12]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 6: //选择U6锁存器
P2 = P2 & 0x1f | 0xc0;
break;
case 7: //选择U7锁存器
P2 = P2 & 0x1f | 0xe0;
break;
}
}
void ShowSMG_Bit(unsigned char pos, unsigned char value) //pos位显示value
{
SelectHC573(6);
P0 = 0x01 << (pos - 1);
SelectHC573(7);
P0 = value;
Delay(200); //消影
P0 = 0xff; //消影
}
unsigned char i, j;
void DelaySMG(unsigned int t)
{
while(t--)
{
ShowSMG_Bit(1, SMG_Duanma
); //第一位显示SMG_Duanma
Delay(200);
ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]
Delay(200);
}
}
void ShowSMG()
{
for(i = 0; i<=9; i++)
for(j = 0; j <= 9; j++)
{
ShowSMG_Bit(1, SMG_Duanma
); //第一位显示SMG_Duanma
DelaySMG(200);
ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]
DelaySMG(200);
}
}
void main()
{
while(1)
{
ShowSMG();
}
}
```
一、数码管原理图
开发板上的八位数码管为共阳连接,com1–com8分别控制公共端(公共阳极);a–dp分别控制数码管每一位的八个段。它们两又分别被锁存器U6和U7控制着。
当com端为高电平,对应的a–dp为低电平时相应段码就会亮。如:com1为高电平,com2–com8为低电平,此时让dp为低电平,a–g为高电平,则第一个数码管只有dp亮,也就是亮一个点。
由于段码有八个,如果一个一个赋值很麻烦,因此一般用十六进制数一次性给段码进行赋值。十六进制数控制的段码显示如下:
二、数码管显示代码
下面举几个例子:
1、让数码管八个位都显示6(数码管静态显示)
#include"reg52.h"
***it HC138_A = P2^5;//定义译码器中ABC所在引脚
***it HC138_B = P2^6;
***it HC138_C = P2^7;
void Show_SMG()
{
HC138_C = 1; //给CBA赋值,打通U6
HC138_B = 1;
HC138_A = 0;
P0 = 0xff; //com1-8设为高电平
HC138_C = 1; //给CBA赋值,打通U7
HC138_B = 1;
HC138_A = 1;
P0 = 0x82; //给八个段赋值显示6
}
void main()
{
while(1)
{
Show_SMG();
}
}
2、让数码管八个位从0显示到9(数码管静态显示)
为了方便,我们将所有要用的段码放在一个数组中;将选择锁存器的代码也进行优化,要理解这些的原理都要将十六进制转化为二进制来理解。
#include"reg52.h"
unsigned char SMG_Duanma[12] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned channel) //选择锁存器
{
switch(channel)
{
case 6: //选择U6锁存器
P2 = P2 & 0x1f | 0xc0;
break;
case 7: //选择U7锁存器
P2 = P2 & 0x1f | 0xe0;
break;
}
}
unsigned char i;
void ShowSMG()
{
SelectHC573(6);
P0 = 0xff; //com1-8设为高电平
SelectHC573(7);
for(i = 0; i<=9; i++)
{
P0 = SMG_Duanma
;
Delay(50000);
Delay(50000);
}
}
void main()
{
while(1)
{
ShowSMG();
}
}
3、让数码管从0显示到99(数码管动态显示)
动态显示原理:让不同位的数码管只亮一小段极小时间,从而造成视觉暂留效果,人眼无法识别这极小段的熄灭时间,从而觉得这些不同位数码管是同时亮的。
上代码:
#include"reg52.h"
unsigned char SMG_Duanma[12]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};//数码管段码
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 6: //选择U6锁存器
P2 = P2 & 0x1f | 0xc0;
break;
case 7: //选择U7锁存器
P2 = P2 & 0x1f | 0xe0;
break;
}
}
void ShowSMG_Bit(unsigned char pos, unsigned char value) //pos位显示value
{
SelectHC573(6);
P0 = 0x01 << (pos - 1);
SelectHC573(7);
P0 = value;
Delay(200); //消影
P0 = 0xff; //消影
}
unsigned char i, j;
void DelaySMG(unsigned int t)
{
while(t--)
{
ShowSMG_Bit(1, SMG_Duanma
); //第一位显示SMG_Duanma
Delay(200);
ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]
Delay(200);
}
}
void ShowSMG()
{
for(i = 0; i<=9; i++)
for(j = 0; j <= 9; j++)
{
ShowSMG_Bit(1, SMG_Duanma
); //第一位显示SMG_Duanma
DelaySMG(200);
ShowSMG_Bit(2, SMG_Duanma[j]); //第二位显示SMG_Duanma[j]
DelaySMG(200);
}
}
void main()
{
while(1)
{
ShowSMG();
}
}
```
举报
更多回帖
rotate(-90deg);
回复
相关问答
单片机
数码管
动态显示
如何
去
实现
八位数码管
的
动态
扫描
呢
2022-02-23
1756
如何利用51单片机stc-B板
实现
八位数码管
动态显示
?
2021-09-30
1560
8
位数码管
实现
10
位
学号
动态显示
的
代码
如何
去
实现
2022-02-23
2139
如何利用单片机
去
实现
C51计数和
八位数码管
显示
设计
呢
2022-02-23
823
数码管
动态显示
2017-05-01
4253
如何利用51单片机
实现
数码管
的
静态
与
动态显示
?
2021-10-25
1913
数码管
显示
亮度太暗怎样增加亮度?
2015-02-19
36600
如何对
数码管
的
静态
显示
和
动态显示
进行Proteus仿真
呢
2022-01-21
3625
数码管
的
显示
原理是什么
2021-09-27
2838
如何
实现
数码管
的
动态显示
?
2021-11-04
1951
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分