在我刚学单片机时总是感觉很难理解,今天分析下74HC595串口转并口 IO扩展芯片,一般我们在IO口不够用的情况下才能祭出此神器. 那么我们如何驱动此神器呢? “念咒:天灵灵地灵灵,Q1开”!
产品手册就不贴了,能看到文章的都是为驱动来的.
概念梳理
SI 串行数据输入端 == 相当于上面的水 0或者1
SCK 移位寄存器时钟,上升沿移位 == 相当于上面的内部的活塞
RCK 锁存寄存器时钟,上升沿存储 == 相当于搬走储水罐
驱动编写
第一步 放下储水罐 RCK =0;
第二步 把活塞压下去 SCK =0 ;
第三步 水通过出水口压到 储水罐 SI =0 或者 SI = 1;
第四步 把活塞提上去 SCK =1;
循环8次 把储水罐 水装满
第五步 提走储水罐 RCK =1;
是不是形象有属于理解 8 次水相当于8个数据 0或者1 ,对于输出就Q1–Q7电平状态
程序代码
#include "drvs.h"
#define SI_PORT (PortB)
#define SI_PIN (Pin05)
#define RCK_PORT (PortB)
#define RCK_PIN (Pin08)
#define SCK_PORT (PortB)
#define SCK_PIN (Pin09)
#define SI_ON() PORT_SetBits(SI_PORT,SI_PIN)
#define SI_OFF() PORT_ResetBits(SI_PORT,SI_PIN)
#define RCK_ON() PORT_SetBits(RCK_PORT,RCK_PIN)
#define RCK_OFF() PORT_ResetBits(RCK_PORT,RCK_PIN)
#define SCK_ON() PORT_SetBits(SCK_PORT,SCK_PIN)
#define SCK_OFF() PORT_ResetBits(SCK_PORT,SCK_PIN)
void Init_74HC595(void)
{
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit);
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Enable;
stcPortInit.enPullUp = Enable;
PORT_Init(SI_PORT, SI_PIN, &stcPortInit);
PORT_Init(RCK_PORT, RCK_PIN, &stcPortInit);
PORT_Init(SCK_PORT, SCK_PIN, &stcPortInit);
SI_OFF();
RCK_OFF();
SCK_OFF();
}
void Set_Show(uint8_t outdata)
{
RCK_OFF();
uint8_t i;
for(i=0;i<8;i++)
{
SCK_OFF();
if(outdata&0x80)
{
SI_ON();
}
else
{
SI_OFF();
}
SCK_ON();
outdata<<=1;
}
RCK_ON();
}
uint8_t temp595=0xFF;
uint8_t tempces=0xFF;
typedef enum
{
LED1,
LED2,
LED3,
LED4,
LED5,
LED6,
BUZZ,
BLED,
LED_ALL,
}IO74HC595;
void Set_IO_input(uint8_t com,uint8_t val)
{
if(com==LED_ALL)
{
if(val==0)
{
temp595=0xFF;
}
else
{
temp595=0x00;
}
}
else
{
if(val==0)
{
temp595|=0x01<<com;
}
else
{
temp595 &= ~(0x01<<com);
}
}
if(tempces!=temp595)
{
tempces = temp595;
Set_Show(tempces);
}
}
void CS_74HC595(void)
{
Set_IO_input(LED1,1);
}
总结
74HC595D 芯片驱动还是很简单很好用,做EMC实验建议和单片机连接的管脚加上拉电阻,可能有静电过不了的风险.
|