一、前言
数码管进行显示成功后,可根据自己的想法进行改进。本设计采用八位数码管进行循环显示0~f,其中涉及到段码及位码的调用,可更深一步的理解数码管的使用。
二、芯片使用
1、74hc245
本设计中数码管的段选使用74hc245进行驱动。可以为数码管提供足够且稳定的电压,数码管与74hc245芯片之间需加电阻进行分压以保护数码管不会因为电压过大而烧毁。
芯片引脚功能:
第1脚DIR,为输入输出端口转换用, DIR=“1”高电平时信号由“A”端输入“B”端输出, DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A1=B1﹑﹑﹑﹑﹑﹑A8=B8,A1与B1是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。 第11~18脚“B”信号输入输出端,功能与“A”端一样,不在描述。
第19脚G,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用
第10脚GND,电源地。
第20脚VCC,电源正极。
序号 | 名称 | 功能 |
---|---|---|
1 | DIR | 输入输出转换端口,高电平A到B,低电平B到A。 |
2~9 | A0~A7 | 输入输出端口 |
10 | GND | 电源负极 |
11~18 | B7~B0 | 输入输出端口 |
19 | OE | 使能端,高电平信号不导通,低电平导通 |
20 | VCC | 电源正极 |
2、74ls138译码器
本设计中数码管的位选使用138译码器进行驱动,使用的数码管为共阴极数码管。
芯片引脚功能:
A0~A2对应Y0——Y7;A0,A1,A2以二进制形式输入,然后转换成[十进制,对应相应Y的序号输出低电平,其他均为高电平;
序号 | 名称 | 功能 |
---|---|---|
1~3 | A0、A1、A2 | 地址输入端 |
4、5 | E3、E2 | 选通端(低电平有效) |
6 | E1 | 选通端(高电平有效) |
8 | GND | 电源负极 |
7、9~15 | Y7~Y0 | 输出端 |
16 | VCC | 电源正极 |
三、硬件连接
实物图
原理图
最小单片机系统
驱动电路
位码控制电路
四、软件代码
main主函数
主函数较为简单,对数码管显示函数的调用,以及定时器函数的初始化。
void main()
{
Timer0Init(); //定时器0初始化
while(1)
{
DigDisplay(); //数码管显示函数
}
}
void Timer0() interrupt 1
定时器函数,用于调整循环的快慢以及显示数字的变化
TH0=(65536-6000)/256; //给定时器赋初值,定时10ms
TL0=(65536-6000)%256;
a--;
if(a==0)
{
j++;
a=100;
if(j==16)
{
j=0;
}
}
大致讲解:在进行位选后,相对应的段码就会选出来。程序中i用于位选。对应的段码是m。m=j+i是由于0~f有16位
数码管段码、位码显示函数。
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位
}
m=j+i;
if(m>=16)
m=m-16;
P0=smgduan[m];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
五、效果展示
视频拍摄效果较差多多包涵。
数码管循环显示数字仿真演示
数码管循环显示数字实物演示
六、代码链接
关注公众号“小小创客者”回复“数码管循环显示数字”获得代码及仿真,如有错误欢迎指正。