资讯详情

80C51单片机:3.数码管显示、封装与消隐

80C51单片机系列

  1. 80C51单片机介绍
  2. 照亮第一个发光二极管和流水灯案例
  3. 数字管显示、包装和隐藏

文章目录

  • 80C51单片机系列
  • 数码管显示
      • 数字管的控制逻辑
      • 循环显示
  • 封装数码管
    • 消隐
  • 下一章:中断


在上一章中,我们学会了如何操作二极管的发光熄灭。

这一节我们讲如何操作数码管,让数码管显示出数字。

数码管显示

数字管的控制逻辑

简单地说:

现在我们大概知道数字管的控制逻辑了。

在这里插入图片描述

从上图(原理图)可以看出,控制数码管分为两部分。

在每个数字管上连接一个串口。分别是:。从上面说的,我们可以猜到这四个串口应该是

因为只要控制是否显示,数字管和串口就能满足需求。

所以这四个串口是:

看下面的数码管,有八个串口,图片很清晰,a、b、c、b、e、f、g。

这八个串口连接到单片机P八串0口。

我们来看看第一个数字管的位选。

从图的左侧可以看出,连接单片机P1 ^ 3这个嘴。所以只要给它。P1 ^ 3 = 即可!

现在数码管亮了!

我们希望数字管显示 ,还需要控制

从上图可以看到显示,有两种选择。

#include<reg52.h>   //位选 sbit LEDS4 = P1^3;  //段选 sbit b = P0^1; sbit c= P0^2;  void main() { 
          ///初始化都是低电平  P1 = 0;  P0 = 0;   LEDS4 = 1;  b = 1;  c = 1;  while(1); }  

然后编译,下载到单片机,打开,然后你可以看到第一个数字管显示为1!


循环显示

有了上面的例子,我们来练习一下。

循环显示:0 1 2 3 4 5 6 7 8 9 A b c d e f 空

#include<reg52.h>  typedef unsigned 
       
        int uint
        ; 
        typedef 
        unsigned 
        char uchar
        ; 
        void 
        Delayms
        (
        unsigned 
        char
        )
        ; 
        // 0 1 2 3 4 5 6 7 8 9 A b c d e f 空 不显示 
        //{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; 
        void 
        main
        (
        ) 
        { 
          uchar DUAN
        [
        17
        ] 
        = 
        { 
         
        0x3f
        ,
        0x06
        ,
        0x5b
        ,
        0x4f
        ,
        0x66
        ,
        0x6d
        ,
        0x7d
        ,
        0x07
        ,
        0x7f
        ,
        0x6f
        ,
        0x77
        ,
        0x7c
        ,
        0x39
        ,
        0x5e
        ,
        0x79
        ,
        0x71
        ,
        0x00
        }
        ; uchar i
        ; 
        while
        (
        1
        ) 
        { 
          
        for
        (i
        =
        0
        ; i
        <
        17
        ; i
        ++
        ) 
        { 
          P1 
        = 
        0xff
        ;
        //数码管全部打开 P0 
        = DUAN
        [i
        ]
        ; 
        Delayms
        (
        500
        )
        ; 
        } 
        } 
        } 
        //延时函数 
        void 
        Delayms
        (
        unsigned 
        char c
        ) 
        { 
          
        unsigned 
        char a
        ; 
        for
        (
        ;c
        >
        0
        ;c
        --
        ) 
        for
        (a
        =
        200
        ;a
        >
        0
        ;a
        --
        )
        ; 
        } 
       

封装数码管

#include<reg52.h>
#include"num_led.h"

#define Wei P1
#define Duan P0

// 位选
//{0x08,0x04,0x02,0x01};
unsigned char LED_WEI[4] = { 
        0xf1,0xf2,0xf4,0xf8};

//段选
// 0 1 2 3 4 5 6 7 8 9 A B C D E F 空
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char LED_NUM[17] = { 
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

static void Num_Delayms(unsigned char c);

//处理数字并显示函数
void Num_show(unsigned int num)
{ 
        
	unsigned char i,ge;
	unsigned int show_num;
	
	show_num = num;
	
	// 数字达到9999 显示为“- - - -”
	if(show_num >= 9999)
	{ 
        
		P0 = 0x40;
		P1 = 0x0f;
		return;
	}
	//将数字转换为16进制
	for(i=0; i<4; i++)
	{ 
        
		ge = show_num % 10;
		show_num = show_num / 10;	
		
		Wei = 0xf0;//置灭 消隐! 如果不先置灭,那么在位选重新赋值前,段选赋值后显示的是上一次位选的位置
		Duan = LED_NUM[ge];//置段选
		Wei = LED_WEI[i];//置亮
		Num_Delayms(1);
		
		if(show_num == 0)
		{ 
        
			break; //直接跳出节省时间
		}

	}
}

//数字延时函数
static void Num_Delayms(unsigned char c)
{ 
        
	unsigned char a;
	for(;c>0;c--)
		for(a=200;a>0;a--);
}

#include<reg52.h>

//传入要显示的数字
void Num_show(unsigned int);

消隐

如果先置段选,那么在置段选之前,需要先把位选置灭。


下一章:中断

下一章:

标签: 二极管值80

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台