此内容适合小白和初学者,数码管为共阴极数码管
上图为数码管动态扫描的电路图,其中两个芯片都是74HC573(后面上面那个简称U2,而下面那个简称U3),U2是输出位码的,也就是控制数码管具体显示0~9的某个数,U3是输出段码的,用于控制具体在第几位显示,在写代码时一般是先写段码,再写位码
两个芯片中C端口为锁存端口(也可称为关卡),其作用为让芯片是否接收J3输入的数据,当C端口为高电平是为接收,低电平是为不接收,也就是C端口输入1时,芯片接收J3输入的数据,反之就不接收。
下面为具体代码
#include<reg52.h> //头文件一般不用改
#define DataPort P0 //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1; //定义锁存端口 位锁存
sbit LATCH2=P2^2; // 段锁存
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //八个编码分别对应八个数码管
void main()
{
while(1)
{
DataPort=duan[0]; //控制P0输出0xF7
LATCH2=1; //打开U3的关卡;控制P0的输出数据输入到芯片U3中
LATCH2=0; //关闭关卡,断开P0输入的数据
DataPort=wei[2]; //控制P0输出0x5B,在程序里排第一的序号为0
LATCH1=1; //打开U2的关卡;控制P0的输出数据输入到芯片U2中
LATCH1=0; //关闭关卡,断开P0输入的数据
}
}
实验现象为数码管最右边显示2;部分因为线路不一样是最左边
进阶代码:同时显示两个数字
#include<reg52.h> //头文件一般不用改
#define DataPort P0 //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1; //定义锁存端口 位锁存
sbit LATCH2=P2^2; // 段锁存
void Despuley(unsigned char y,unsigned char m); //声明函数
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //八个编码分别对应八个数码管
void main()
{
while(1)
{
Despulay(0,1);
Despulay(1,2);
}
}
void Despuley(unsigned char y,unsigned char m)
{
DataPort=duan[y]; //控制P0输出0xF7
LATCH2=1; //打开U3的关卡;控制P0的输出数据输入到芯片U3中
LATCH2=0; //关闭关卡,断开P0输入的数据
DataPort=wei[m]; //控制P0输出0x5B,在程序里排第一的序号为0
LATCH1=1; //打开U2的关卡;控制P0的输出数据输入到芯片U2中
LATCH1=0; //关闭关卡,断开P0输入的数据
}
该实验现象会有重影,而且亮度不高,实验现象这里就不展示了
要消除重影就要知道重影是怎么产生的:
重影产生是因为芯片U2输入了一组数据后,当U3的数据更改时,U2的数据还在持续输出,例如红和蓝两种颜料要从一根管道流出,不能混合在一起,当其中一种颜料流过后在管道里面还会有残留,要把残留的先洗去,再流入另外一种颜料,这里就是要加入程序来洗掉残余的颜料
亮度不高是因为没有加入延时
下面是消除残影和加入延时
#include<reg52.h> //头文件一般不用改
#define DataPort P0 //定义输出端口P0的名字,提高程序的可读性
sbit LATCH1=P2^1; //定义锁存端口 位锁存
sbit LATCH2=P2^2; // 段锁存
void Despuley(unsigned char y,unsigned char m); //函数声明
void Delay(unsigned int t); //函数声明
unsigned char wei[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //八个共阴极数码管0~9的16进制编码
unsigned char duan[8]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //八个编码分别对应八个数码管
void main()
{
while(1)
{
Despulay(0,1);
Despulay(1,2);
}
}
void Despuley(unsigned char y,unsigned char m)
{
DataPort=duan[y]; //控制P0输出0xF7
LATCH2=1; //打开U3的关卡;控制P0的输出数据输入到芯片U3中
LATCH2=0; //关闭关卡,断开P0输入的数据
DataPort=wei[m]; //控制P0输出0x5B,在程序里排第一的序号为0
LATCH1=1; //打开U2的关卡;控制P0的输出数据输入到芯片U2中
LATCH1=0; //关闭关卡,断开P0输入的数据
Delay(50); //用于延时
DataPort=0x00; //消除重影
LATCH1=1; //
LATCH1=0; //
}
void Delay(unsigned int t)
{
while(t--);
}
好了,这次就讲到这,有什么错误或问题的可以评论或私信我,感谢!!!!
关注我后面会有更加深入的讲解。。。。。