蓝桥杯——数码管动态显示

一、原理部分

上一篇文章讲到了数码管的段选部分还有不了解的小伙伴可以去查看上一篇文章数码管静态显示
这篇文章主要讲数码管的位选。
位选顾名思义,就是选择数码管哪一位点亮,在开发板上,数码管模块由两个4位的数码管组成,每一个数码管的亮和灭我们可以用一个二进制数来表示,在本开发板中,1为亮,0为灭。
在上一篇文章中,我们只控制段码只能让8个数码管显示同样的数字,那么要让数码管显示不一样的数字该怎么做呢?
在第一个时刻开启只第一个数码管让它显示它应该显示的数字,第二个时刻开启只第二个数码管让它显示它应该显示的数字,这样一直到第八个时刻,每个数码管就可以显示自己应该显示的数字,然后一直循环下去。我们让这个时刻非常小,再用人眼的视觉残留以及灯的余辉就可以达到动态显示的效果。

在这里插入图片描述
原理图如上

二、代码部分

实验平台:CT107D
实验芯片:stc15f2k60s2
实验现象:8个数码管从左往右依次显示0-7
代码如下

#include "stc15f2k60s2.h"
#include "intrins.h"
sbit buzz = P0^6;		 //位定义蜂鸣器
unsigned char display[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07};//定义0-9对应段选数组
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //定义位码数组 
void Delay2ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 22;
	j = 128;
	do
	{
		while (--j);
	} while (--i);
}


void close_buzz()	//蜂鸣器上电默认高电平,所以关闭蜂鸣器
{
	 P2=0xa0;
	 buzz = 0;
	 P2=0x00;
}

void main()
{	  
		unsigned char i;
		close_buzz();
		while(1)
		{	
			for(i=0;i<8;i++)
			{

				P2 = 0xc0;
				P0 = wei[i];
			    P2 = 0x00;//关闭锁存器

				P2 = 0xe0; //打开段选锁存器
				P0 = ~display[i];//数组定义为共阴极的段码,开发板上的为共阳极于是取反
				P2 = 0x00;//关闭锁存器	
								
				Delay2ms();//刷新频率为2ms
			}								
		}
}

发布了9 篇原创文章 · 获赞 11 · 访问量 1350

猜你喜欢

转载自blog.csdn.net/FuckerGod/article/details/103987899