51单片机控制数码管显示

前言

今天学习51单片机的数码管模块
我的学习板上面的数码管是4为一体由12个引脚控制的模块。
在这里插入图片描述
今天就编程控制它显示我们想要的输出。
在这里插入图片描述

数码管本质上是由8个LED拼接而成的,他们分别叫做a,b,c,d,e,f,g,dp(小数点)。控制这八段的亮灭显示不同的结果。以共阴极为例(阳极为1则亮),0就是abcdef亮,g和dp灭,对应8为二进制就是001 1111(a是最低位)。就是0x3f.
在这里插入图片描述
这里给出0-8的16进制码,可以计算印证一下。

这类数码管有一个共同的特点,就是某一极是联通的(共阴极或共阳极),通过控制另一极来控制数码管。

老规矩,先看电路图

在这里插入图片描述
这里可以出是共阴极的。
段选信号与一个38译码器相连,E3是使能信号,Y0到Y7是输出信号,通过SEL0,SEL1,SEL2三个信号控制输出结果。(SEL为000对应Y0,SEL为001对应Y1······SEL为111对应Y7)。

SEl又是芯片引脚P2的低三位,我们控制P2就能完成选择哪一个数码管输出,控制P1就能选择该数码管的哪几个LED灯亮,这就是基本思路。

这里面也存在一个问题,电路的这种连接方式虽然省了很多I/O接口,但同一时刻只能有一个数码管有结果。但是二极管的刷新可以很快,利用人的视觉暂留效应,只要刷新够快,我们就能看到它们“同时”亮起。(8个数码管同时亮时,我们打开手机摄像头,摄像头靠近数码管,从手机里能很明显得看到数码管在闪烁刷新,不信可以试一下)

下面放上代码:打印HNU–510

#include <STC15F2K60S2.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms--){
			unsigned char i, j;

		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}

unsigned char duanxuan[]={0x76,0x37,0x3e,0x40,0x40,0x6d,0x5b,0x3f}; 
unsigned char weixuan[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};			 

void main(){
	P0M0=0xff;   
	P0M1=0x00;
	P2M0=0xff;
	P2M1=0x00;
	while(1){
		int k=0;
		for( k=0;k<8;k++){
			P0=duanxuan[k];
			P2=weixuan[k];
			Delay(2);
		}
	}
}

这里duanxuan的数组就是想要输出字符的十六进制代码,weixuan数组从0到7控制P2的低三位。利用循环就能一直刷新,实现想要的输出。

推挽输出还是要设置的,这里是强上拉。第一次我没写推挽输出数码管显示的亮度就很低很低,设置了推挽输出就很亮。还有就是P2的引脚都用到了,所以设置推挽输出时P2M0=0xff,不同于之前只用到P2.3的P2M0=0x80。

还有就是延时2ms也有它的作用,因为刷新太快会导致这一次的段选信号和上一次的位选信号结合这种情况,数码管上一些不该亮的地方会有暗一点的光。于是我们加一个延时函数阻断这种结合,这个步骤叫“消影”。

在这里插入图片描述
在这里插入图片描述
上图就是没有消影的状况。

下面放一下我的代码跑出来的效果:
在这里插入图片描述
清清楚楚,白白净净,单纯、善良、可爱的数码管实在太好看了,嘿嘿!

后记

数码管显示的学习就要到此为止了,之后会持续更新的。
如果有疑问欢迎交流。
未完待续······

  • 18
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值