- 打卡等级:偶尔看看II
- 打卡总天数:29
- 最近打卡:2024-10-23 17:26:58
中级会员
- 积分
- 209
|
发表于 2024-9-17 10:47:02
|
显示全部楼层
本帖最后由 惦饭宝 于 2024-9-17 20:22 编辑
第十集:动态数码管👦
1.数码管动态刷新的原理
数码管动态刷新是一种通过快速切换数码管的显示,以实现多个数码管同时显示不同数字的方法。
它利用人眼的视觉暂留现象,使人感觉到数码管上的数字是同时显示的。
动态刷新主要是通过分时显示的方法,将多个数码管依次点亮。每次只点亮一个数码管,而其他的数码管则保持熄灭状态。
由于每个数码管只在短时间内被点亮,因此需要快速切换,这样人眼在视觉上就会感受到所有数码管是同时亮的。
动态刷新需要多个控制信号来选择哪一个数码管被点亮,以及选择数码管上的哪个段位被点亮。通常需要使用多个I/O口或者串行移位寄存器来实现这些控制信号的输出。
刷新频率要足够快,通常在几十到几百赫兹之间,这样才能避免人眼察觉到闪烁。
2.控制原理
具体的控制的流程如图所示,N表示有几个数码管!
其中需要注意每个延时不能太短,我们这边程序就以1ms为准,且需要保证总共一个循环结束的时间不能大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新。
3.实验任务
1)在上一课的基础上,新增一个位码选择的数组
u8 COM_Tab[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; //0-7的位码数组
2)通过调用数组选择位码
可编辑文件:
数码管.xlsx
(95.91 KB, 下载次数: 159)
3)新建一个数组选择每个位需要显示的内容!
u8 Show_Tab[8] = {3,0,0,0,0,10,0,0}; //让对应数码管显示输入的数字
P6 = SEG_Tab[Show_Tab[num]]; //需要显示的数字的内码 赋给 P6 NUM =0 -> Show_Tab[num]] = 1 -> p6 = 0xF9
4.实战小练:
简易10秒免单计数器
👇提前定义数组,以及判断标志
u32 TimCount = 0; //计数单位1ms
bit RUN_State = 0; //开始运行/结束运行
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带小数点
Show_Tab[0] = 1; //选择 1
Show_Tab[1] = 10; //选择 0.
Show_Tab[2] = 0; //选择 0
Show_Tab[3] = 0; //选择 0
👆前四位显示1 0. 0 0
1.在前四位数码管上显示目标时间,即10.00”表示定时时间10秒钟
注意点:带有小数点,需要修改对应数组
2.后四位显示当前的计时00.00,最小单位为10ms
3.按下开始按钮后,每10ms最末尾的数字+1;知道按下结束按钮后停止计数。
if( RUN_State==1 ) // 如果运行状态为1(RUN_State == 1)
{ // 计时器计数加1
TimCount++;
Show_Tab[4] = TimCount/10000%10; // 获取万位数字并显示
Show_Tab[5] = TimCount/1000%10+10; // 获取千位数字并显示(+10用于特殊显示,小数点)
Show_Tab[6] = TimCount/100%10; // 获取百位数字并显示
Show_Tab[7] = TimCount/10%10; // 取10位
}
SEG_Fre(); // 更新数码管显示
if( KEY1 ==0 )
{
delay_ms(10);
if( KEY1 ==0 )
{
BEEP = 0;
delay_ms(10);
BEEP = 1;
while( KEY1 ==0 )
SEG_Fre(); // 不断刷新数码管显示
if( RUN_State==0 ) // 如果运行状态为0
TimCount = 0; // 重置计数器
RUN_State = !RUN_State; // 切换运行状态
}
}
5.课后练习
一、做一个简易时钟,功能如下1.初始状态显示 00-00-00,分别作为时,分,秒
二.每隔一秒钟,秒+1,一分钟,分+1,以此类推
三.时间到达00-00-30的时候,蜂鸣响3秒钟表示闹钟
添加部分:
数组数量加1,第21个为横杠。
u8 SEG_Tab[21] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xBF}; //0-9段码,0-9带小数点,横杠-
设置Show_Tab[8]第3位和第五位为横杠。
u8 Show_Tab[8] = {0,0,20,0,0,20,0,0}; //Show_Tab[20]对应SEG_Tab的第21个
新增时,分,秒计数单位。
u16 H = 0,M = 0,S = 0;
代码:
//----------------------------------------------------------------------------------------------------------------------------------------------------//
delay_ms(1000);
S++;
// 判断闹钟
if(RUN_State == 0 && S == 30) //第一次S=30时,蜂鸣器响3秒。
{
BEEP = 0;
delay_ms(3000);
BEEP = 1;
RUN_State = 1;
}
//当S == 60时,M+1,当M == 60时,H+1
if(S >= 60)
{
S = 0;
M++;
if(M >= 60)
{
M = 0;
H++;
if(H>24)
{
H = 0;
}
}
}
//0,1,3,4,6,7为数码管需要显示部分;
Show_Tab[6] = S /10 ; //显示秒的十位
Show_Tab[7] = S %10 ; //显示秒的各位
Show_Tab[3] = M /10 ; //显示分的十位
Show_Tab[4] = M %10 ; //显示分的各位
Show_Tab[0] = H /10 ; //显示时的十位
Show_Tab[1] = H %10 ; //显示时的各位
SEG_Fre();
//----------------------------------------------------------------------------------------------------------------------------------------------------//
PS:没有试验箱,代码还未验证,若有错误还望批评指正!
6.课后总结😁
学习了如何在数码管上显示小数点,并通过按键控制计时的开始和停止。按键消抖以及蜂鸣器的使用也是更加熟练。
动态数码管理解:数码管动态刷新是通过快速切换数码管的显示来实现的。每次只点亮一个数码管,通过不断轮流点亮各个数码管,使人眼感受到所有数码管同时显示。
实现过程中,刷新频率必须足够快,通常在几十到几百赫兹之间,以避免视觉上感到闪烁。
学到了如何控制数码管的显示,包括使用位码选择数组和段码选择数组。在实现过程中,重点是通过循环不断切换显示内容,使数码管能够正确显示多个数字。
ALL👆
学习文件:
动态数码管.zip
(203.58 KB, 下载次数: 154)
|
|