数码管动态扫描
一、多位一体数码管
开发板上使用的是两个四位一体数码管,并且带有小数点,一个四位一体数码管共有12个引脚,各个位数码管共用一组a,b,c,d,e,f,g,dp引脚,通过另外4个引脚进行选位控制。
二、74HC138(3-8译码器)
两个四位一体数码管,如果每一位都用一个IO口线来控制的话,不够实用,使用74HC138可以通过3个输入端控制8个输出端其中一个为有效,可以大幅度节省IO口的使用,是拓展IO口的一种方法,以下为真值表
让两个四位一体数码管的每一位依次亮起,速度够快的情况下,因为人眼的视觉暂留,让人以为是同时亮起,达到同时用数码管显示多位数据的功能。
-
关于38译码器输入端0和1的问题
举个例子,比如我们现在要数码管的第0位显示,那0对应的三位二进制码就是000,然而在单片机输出方面是“0有效”,所以单片机输出给38译码器的三位二进制码就应该是111 -
如果还是没有理解工作原理的话,可以修改以下代码中的延时,把延时加大到一秒,会发现它从左往右一位一位显示,快到一定程度人就分不清了,就觉得他是同时在显示多位
三、代码部分
//建议使用模块化编程, 这样极大程度上方便了程序的移植,
//不同单片机之间只需要修改一下参数就可以直接用了
//代码功能:上电开机以后,8个数码管从左到右依次显示0~7
#include <STC8.H>
#include <intrins.h>
typedef unsigned char u8; //重定义,方便码字
typedef unsigned int u16;
sbit LSA = P2^2; //这三行是定义引脚,这三个引脚是38译码器的三个输入端
sbit LSB = P2^3; //
sbit LSC = P2^4;
u8 code smgtable[] = {0x3f,0x06,0x5b,0x4f, //共阴数码管码表
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void Delay100us() //@12.000MHz//100μs延时
{
unsigned char i, j;
_nop_();
i = 2;
j = 140;
do
{
while (--j);
} while (--i);
}
void SmgDisplay() //数码管显示函数
{
u8 i; //定义一个unsigned char型变量
for(i = 0;i<8;i++) //循环点亮每一位,一共8个
{
switch(i) //选择函数,选择哪位亮起
{
case(0):
LSA = 1 ; LSB = 1 ; LSC = 1 ; break;//此处0和1上面有详解
case(1):
LSA = 0 ; LSB = 1 ; LSC = 1 ; break;
case(2):
LSA = 1 ; LSB = 0 ; LSC = 1 ; break;
case(3):
LSA = 0 ; LSB = 0 ; LSC = 1 ; break;
case(4):
LSA = 1 ; LSB = 1 ; LSC = 0 ; break;
case(5):
LSA = 0 ; LSB = 1 ; LSC = 0 ; break;
case(6):
LSA = 1 ; LSB = 0 ; LSC = 0 ; break;
case(7):
LSA = 0 ; LSB = 0 ; LSC = 0 ; break;
}
P0 = smgtable[i];//选择当前位置要显示的字符(0~f)
Delay100us(); //此处延时建议为100μs,太快的话会变暗,太慢会闪
P0 = 0x00; //消影
}
}
void main()
{
while(1)
{
SmgDisplay();//引用函数,实现显示功能
}
}
如有错误欢迎指正,新手才疏学浅,请各位大佬见谅。