嵌入式开发–IO口扩展,输出引脚
嵌入式开发经常遇到IO口不够的情况,更换引脚更多的单片机是一种选择,但最近两年单片机的价格翻着跟斗的往上涨,替代方便也有,就是通过IO口扩展芯片来实现。
本段说明摘自明微电子的说明书:
74HC595D 是一种具有8 位锁存、8 位串行输入、 8 位串/并行输出、 串—并移位寄存器和三态输出功能的通用LED 驱动芯片。具有8 位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器是分别的时钟。数据在SCK 的上升沿输入,在RCK 的上升沿进入的存储寄存器中去。移位寄存器有一个串行移位输入(SER),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8 位的,具备三态的总线输出,当使能时,存储寄存器的数据输出到总线。它可以与其他公司生产的74HC595 完全兼容
下图截取自NXP公司的说明书
两款芯片功能一样,引脚定义一样,只是用了不同的符号来表示。
由于两家公司的描述不同,在此特别说明一下
数据从
14脚:数据引脚 DS或SER 数据从该引脚送入
9脚:Q7S或Q7‘ 当数据超过8位时,最先送入的数据从该引脚溢出,本芯片只存储8位以内的数据。
11脚 移位时钟信号,
12脚 锁丰时钟信号
电路图
用了2片芯片做级联,也可以支持更多的芯片,比如4片,同样只需要MCU端用3根IO口线驱动。
芯片的驱动
对着这个表格来操作就行,
13脚G 为低时,芯片工作。
10脚SCLR 为低时,芯片数据清空,正常工作时接高即可。
11脚SCK 移位时钟上升沿时,将14脚的数据保存到移位寄存器内
12脚RCK 锁存时钟上升沿时,将移位寄存器内的数据输出,完成串入并出的转换。
芯片驱动方式与I2C接口很相近,差不多自己写两句就好了。很简单就没有再写注释
#define HC595_SDA_PORT GPIOA
#define HC595_SDA_PIN GPIO_PIN_9
#define HC595_SFT_PORT GPIOA
#define HC595_SFT_PIN GPIO_PIN_10
#define HC595_LCK_PORT GPIOA
#define HC595_LCK_PIN GPIO_PIN_8
#define HC595_SDA(n) (n?HAL_GPIO_WritePin(HC595_SDA_PORT,HC595_SDA_PIN, GPIO_PIN_SET):HAL_GPIO_WritePin(HC595_SDA_PORT,HC595_SDA_PIN,GPIO_PIN_RESET))
#define HC595_SFT(n) (n?HAL_GPIO_WritePin(HC595_SFT_PORT,HC595_SFT_PIN, GPIO_PIN_SET):HAL_GPIO_WritePin(HC595_SFT_PORT,HC595_SFT_PIN,GPIO_PIN_RESET))
#define HC595_LCK(n) (n?HAL_GPIO_WritePin(HC595_LCK_PORT,HC595_LCK_PIN, GPIO_PIN_SET):HAL_GPIO_WritePin(HC595_LCK_PORT,HC595_LCK_PIN,GPIO_PIN_RESET))
void hc595_display(u16 in)
{
u8 i=0;
for(i=0; i<16; i++)
{
if((in&0x01) == 0)
HC595_SDA(0);
else
HC595_SDA(1);
delay_us(1);
HC595_SFT(1);
delay_us(1);
HC595_SFT(0);
delay_us(1);
in>>=1;
}
HC595_LCK(1);
delay_us(1);
HC595_LCK(0);
delay_us(1);
}
在这里要批评一下明微电子,说明书里面用的图能做得好一点么,下面这个图是给人看的么
看看人家NXP的图
输入扩展
如果同时需要输入IO扩展的话,还有另一款国产IC可供选择,沁恒的CH423S,没错,就是大名鼎鼎的CH340那家公司。2线控制,还有一根可选的中断线,非常不错,只是价格比74HC595要贵些。将来用到了再和大家分享。
只是芯片手册中有这样一句话,让我有点担心其可靠性。
转念一想,CH340不是用得好好的么,同一家公司的产品,不至于吧。