51单片机学习2_数码管运用

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习2_数码管运用

51的数码管点亮跟发光二级管有相似之处,都是给特殊位送高低电平来控制数码管的显示。数码管的发光原理如下所示:

数码管显示原理

数码管显示原理

数码管有共阴极跟共阳极两种,我的板子采用的是共阴极,所以,如果我想让哪个发光管点亮,就给特殊位送高电平1,所以,按照上图,我们可以得知,如果想让显示1,我们就让b,c送高电平,其他均为低电平,所以,显示1的话,按照图上所示,dp~a即为:00000110 b,换算为16进制为:0x06,同理,我们可以得到2,3,4...下面是所得到的1~6的对应发光数:

 

uchar code duantable[] = {
	0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d
};

6个数码管通过位选去控制哪个数码管亮,通过段选控制数码管的某段亮。

下面的一个程序,让板子上的六个数码管每间隔1ms分别显示1,2,3,4,5,6根据人眼看东西的滞留效应,人眼就看到全部显示的是123456,其实是每个数码管在轮流的闪烁着。

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar num = 0;
//段选控制,让数码管显示1,2,3,4,5,6
uchar code duantable[] = {
	0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d
};
//位选控制,分别控制第1个,第2个,第3个...亮
uchar code weitable[] = {
	0xfe, 0xfd, 0xfb,
 	0xf7, 0xef, 0xdf
};
//延时函数
void delay(uint time)
{
	uint x, y;
	for (x = time; x > 0; x--)
		for (y = 110; y > 0; y--);
}

void main()
{
	while (1) {
		for (; num < 6; num++) {
			wela = 1;
			P0 = weitable[num];
			wela = 0;

			dula = 1;
			P0 = duantable[num];
			dula = 0;
			delay(10);
		}
		num = 0;
	}
}

以上程序在板子上测试通过,如有不正,请拍砖。

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习2_数码管运用

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: