单片机编程中经常遇到IO不够用的情况,于是使用138译码器,将3个IO拓展为8个。
138译码器一共有16个引脚,功能如下:
引脚 | 符号 | 功能 |
15,14,13,12,11,10,9,7 | Y0-Y7 | 输出(低电平有效) |
1,2,3 | A0-A2 | 输入 |
4,5 | E1,E2 | 使能(低电平有效) |
6 | E3 | 使能(高电平有效) |
8 | GND | 地 |
16 | VCC | 电源(5V) |
输出真值表如下:
L为0,H为1。
简单理解为对A0-A2进行加权:
A2——4
A1——2
A0——1
例如A2、A1、A0的值为1、1、0时,对应输出为4X1+2X1+1X0=6,因此Y6输出0,其它口输出1。
那最后如何接线呢:如果只用一个138译码器,E1、E2接地,E3接5V,A0、A1、A2接单片机IO,分别输入1/0即可,附32参考程序。
void W74HC138_WriteByte(u8 h)
{
u8 a,b,c;
switch(h)
{
case 0: a=1; b=1; c=1; break;
case 1: a=0; b=1; c=1; break;
case 2: a=1; b=0; c=1; break;
case 3: a=0; b=0; c=1; break;
case 4: a=1; b=1; c=0; break;
case 5: a=0; b=1; c=0; break;
case 6: a=1; b=0; c=0; break;
case 7: a=0; b=0; c=0; break;
}
GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)(a));
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(b));
GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(c));//分别写入数据
}