4、数码管显示
数码管驱动电路采用2片74HC595芯片进行IO扩展,仅仅只需3Pin即可驱动需要16位引脚的数码管。74HC595是一个8位串行输入、并行输出的位移缓存器。
只有对74HC595的工作原理和时序要了解清楚,才能更好的理解和编程。
工作原理:
Ø1、74HC595是串行输入,即将一个字节Byte的数据通过8次以高低电平的形式送到数据引脚DS,且高字节先入,低字节后入,类似于堆栈;
Ø2、那么数据什么时候进入呢?需要SCK(SH_CP)时钟上升沿来讲8位bit数据移入到移位寄存器中;
直接编程讲解:
如图,首先假设wei变量=01101001,然后取出最高位,那么&0x80,得到0,那么执行else,数据引脚DS=0,然后通过SH_CP上升沿将这一位移入移位寄存器中,wei变量左移,将次高位放到高位与0x80相与,再次比较,直到8次比较完毕,DS引脚输入8位数据。
Ø3、最后通过ST_CP信号将8位数据进行锁存输出。
如图,ST_CP信号默认低电平,这里给高电平后,数据锁存输出,再次给低电平,等待下一次上升沿锁存输出。
2个74HC595级联的道理与一个类似,只是将2个字节的数据输入,通过SCK移位16次后,用ST_CP锁存输出。
时序:
若现在要显示最低位数码管为0,那么就需要位选为0xfe,段选为0x3f。
如图先送入位选0xfe,然后再送入0x3f,最后通过ST_CP锁存输出即可。仿真很大的好处就是可以通过虚拟示波器查看自己的时序是否正常,这样可以更好的理解为什么要这样编程。
注意前方高能——在所有电路都加上时,笔者电脑仿真时会报警,Simulation is not running in real time due to excessive CPU load。说人话:电脑不行了,超负荷了,该换电脑了,毕竟7年老电脑,唉。
想哭,就说时序没有问题,为什么仿真效果出不来呢?——删掉其它电路,只保留数码管部分,电路就可以8位数码管静态显示,否则就会出现一闪一闪的显示。
好了,这都是次要的,实物是不会出现这样的情况,只要电路正确,没有达到实际效果就是软件问题。
IO的位定义在上一节已经讲解,现不做过多说明,还是老样子,面向对象编程,毕竟有对象才是核心。
/**
******************************************************************************
* @file main.c
* @author Alex——小白
* @version V1.0
* @date 2021.1.20
* @brief 2片74HC595驱动数码管动态显示数字
* @store Proteus仿真店子
* @Link https://shop484534014.taobao.com/
* @Email 844545015@qq.com
******************************************************************************
* @attention All Rights Reserved
**/
#include <main.h>
/*定义驱动数码管显示段和位,此处为共阴极数码管编码,共阳极可直接取反即可*/
uint8_t table_duan[16]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x67,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uint8_t table_wei[8]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f
};
void main(void)
{
uint8_t i = 0;
SEG.SEG_Init();
while(1)
{
for(i=0;i<8;i++) //SEG8位一体显示0-7
{
SEG.SEG_Display(table_wei[i],table_duan[i]);
}
}
}
如需Proteus和IAR安装包以及AVR编程参考手册,请关注公众号:
Proteus仿真店子
可通过查看历史记录,查看例程
(若需Proteus和IAR安装包以及AVR编程参考手册,后台回复:AVR;若需其它设计,后台回复:AVR设计)