51单片机驱动数码管显示

1. 数码管介绍.

数码管可以看成是一个个LED,大家学的第一个关于单片机的第一个例程,应该就是点亮一个LED,而这个数码管就是有顺序的点亮某几个LED.在这里插入图片描述

2.数码管的段选

从上面图片可以看到有共阴极和共阳极两种数码管,所以当我们让其中几个数码管显示的时候,只需要让a、b、c、d、e、f、g、dp(这几段称为段选端)这8段中的其中几段点亮就ok了。

3.多个数码管并联

一般来说,使用数码管不会单单一个,当使用多个数码管一起使用的时候,这时候几个数码管的段选端会并联在一起。每一个的共阳或者共阴极不在直接和电源的正或者负极相连,而是成为位选端,当需要其点亮时让其接通
(下图中a~g、dp为段选端,1 ~4 为位选端)
在这里插入图片描述

4.如何驱动四位数码管显示数字。

①四位数码管有8个段选端,4个位选端,让单独一个数码管显示的时候只需要在段选端输入段码,并且接通该数码管的位选端;
②如果需要显示四位数字时,就需要动态显示了,因为人类的视觉暂留效应(自行百度)在很短时间内依次显示数字,因为时间很短,看起来就像是同时亮着。

亚龙某实验台上的四位数码管显示。

#include "reg52.h"				 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	 	 //对数据类型进行声明定义
typedef unsigned char u8;
//数码管位选
sbit seg1=	P2^0;//第一个数码管
sbit seg2= 	P2^1;//第二个数码管
sbit seg3=	P2^2;//第三个数码管
sbit seg4=	P2^3;//第四个数码管
u8 DisplayData[8];
//u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//自己开发板
u8 code smgduan[10]={
    
    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//学校平台使用
void delay(u16 i)
{
    
    
	while(i--);
}

/*******************************************************************************
* 函 数 名       : segdisplay()
* 函数功能		 : 数码管显示
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void segdisplay()
{
    
    
	int i;
	for(i=1;i<5;i++)
	{
    
    
		switch(i)
		{
    
    
			P0=0Xff;
			delay(5);	
			case 1:	 seg1=0;seg2=1;seg3=1;seg4=1; break;
			case 2:	 seg2=0;seg1=1;seg3=1;seg4=1; break;
			case 3:	 seg3=0;seg1=1;seg2=1;seg4=1; break;
			case 4:	 seg4=0;seg1=1;seg2=1;seg3=1; break;
		}
		
		P0=DisplayData[i];
		delay(100);
		P0=0XFF;
		delay(5);	
	}		
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
    
    
 	while(1)
 	{
    
    
 		//显示带两位小数的数字,提前把数字乘100,四舍五入或者取整
		 DisplayData[1]=smgduan[temp /1000%10];//显示十位
    	 DisplayData[2]=smgduan[temp /100%10]&0x7f;//显示个位和小数点
    	 DisplayData[3]=smgduan[temp /10%10];//显示十分位
    	 DisplayData[4]=smgduan[temp /1%10];//显示百分位
    	 segdisplay();  
	}
}		

猜你喜欢

转载自blog.csdn.net/jun8086/article/details/108475427