?? ??? 大家好,我叫你。DW,每天分享一些我学到的新知识,期待和大家一起进步 ?? ??? 系列专栏:STM32 ?? ??? ??? ??小实验目标:用38译码器驱动四位数字管 ??如果你写得不好,欢迎你纠正。
??38译码器芯片:SN74HC138N?? 2022年5月5日创作时间
1.译码器的基本概念
实现此功能的电路称为译码器。常用的译码器包括二进制译码器、二进制译码器和显示译码器。如下图所示:
当m=2^n称为二进制码器,因此二进制码器有n个输入端,2^n个输出端。译码器工作时,每组输入n变量代码,2^n只有一个输出是有效电平,其余输出是无效电平。常见的二进制译器有2-4线译码器(74LS139)、3-8线译码器(74LS4-16线译码器(74)LS154)等等。这次使用的是74HC138N译码器。逻辑图如下图所示:
从真值表可以看出,
2. 代码编写
在上节课上,单位数码管可以通过稍加修改点亮四位数码管。13.[STM32]从原理出发,带您驱动单位数码管
#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译码器真值表可以知道,。
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.数字电子技术基础
数据已上传,需要自取