14.[STM32]数电学了三八译码器一脸懵,一文带你从理论到实践

  🍌
🍌🍌
作者简介:大家好啊,我叫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.数字电子技术基础 

资料已上传,需要自取

  • 16
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依点_DW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值