51单片机数码管显示数字及小数点

51单片机数码管显示(共阴极)


1.先看一下显示的结果:


源代码:

#include 

typedef unsigned int u16;
typedef unsigned char u8;

u8 code smg[]={
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{
     	
	while(i--);
}
/*显示函数*/
void display()
{
     
	u16 n,x=0;
	while(1){
     
		for(n=0;n<4;n++)
	  {
     
			switch(x){
     
				case 0:
					P2=0x0e;P0=smg[num/1000];break;//显示2
				case 1:
					P2=0x0d;P0=smg[(num%1000)/100];break;//显示0
				case 2:
					P2=0x0b;P0=smg[(num%1000)%100/10];break;//显示2
				case 3:
					P2=0x07;P0=smg[num%10];break;//显示1
			}
			delay(800);
			x++;
		}
		x=0;  //for循环结束,x要重新置0
	}
}
/*主函数*/
void main()
{
     
		display();
}

2.如何在数码管显示小数点呢?

        对与共阴极数码管来说,直接将要显示的数字与0x80相或
        例如:
                 要想在数码管上显示数字2,对于本电路图来说,直接让P0=0x5b即可; 0x5b=01011011,
                 但怎么显示'2.'呢? 对于共阴极数码管来说,只需要让P0=0x5b | 0x80, 即P0=11011011,即点亮dp位

显示结果:
源代码:

 #include 

typedef unsigned int u16;
typedef unsigned char u8;

u8 code smg[]={
     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
u16 num=2021;//要显示的数字
/*延时函数*/
void delay(u16 i)
{
     	
	while(i--);
}
/*显示函数*/
void display()
{
     
	u16 n,x=0;
	while(1){
     
		for(n=0;n<4;n++)
	  {
     
			switch(x){
     
				case 0:
					P2=0x0e;P0=smg[num/1000]|0x80;break;//***只修改了此语句***
				case 1:
					P2=0x0d;P0=smg[(num%1000)/100];break;
				case 2:
					P2=0x0b;P0=smg[(num%1000)%100/10];break;
				case 3:
					P2=0x07;P0=smg[num%10];break;
			}
			delay(800);
			x++;
		}
		x=0;
	}
}
/*主函数*/
void main()
{
     
		display();
}
                     

以上就是51单片机数码管显示数字及小数点了,但仅仅以共阴极数码管为例,大家还可以思考一下如何用共阳极数码管实现

proteus中数码管: 7-SEG-MPX4 (CC是共阴极,CA是共阳极)

你可能感兴趣的:(51单片机,单片机)