14.[STM32]数电学了三八译码器一脸懵,一文带你从理论到实践
时间:2022-08-15 22:30:00
??
???
大家好,我叫你。DW,每天分享一些我学到的新知识,期待和大家一起进步
??
???
系列专栏:STM32
??
???
???
??小实验目标:用38译码器驱动四位数字管
??如果你写得不好,欢迎你纠正。??38译码器芯片:SN74HC138N??
2022年5月5日创作时间
1.译码器的基本概念
编码是编码的逆过程,它将输入二进制码或BCD代码翻译相应的状态信息。实现此功能的电路称为译码器。常用的译码器包括二进制译码器、二进制译码器和显示译码器。如下图所示:
当m=2^n称为二进制码器,因此二进制码器有n个输入端,2^n个输出端。译码器工作时,每组输入n变量代码,2^n只有一个输出是有效电平,其余输出是无效电平。常见的二进制译器有2-4线译码器(74LS139)、3-8线译码器(74LS4-16线译码器(74)LS154)等等。这次使用的是74HC138N译码器。74HC138N集成芯片有16个弓|脚,其中8脚应接地线,16 脚接 5V电源脚,A0、 A1、 A2弓|脚为二进制编码输入端(A2 为高位、A0为低位) ; Y0~Y7是译码输出端(Y7 为高位, Y0为低位) E1、E2A、E2B将允许端输入到信号也成为使能端,E1、E二是低电平有效E三是高电平有效。只有在允许端有效输入信号时,才能实现译码。逻辑图如下图所示:
38译码器真值表:
从真值表可以看出,当只有三个使能端有效时,E1=1,E2=E3=0时,译码器可以正常工作,8个输出Y7~Y0每行只有一中只有一个是0,另一个是1,互斥输出;只要不满足一个条件,译码器就不工作,输出都很高。
三八译码器及四位共阳极数码管接线图:
2. 代码编写
在上节课上,单位数码管可以通过稍加修改点亮四位数码管。13.[STM32]从原理出发,带您驱动单位数码管
我们需要定义位选端A2~A0选择数码管点亮,还需要定义使能端E3,E1和E接地可以不定义。
#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.数字电子技术基础
数据已上传,需要自取