【普中51单片机教程 - 3】:数码管(静态数码管和动态数码管)

数码管介绍


数码管简介

  1. 共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,给阴极一个低电平就可以点亮二极管。
    在这里插入图片描述

  2. 共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地,给阳极一个高电平就可以点亮二极管。
    在这里插入图片描述

数码管的显示原理

举个例子:对于共阴数码管,ABCDEFG和DP(小数点)都由P0口控制,若想让数码管显示数字0,即ABCDEF都为1(高电平),DP和G都为0(低电平),即P0.7——>P0.0:0011 1111(DPGFEDCBA),也就是0x3f,所以给令P0=0x3f即可让共阴数码管显示数字0。
若想让共阳数码管显示数字0,则对0x3f取反即可,即~0x3f。
在这里插入图片描述

静态数码管


数码管静态显示原理

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
在这里插入图片描述

软件设计

功能:控制静态数码管显示数字0,即让P0端口输出数字0的段码0x3f(共阴)。

#include<reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_PORT P0

u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; //共阴0-F

void main()
{
	while(1)
	{
		SMG_PORT = gsmg_code[0];
	}
}

在这里插入图片描述

动态数码管


数码管动态显示原理

动态显示是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。

下图所示的数码管显示原理:通过74HC138译码器,即三八译码器来控制数码管的位选,三输入八输出,减少了IO口的使用。当P22=P23=P24=1,即都为高电平时,则CBA:111=7,所以选择的是LED8数码管显示。

在这里插入图片描述

软件设计

功能:控制动态数码管从左至右显示数字0-F。
以下程序中有一个地方需要注意:SMG_PORT = 0x00;
其目的为了消影,就是把上一个数据对前面的数码管的影响消除掉。

#include<reg51.h>
#include<intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define SMG_PORT P0

u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void SMG_SHOW()
{
	u8 i = 0;
	for(i=0;i<16;i++)
	{
		switch(i)
		{
			case 0:LSC=1;LSB=1;LSA=1;break;
			case 1:LSC=1;LSB=1;LSA=0;break;
			case 2:LSC=1;LSB=0;LSA=1;break;
			case 3:LSC=1;LSB=0;LSA=0;break;
			case 4:LSC=0;LSB=1;LSA=1;break;
			case 5:LSC=0;LSB=1;LSA=0;break;
			case 6:LSC=0;LSB=0;LSA=1;break;
			case 7:LSC=0;LSB=0;LSA=0;break;
			case 8:LSC=1;LSB=1;LSA=1;break;
			case 9:LSC=1;LSB=1;LSA=0;break;
			case 10:LSC=1;LSB=0;LSA=1;break;
			case 11:LSC=1;LSB=0;LSA=0;break;
			case 12:LSC=0;LSB=1;LSA=1;break;
			case 13:LSC=0;LSB=1;LSA=0;break;
			case 14:LSC=0;LSB=0;LSA=1;break;
			case 15:LSC=0;LSB=0;LSA=0;break;
		}
		SMG_PORT = gsmg_code[i];
		Delay1000ms();
		SMG_PORT = 0x00; //目的为了消影,就是把上一个数据对前面的数码管的影响消除掉
	}
}
void main()
{
	while(1)
	{
		SMG_SHOW();
	}
}
  • 汇编语言实现
ORG 0000H
AJMP MAIN

MAIN:
     MOV P0, #00H ;目的是消影,把上一个数据对前面的影响消除掉
     MOV R3, #0   ; 位选码循环
     MOV R4, #0   ; 段选码循环
     
WEIXUAN:
      MOV DPTR, #TAB2    ; TAB2为位选码
      MOV A, R3         
      MOVC A, @A+DPTR    ; 查位选码
      MOV P2, A
      MOV A, R3
      INC A
      MOV R3, A
      CJNE A, #9, DUANXUAN
      MOV R3, #0
      AJMP WEIXUAN
      
DUANXUAN:
      MOV DPTR, #TAB1    ; TAB1为段选码
      MOV A, R4
      MOVC A, @A+DPTR
      MOV P0, A
      MOV A, R4
      INC A
      MOV R4, A
      LCALL DELAY500MS
      CJNE A, #16, WEIXUAN
      MOV R4, #0
      AJMP WEIXUAN

DELAY500MS:   ;误差 0us
    MOV R7,#0CDH
DL1:
    MOV R6,#74H
DL0:
    MOV R5,#09H
    DJNZ R5,$
    DJNZ R6,DL0
    DJNZ R7,DL1
    RET           

; 共阴数码管:0~F    段码表
TAB1: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 07FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H,

; 位码表
; 数码管位选,由P2.2、P2.3、P2.4控制,又因为P2口控制LED,高电平灭,低电平亮
TAB2: DB 0FFH, 0FBH, 0F7H, 0F3H, 0EFH, 0EBH, 0E7H, 0E3H 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

街 三 仔

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值