单片机交流
登录
直播中
李继明
7年用户
1068经验值
私信
关注
[问答]
如何利用51单片机实现数码管的静态与动态显示?
开启该帖子的消息推送
51单片机
如何利用51
单片机
实现数码管的静态与动态显示?
回帖
(3)
金晖
2021-10-25 11:56:04
注意:本实验采用清翔电子51单片机开发板(同样的51单片机开发板,不同型号,内部设计会有一定差异,程序不一定适用) 每段程序都有现象图,同型号单片机保证能用。 给我点个赞,谢谢! 1、数码管知识
a图为一个数码管每段对应的字母
b图为共阴极数码管(他们的阴极都相连)
c图为共阳极数码管(他们的阳极都相连)
数码管分为共阳和共阴两种,共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭……
这是这块开发板对应数码管部分的原理图,我简短解说一下,手打有点吃不消。
这里使用了两个74HC573,这个叫锁存器,它可以把数据输入端与输出端进行隔离或连接。
输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
由图可见,OE端直接与地相连,而LE端分别与单片机的P2.6和P2.7相连,所以这款单片机是用P2.6和 P2.7来控制数码管的。
P2.7叫做位控,控制哪一位(总共有八位)
P2.6叫做段控,控制数码管哪几段显示(一段段组成数字)
2、数码管静态显示
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
#include
#define uint unsigned int //定义无符号整型的写法
#define uchar unsigned char //定义无符号字符型的写法
***it DU = P2^6;
***it WE = P2^7;
void main()
{
WE = 1; //打开位控
P0 = 0XFE; //1111 1110 根据原理图顺序,为左边第一个数码管
WE = 0; //关闭位控
DU = 1; //打开段控
P0 = 0X66; //0110 0110 对应数字4
DU = 0; //关闭段控
while(1);
}
现象图:
3、数码管动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
#include
#define uchar unsigned char
#define uint unsigned int
***it DU = P2^6;
***it WE = P2^7;
uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//0-9,这里用code是把它放到ROM区,节省RAM区
void delay(uint z)//约1ms延时
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uint i)//显示程序
{
uchar bai,shi,ge;
bai = i/100; //521/100=5
shi = i%100/10; //521%100/10=2
ge = i%10; //521%10=1
//第一位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFE; //1111 1110
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[bai];
DU = 0; //锁存位选数据
delay(5);
//第二位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFD; //1111 1101
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[shi];
DU = 0; //锁存位选数据
delay(5);
//第三位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFB; //1111 1011
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[ge];
DU = 0; //锁存位选数据
delay(5);
}
void main()
{
while(1)
{
display(521);//调用上面的显示函数
}
}
现象图:
大家自己在编写这块程序要注意一个问题,uchar 范围为0-255
uint 为0-65535,这个错误我一开始也犯了。搞得我超范围的数显示不出来。
注意:本实验采用清翔电子51单片机开发板(同样的51单片机开发板,不同型号,内部设计会有一定差异,程序不一定适用) 每段程序都有现象图,同型号单片机保证能用。 给我点个赞,谢谢! 1、数码管知识
a图为一个数码管每段对应的字母
b图为共阴极数码管(他们的阴极都相连)
c图为共阳极数码管(他们的阳极都相连)
数码管分为共阳和共阴两种,共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭……
这是这块开发板对应数码管部分的原理图,我简短解说一下,手打有点吃不消。
这里使用了两个74HC573,这个叫锁存器,它可以把数据输入端与输出端进行隔离或连接。
输出口Q要想输出高低电平OE脚必须接GND。
LE脚为高时,输出端Q随输入端D的数据而变化。
LE脚为低时,输出端Q数据保持不变,输入端D数据变化不会改变Q的数据。
由图可见,OE端直接与地相连,而LE端分别与单片机的P2.6和P2.7相连,所以这款单片机是用P2.6和 P2.7来控制数码管的。
P2.7叫做位控,控制哪一位(总共有八位)
P2.6叫做段控,控制数码管哪几段显示(一段段组成数字)
2、数码管静态显示
LED显示器工作方式有两种:静态显示方式和动态显示方式。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
#include
#define uint unsigned int //定义无符号整型的写法
#define uchar unsigned char //定义无符号字符型的写法
***it DU = P2^6;
***it WE = P2^7;
void main()
{
WE = 1; //打开位控
P0 = 0XFE; //1111 1110 根据原理图顺序,为左边第一个数码管
WE = 0; //关闭位控
DU = 1; //打开段控
P0 = 0X66; //0110 0110 对应数字4
DU = 0; //关闭段控
while(1);
}
现象图:
3、数码管动态显示
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
#include
#define uchar unsigned char
#define uint unsigned int
***it DU = P2^6;
***it WE = P2^7;
uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};//0-9,这里用code是把它放到ROM区,节省RAM区
void delay(uint z)//约1ms延时
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uint i)//显示程序
{
uchar bai,shi,ge;
bai = i/100; //521/100=5
shi = i%100/10; //521%100/10=2
ge = i%10; //521%10=1
//第一位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFE; //1111 1110
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[bai];
DU = 0; //锁存位选数据
delay(5);
//第二位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFD; //1111 1101
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[shi];
DU = 0; //锁存位选数据
delay(5);
//第三位数码管
P0 = 0xFF; //清除断码
WE = 1; //打开位选锁存器
P0 = 0xFB; //1111 1011
WE = 0; //锁存位选数据
DU = 1; //打开段选锁存器
P0 = table[ge];
DU = 0; //锁存位选数据
delay(5);
}
void main()
{
while(1)
{
display(521);//调用上面的显示函数
}
}
现象图:
大家自己在编写这块程序要注意一个问题,uchar 范围为0-255
uint 为0-65535,这个错误我一开始也犯了。搞得我超范围的数显示不出来。
举报
大吉大利_OU
2024-1-3 09:03:58
很优质的帖子,看了以后很清楚,如果把MCU那一部分也能够一起画出来就更好了
很优质的帖子,看了以后很清楚,如果把MCU那一部分也能够一起画出来就更好了
举报
jf_15850686
2024-1-26 15:50:41
感谢分享,学习中,谢谢楼主
感谢分享,学习中,谢谢楼主
举报
更多回帖
rotate(-90deg);
回复
相关问答
51单片机
如何
利用
51
单片机
实现
数码管
静态
与
动态显示
?
2021-09-28
1150
数码管
的
静态
显示
方式与
动态显示
方式有何不同
2022-01-18
3164
单片机
中需要有驱动电路才能使用
数码管
吗
2022-02-23
1925
C
51
单片机
数码管
动态显示
的原理是什么
2023-11-08
241
清翔电子
51
单片机
6课
动态显示
数码管
作业求解?
2021-10-13
1313
急需STC89C
51
单片机
8位共阴极
数码管
动态显示
01234567的汇编语言程序
2022-01-13
1530
怎样
利用
51
单片机
去
实现
动态
数码管
模块
显示
12345678呢
2022-02-23
1898
如何
利用
51
单片机
stc-B板
实现
八位
数码管
动态显示
?
2021-09-30
1519
如何
利用
51
单片机
实现
七段
数码管
的
显示
?
2021-10-21
2229
如何去
实现
一种基于
51
单片机
的三个7段共阴极
数码管
动态显示
0~99的设计?
2021-07-19
1014
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分