- 打卡等级:常住居民III
- 打卡总天数:117
- 最近打卡:2025-08-05 03:07:31
已绑定手机
高级会员
- 积分
- 871
|
发表于 2025-5-5 01:47:42
|
显示全部楼层
《32位8051单片机原理及应用》教学视频--学习打卡10
第十集:数码管的动态显示
笔记:
1、数码管动态刷新的原理。
1.1 点亮一个数码管,需要在公共端送入位码,在其它端送入段码,段码与要显示的内容存在对应关系,即显示编码。
1.2 多位数码管的显示是在4位数码管上快速显示一位,并循环每一位,每一位上都显示本位上的内容,循环速度快于人眼的视觉暂留速度,在感觉上4位显示的内容就稳定显示了。
1.3 实现循环的方法是依次在每个公共端送入打开本位数码管的控制信号,在打开后在段码数据线上送入此时打开的这一位数码管该显示的段码,延时适当时间后关断本位的显示,然后进入下一位的显示,过程如上一位的显示方法。
2、控制原理。
多位数码管的控制的流程如图所示,N表示有几个数码管。
其中需要注意每个延时不能太短,程序中就以1ms为准,且需要保证总共一个循环结束的时间不能大于20ms,因为人眼有视觉暂留现象,不容易分辨出50HZ以上的动态刷新。
3、8位数码管同时点亮。
3.1 在上一课的基础上,新增一个位码选择的数组。
段码表:
段码定义:
u8 SEG_Tab[20] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,\
0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; //0-9段码+0-9带小数点段码
位码表:
位码定义:
u8 COM_Tab[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; //0-7的位码数组
3.2 通过调用数组选择位码。
3.3 新建一个数组选择每个位需要显示的内容。
定义显示内容:
u8 Show_Tab[8] = {3, 0, 0, 0, 0, 10, 0, 0}; //显示内容,大于等于10的是带小数点的显示
主要代码如下:
void SEG_Fre(void)
{
P7 = COM_Tab[num]; //位码的选择
P6 = SEG_Tab[Show_Tab[num]]; //需要显示的数字的内码赋给P6
delay_ms(1);
num++;
if (num > 7)
num = 0;
}
实战小练:
项目:简易10秒免单计数器。
1、在前四位数码管上显示目标时间,即“ 10. 00 ”表示定时时间10秒钟
2、后四位显示当前的计时00.00,最小单位为10ms,
3、按下开始按钮后,每10ms最末尾的数字+1;知道按下结束按钮后停止计数。
主要代码:
Show_Tab[0] = 1; //选择 1
Show_Tab[1] = 10; //选择 0.
Show_Tab[2] = 0; //选择 0
Show_Tab[3] = 0; //选择 0
if (1 == RUN_State)
{
TimCount++;
Show_Tab[4] = TimCount / 10000 % 10;
Show_Tab[5] = TimCount / 1000 % 10 + 10;
Show_Tab[6] = TimCount / 100 % 10;
Show_Tab[7] = TimCount / 10 % 10; //取10位
}
SEG_Fre();
if (0 == KEY1)
{
delay_ms(10);
if (0 == KEY1)
{
BEEP = 0;
delay_ms(10);
BEEP = 1;
while (0 == KEY1)
{
SEG_Fre();
}
if (0 == RUN_State)
TimCount = 0;
RUN_State = !RUN_State;
}
}
学习心得:
1、多位数码管显示共用段码数据线可以节约GPIO口的占用。
2、利用位码在数码管公共端的循环控制,循环打开数码管,快速循环,利用视觉暂留现象,循环快乐就可稳定显示内容。
3、利用数组存储显示内容的码表,并利用数组存储位码,方便用循环语句显示内容。
总结:
1、学习了多位数码管动态显示原理。
2、学习了利用循环语句循环段码数组和位码数组的方法实现动态显示。
后记:
2025年5月5日。 |
|