单片机开发 — 数码管显示
一、电路图
二、138译码器
用三个IO控制八个IO(三个控制 IO 就像三位数的二进制,选中的一个IO为低电平,其余为高电平,如:111 —>Y7为低电平,其余为高电平)
三、74HC245
74HC245 为八总线收发器芯片,即可以将数据从A 总线端口传送到B 总线端口,也可将数据从B 总线端口传送到A 总线端口。传送方向由方向控制管脚DIR(芯片1 脚)输入的逻辑电平而定。
实验中用于提高驱动能力,增加数码管的亮度。
四、电路原理
74HC245芯片的LE引脚要接VCC,提高P00~P07驱动能力,增加数码管的亮度。根据电路图可知,使用P00 ~ P07 同时控制各位数码管显示,使用P22 ~ P24控制哪位数码管有效(用138译码器使LED端为低电平)。每次显示不同位的数码管并不断切换,可以形成同时显示的错觉。
五、代码
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//数码管显示0~F的P0值
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[i];//数码管显示数字
delay(100); //防止闪得太快,导致数码管不正常发光
}
}
void main()
{
while(1)
{
DigDisplay(); //数码管显示函数
}
}