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.实现结果

相关推荐
LCMICRO-133108477461 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
守护安静星空3 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
ACP广源盛139246256733 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
时空自由民.4 小时前
ST7701S 3.5寸显示屏
单片机
金戈鐡馬5 小时前
BetaFlight中的定时器引脚绑定详解
stm32·单片机·嵌入式硬件·无人机
智者知已应修善业5 小时前
【51单片机单按键切换广告屏】2023-5-17
c++·经验分享·笔记·算法·51单片机
Wave8456 小时前
FreeRTOS软件定时器详解
stm32·单片机·freertos
VBsemi-专注于MOSFET研发定制6 小时前
奶茶制作机器人功率MOSFET选型方案——高效、精准与可靠驱动系统设计指南
单片机·嵌入式硬件
水云桐程序员8 小时前
单片机项目从入门到精通
单片机·嵌入式硬件
Wave8458 小时前
STM32 裸机中断与 FreeRTOS 中断管理的四大核心差异
单片机·嵌入式硬件