输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用

上一篇博文我们使用矩阵键盘时面临的一个问题就是占用的端口多,以前我们扩展输出端口使用了74hc595,那么这里我们面临的是输入端口少需要扩展的问题,那么可以使用什么芯片来完成了?有没有直接可使用的芯片呢?

文章目录

  • 一、使用74hc148芯片
    • 1、148芯片的说明
    • 2、148芯片常见管脚图
    • 2、74HC(LS)148的级联
  • 二、在arduino实现矩阵简单中的应用
    • 1、电路及说明
    • 2、代码如下:
    • 3、运行效果:

文章原出处: https://blog.csdn.net/haigear/article/details/130025987

一、使用74hc148芯片

1、148芯片的说明

:74HC148是一个8位优先编码器,可以将多个输入数据按照优先级编码输出。A0-A3是编码输出端,,0-7是输入数据线,管脚说明如下:

管脚名 功能说明
A0~A2 编码输出端口,用于对0~7输入8个数据线的信号进行编码。
0~7 输入端口,不做特别说明
VCC、GND 电源端口。
EI 编码使能端口,低电平时编码有效,否则无效,级联时链接上一级的EO端
EO 编码状态输出端,有编码时输出时,或说正在编码时其端口输出为高电平,否则低电平
GS 测试端口,用于检测编码器的工作状态。处于编码状态时,GS为低电平,否则为高电平

2、148芯片常见管脚图

输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用_第1张图片
我们在proteus中使用的默认是没有VCC和GND
输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用_第2张图片

2、74HC(LS)148的级联

我们前面的博文曾经介绍过74HC系列的串行输入并行出处的芯片,这里我们采用8路并行输入的芯片74HC148(arduino官网也有介绍可以参考),使用它可以轻易的将8路的输入转化为3路输入(我们这里使用的是4x4的矩阵键盘,所以需要16路,所以就需要用148芯片进行级联了)。级联电路如下:

输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用_第3张图片
很明显,级联采用的是将各个芯片的三个A0~A2管脚和GS管脚用与非门连接,其中第位的管脚来自于级联初级的GS管脚,用两个GS管脚通过与非门的输出脚作为优先级标志位,从GS输出。
我们知道EI管脚低电平时才可以编码,而通过级联后只要初级芯片有编码输出初级芯片的EO管脚就会被置为高电平,后级芯片EI管脚也就会被置为高电平,所以后级芯片就不能编码了。

我们知道,与非门对低电平有效,当初级芯片编码时后级芯片EI为高电平,同时后级芯片所有的管脚输出高电平,输出到与非门的全为无效的高电平。这个时候,我们读取的就是初级芯片的编码信号。

二、在arduino实现矩阵简单中的应用

1、电路及说明

我们来看看,在键盘矩阵中的应用,这里很显然是采用了16路的按钮来单独输入,每个按钮的一端直接接的地。

输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用_第4张图片
这里我使用了两个BCD数码管,因为刚好二进制的输出刚好可以使用。不过信号要取反,因为A0~A2输出的都是低电平。第一个数码管测试的是一个后级148芯片的输出,在初级148芯片没有编码时,后级是可以正常输出的。
第二个数码管则输出的是级联后的效果,也就是说,一旦启动了初级芯片后后级芯片就不能输出了,这个时候第一个数码管(左边的那个数码管)就只能显示零了。

同时,我们还采用了串口输出到虚拟终端上,便于大家同步查看效果。

2、代码如下:

这里的程序只为将我们得到的端口信号转换为可以现在在虚拟终端显示的数值。其实思路有两种,一种是我在程序中注销的部分,采用的思路就是2的平方和逐位累加实现数值,但我们得到的是一个double类型的,不太好看,所以我最终采用了位运算和或运算得到了一个二进制的数值,还好Serial.println可以自动将二进制转化为十进制,所以刚好我们可以看到效果。

//定义输入引脚
const int controlPins[] = {2, 3, 4, 5};
int n=0b0000;
void setup() {
	for(int i=0;i<6;i++)
	  pinMode(controlPins[i], INPUT);
	Serial.begin(9600);
}
void loop() {
  n=0b0000;
  for (int j = 5; j > 1; j--) {
	int b=0b0001; 
	 if(digitalRead(j))
	{
	 //Serial.println(pow(2,j-2));
     //n=n+pow(2,j-2);
	 //n+=exp((j-2)*log(2));
       b=b<<(j-2); //哪一个端口检测到高电平则移位对应的位数
	   n=n|b;	   //和0进行或运算得到最终的数值
	}
	delay(100);
  }
 Serial.println(n);
}

3、运行效果:

输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用_第5张图片
文章随时可能更新,转载请注明出文章原出处:https://blog.csdn.net/haigear/article/details/130025987

你可能感兴趣的:(Arduino探索,Arduino,人工智能,扩展输入端口,嵌入式,arduino,74hc148)