首页 > 代码库 > 51单片机第三弹---数码管显示

51单片机第三弹---数码管显示

先把定义拉过来:

LED数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。LED数码管常用的段数一般为7段,有的另加一个小数点 。LED数码管根据LED的接法不同,分为共阴和共阳两类 。

           贴原理图

                           技术分享

其实就两点 :由于板子上有8个数码管,而每个数码管有8段,称选择显示哪一个数码管的东西为位选,称单个数码管显示数字几的东西为段选,位选由P2.2  p2.3 p2.4 控制

数码管IO口为P0 对于每一个数码管,显示数字几只要控制PO的8个段就可以了,低电平点亮,如00000001为a段亮,其他的段不亮。

位选图如下:

                          技术分享

输入中的A B C分别代表P2.2 P2.3 P2.4

/*******************************************************************************
* 实 验 名		 : 数码管实验
* 使用的IO	     : 数码管使用P0
* 实验效果       : 数码管显示数字 5201314
* 注    意		 :
*******************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define GPIO_LED P2
#define GPIO_DIG P0
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
unsigned char code MY_CODE[7]={5,2,0,1,3,1,4};
void DIG_DISPLAY()
{
	uchar i,j;
	for(i=0;i<8;i++)
	{
		switch(7-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;
		}
		if(i==7)continue;
		GPIO_DIG=DIG_CODE[MY_CODE[i]];
		j=10;while(j--);
		GPIO_DIG=0x00;//消隐
	}
}
void main()
{
	while(1)
	{
		DIG_DISPLAY();
	}
}


51单片机第三弹---数码管显示