数码管介绍
数码管简介
-
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,给阴极一个低电平就可以点亮二极管。
-
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(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