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

相关推荐
崇山峻岭之间7 小时前
单片机步进电机实验
单片机·嵌入式硬件
xiangw@GZ9 小时前
802.11全系列标准调制编码与速率档对应关系
网络·单片机·嵌入式硬件·架构
希希之光9 小时前
Aurix Tc3xx Port&Dio模块总结
单片机·嵌入式硬件
日拱一卒的小田9 小时前
ZYNQ学习笔记2-ZYNQ的UART控制器1
单片机·嵌入式硬件
我想走路带风10 小时前
OPENWRT-Day01
stm32·单片机·嵌入式硬件
ACP广源盛1392462567310 小时前
GSV2221@ACP#DP 1.4 MST 多屏转换芯片,物理 AI 多模态交互的视觉中枢
大数据·人工智能·嵌入式硬件·gpt·spark
云栖梦泽11 小时前
Linux内核与驱动:pinctl子系统和GPIO子系统
linux·单片机·嵌入式硬件
电气_空空11 小时前
基于 LabVIEW 的单片机串口通信设计
单片机·嵌入式硬件·毕业设计·labview
caimouse13 小时前
Reactos 第 9 章 设备驱动 — 9.10 磁盘的Miniport驱动模块
windows·嵌入式硬件
xiangw@GZ13 小时前
WiFi系统BCC与LDPC纠错编码技术性能对比
单片机·嵌入式硬件