小灰的51单片机学习之显示吧单片机(5)(数码管的显示以及动态扫描)

写在之前

小灰的51单片机学习,被我挤牙膏一样也挤到了第五节了,其实前面的都是很简单的,后面我们学会了一些基础外设,到后面我们将会学习一些通信方式,比如说UART,IIC,SPI等等,当然这些也是一个新的学习,当然我希望学到这里的你,以及在心中有一丢丢了解51单片机,以及知道它到底是什么了,而数码管则是这中间承上启下的一关,也是比较难的一关,加油!

什么是数码管

数码管使什么,老规矩我们先去百度数码管
在这里插入图片描述
花里胡哨不知说云,其实我们很多时候会遇见这样的问题,资料都在说一些理论上的东西,而我们不需要制造数码管,也不需要知道它内部结构是什么样子的,我们只需要知道怎么用它就可以了,我们接着去看
在这里插入图片描述
其实数码管就是长这个样子,我们还可以去看淘宝上面
在这里插入图片描述
大概数码管就长这个样子了
那数码管怎么显示数字的呢
在这里插入图片描述
大家可以看这7个长条形状的,和一个点,其实在数码管里面,这些都是LED,可以点亮的,长条的就是长条的LED,点就是点状LED,大家可能没觉得这个有什么用,但是如果成了这个样子呢?
在这里插入图片描述
其他的灯不亮,就是这个样子了,而这样就会显示一个2.2出来,hhh其实很复杂的东西,就是一点简单的东西组成的,比如说我们还能显示一个其他数字

实际上数码管在设计之初就是能显示从0到F包括点这么多的数字,可能了解的比较多的小伙伴可能有问题了,我们现在有OLED这种显示,为什么还要用数码管这种东西,其实数码管可以简单的显示几个数字,他的造价成本低,操作难度低,可以用在工业控制中,并不要太多的功能的显示中。

如何点亮数码管

在介绍如何点亮数码管之前就十分有必要介绍一下数码管的段选和位选,以下图为例,是一个思维数码管的图片
在这里插入图片描述
大家可以看到这个是有12个引脚引出来的,别到今天还和我说不知道什么是引脚!!!话归正传,这12个引脚就是有四个是位选,有8个是段选。数码管有一个特性就是,在前面提到过,我们可以控制哪些LED灯亮从而控制显示哪些数字,可是如果要点亮就全部都显示那个数字,比如说2222,5555,这个样子,这个时候我们就想要有些灯是不亮的,从而有了位选出现,就是选择哪个位置的灯点亮,* * * 5, * 2 * *,(未亮的位用星号代替),这样就会更方便的显示我们想显示的东西了,那么段选呢就是选择哪一个或者几个LED灯亮, 所以这么说起来,点亮数码管也不是一件难事。这里就不给程序了,最最重要的来了,那就是数码管的动态扫描显示。

数码管的动态扫描显示

握草,这玩意听起来好高级啊,其实都没有什么高级的。其实细心的小伙伴就已经发现了额,数码管的段选决定了数码管所有位显示的都是一个数字那我想显示一个1234怎么办呢?这就涉及到数码管的动态扫描显示了,这里还要说一个小常识,就是当图片变化频率大于每秒20帧的话,人眼是无法辨别的,电影就是每秒24帧,包括那些动画都是一幅幅图片快速切换的才会显示出“动的效果”,而我们想要显示1234也得像这个样子,我们就得1***,2*,*3,***4,这四种显示快速切换,这样我们就能显示出1234的效果出来。是不是听起来很简单,但是实际做起来没那么简单哦,show me the code!

code uchar table[10] = {0Xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义数码管的码表(共阳数码管)  
void Display(uchar shuma1,uchar shuma2,uchar shuma3,uchar shuma4)	//下面是我当时的骚操作,可能在大佬面前不值一提吧,真的值得一看仔细琢磨一下吧
{
	uint w, m = 0;
	uchar nums[4];
	nums[0] = shuma1,nums[1] = shuma2,nums[2] = shuma3,nums[3] = shuma4; //用数组来储存传参的值
	while(m<=27)
	{
		for(w = 0; w < 4; w++) //循环位移显示
		{
			P1 = 0xff;	//下面都是许多位操作,不懂位操作的去百度一下哈
			P0 = ~(0x01 << w); //每次移动一位然后取反
			P1 = table[nums[w]];
			delay(2);	
		}
		w = 0;
		m++;
	}
	m = 0;
}

可能有同学会问了,P1 = 0xff;这句话是干什么的,在这里稍微解释一哈,51单片机有P0-P3这么多引脚,我们之前学过我们定义一个灯的引脚

sbit LED = P2^0;

LED = 0

这样的写法是方便我们操作一个引脚,我们也可以这么写

P1 = 0xfe//即P1 = 1111 1110

分为第四位和高四位,这就分别代表P1 ^0 到 P1 ^3以及P1 ^4 到 P1 ^7,这样就显而易见了,P1 = 0xff的意思就是让P1引脚全部输出高电平,对于LED来说就是让所有的LED全部都灭,那对应数码管是啥呢?
我们数码管的数字变化的时候会在人的眼睛里面流下残影,所以你再实际写的时候必须把数码管先关掉,这一步叫做消影,因为我手上的数码管是共阳数码管所以消影就是0xff,如果你手上的数码管是共阴数码管你们消影就是0x00。当然我们还可以用数码管显示各种奇奇怪怪的好玩的东西,大家可以尝试去做哟!干巴爹!

我是小灰,一个努力用平实的语言写出困难内容的探索者!

发布了15 篇原创文章 · 获赞 35 · 访问量 3404

猜你喜欢

转载自blog.csdn.net/weixin_44065323/article/details/96994304