51单片机动态数码管应用2

数码管

动态数码管实现原理

通过位选每次只打开一个数码管,然后给段选输送显示的值,然后延时,然后只打开下一个数码管的位选,给段选输出显示的值,通过每次只打开一个数码管后,设置延时时间,然后只打开下一个数码管,由于延时速度比较快,在程序操作中,第一个数码管已经不显示了,然后去显示第二个数码管,但是在人眼看到的第一个数码管和第二个数码管同时显示出来了。

通过每次打开一个数码管,然后延时,由于延时速度比较快,但是在人的肉眼中上一次显示的数码管也显示出来了,从而实现动态扫描,但是会出现一个问题,当我打开第一个数码管显示数字0,然后当打开第二个数码管显示数字1,可能在当我打开第二个数码管显示1的时候,会有打开上一次数码管显示0的残影,所以每次打开一个数码管并且显示完成后需要进行消影,如果是共阴极数码管那么段选是高电平有效,那么消影用0x00,如果是共阳极数码管那么段选是低电平有效,那么消影用0xff.用来清除给段选输送的值,起到一个清除的作用。

2.代码

c 复制代码
#include <reg51.h>

typedef unsigned int u16;
typedef unsigned char u8;

#define SMG_A_DP_POST P0 
sbit LSA = P2^2;
sbit LSB = P2^3; 
sbit LSC = P2^4;

u8 gsmg_code[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管0-F

void delay_50ms(u16 us) {
	while(us--);
}
void smg_display(void) {
	u8 i = 0;
	for (i = 0; i < 8; i++) {
		switch(i) {
			case 0: LSA = 0; LSB = 0; LSC = 0; break;
			case 1: LSA = 1; LSB = 0; LSC = 0; break;
			case 2: LSA = 0; LSB = 1; LSC = 0; break;
			case 3: LSA = 1; LSB = 1; LSC = 0; break;
			case 4: LSA = 0; LSB = 0; LSC = 1; break;
			case 5: LSA = 1; LSB = 0; LSC = 1; break;
			case 6: LSA = 0; LSB = 1; LSC = 1; break;
			case 7: LSA = 1; LSB = 1; LSC = 1; break;
		}
		SMG_A_DP_POST = gsmg_code[i];
		delay_50ms(100);
		SMG_A_DP_POST = 0X00;//消影
	}
}

void main() {
	while(1) {
		 smg_display();
	}
	
}

3.实现结果

相关推荐
智者知已应修善业1 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
一起搞IT吧1 小时前
Android性能系列专题理论之十:systrace/perfetto相关指标知识点细节含义总结
android·嵌入式硬件·智能手机·性能优化
Truffle7电子2 小时前
STM32CubeIDE/Programmer/Touch GFX 应用
stm32·单片机·嵌入式硬件
constant_LDX3 小时前
步进电机开发(一、硬件设计)
单片机·嵌入式硬件
北山有鸟3 小时前
修改源码法和插件法
嵌入式硬件·学习
richxu202510013 小时前
嵌入式学习之路->stm32篇->(14)通用定时器(上)
stm32·单片机·嵌入式硬件·学习
Deitymoon3 小时前
STM32——串口通信(USART)
单片机·嵌入式硬件
iCxhust3 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
Deitymoon5 小时前
STM32——外部中断按键控制led
stm32·单片机·嵌入式硬件
czwxkn5 小时前
7STM32(stdl)flash内部闪存
stm32·单片机·嵌入式硬件