🍌
🍌🍌
作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步
🍋
🍋🍋
系列专栏:STM32
🍎
🍎🍎
🍎🍎🍎
🍎小实验目标:利用38译码器驱动四位数码管🍎
🍊如有写得不好的地方欢迎大家指正🍊🍊开发板:正点原子STM32F103Mini版🍊
🍊38译码器芯片:SN74HC138N🍊
创作时间:🍊🍊🍊2022年5月5日🍊🍊🍊
1.译码器的基本概念
译码是编码的逆过程,它将输入的二进制码或BCD码“译成”相应的状态信息。实现这种功能的电路称为译码器。常用译码器有二进制译码器、二-十进制译码器和显示译码器等。译码器功能框图如下图所示:
当m=2^n时,称为二进制译码器,所以二进制译码器有n个输入端,2^n个输出端。译码器工作时,对于n变量的每一组输入代码,2^n个输出中仅有一个为有效电平,其余输出均为无效电平。常见的二进制译码器有2-4线译码器(74LS139)、3-8线译码器(74LS138)和4-16线译码器(74LS154)等等。本次使用使用的是74HC138N译码器。74HC138N译码器该集成芯片共有16个弓|脚,其中8脚应接地线,16 脚接+5V电源脚,A0、 A1、 A2弓|脚为二进制编码输入端(A2 为高位、A0为低位) ; Y0~Y7为译码输出端(Y7 为高位, Y0为低位) E1、E2A、E2B为信号输入允许端,也成为使能端,E1、E2为低电平有效E3为高电平有效。只有信号输入允许端有效时输入的信号才有效才可能实现译码。逻辑图如下图所示:
38译码器真值表:
从真值表可以看出,只有3个使能端都有效时,既E1=1,E2=E3=0时,译码器才能正常工作,8个输出Y7~Y0在每一行译码中只有一个为0,其他都为1,既互斥输出;只要有一个条件不满足,则译码器不工作,输出全为高。
38译码器和四位共阳极数码管接线图:
2. 代码编写
在上节课,单位数码管的基础上,稍加修改就可以实现点亮四位数码管了。13.[STM32]从原理开始,带你驱动单位数码管
我们需要定义位选端A2~A0来选择那个数码管点亮,还需要定义使能端E3,E1和E2不定义接地即可。
#define A0 GPIO_Pin_0
#define A1 GPIO_Pin_1
#define A2 GPIO_Pin_2
#define E3 GPIO_Pin_3
#define CMD_PROT GPIOA
//电平配置
#define A0_High GPIO_SetBits(CMD_PROT,A0)
#define A0_Low GPIO_ResetBits(CMD_PROT,A0)
#define A1_High GPIO_SetBits(CMD_PROT,A1)
#define A1_Low GPIO_ResetBits(CMD_PROT,A1)
#define A2_High GPIO_SetBits(CMD_PROT,A2)
#define A2_Low GPIO_ResetBits(CMD_PROT,A2)
#define E3_High GPIO_SetBits(CMD_PROT,E3)
#define E3_Low GPIO_ResetBits(CMD_PROT,E3)
接下来就是编写一个选择哪个数码管点亮的函数,由38译码器真值表可以知道,假如我们选择第一个数码管点亮,那么位选端的状态为A2等于0,A1等于0,A0等于0,则输出端选择Y0,Y0接的 是第一个数码管,则第一个数码管被选中, 以此类推就可以实现点亮四位数码管了。
void DW_Smg_Dispaly(u8 num){
u8 code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-F
switch(num)
{
//000 选第一个数码管 Y0非 输出低电平
//第一个数码管显示0
case 0:
A2_Low;
A1_Low;
A0_Low;
GPIO_Write(Smg_PROT,0x00);//清屏减少鬼影
E3_High;
GPIO_Write(Smg_PROT,code[0]);
break;
//001 选第二个数码管 Y1非 输出低电平
// 第二个数码管显示1
case 1:
A2_Low;
A1_Low;
A0_High;
GPIO_Write(Smg_PROT,0x00);
E3_High;
GPIO_Write(Smg_PROT,code[1]);
break;
//Y2 非
case 2:
A2_Low;
A1_High;
A0_Low;
GPIO_Write(Smg_PROT,0x00);
E3_High;
GPIO_Write(Smg_PROT,code[2]);
break;
case 3:
A2_Low;
A1_High;
A0_High;
GPIO_Write(Smg_PROT,0x00);
E3_High;
GPIO_Write(Smg_PROT,code[3]);
break;
default:
break;
}
delay_ms(1);
}
最后编写main.c函数,即可显示我们想要的数据
//main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "DW_Smg.h"
int main(void)
{
delay_init(); //延时函数初始化
DW_Smg_UserConfig();
while(1){
for(u8 i=0;i<4;i++)
{
DW_Smg_Dispaly(i);
}
}
}
好了,一起来看结果吧!
用到的线比较多,大家接线时一定要多检查几遍。
今天的分享就到这里,谢谢大家的耐心阅读,如果觉得有用的话给个👍👍👍
🌜🌜🌜本章结束,我们下一章见🌜🌜🌜
参考资料:
1.STM32固件库手册
2.正点原子STM32不完全手册_库函数版本
3.参考视频
4.数字电子技术基础
资料已上传,需要自取