原理图如下:
ST_VAV,DIN_VAV,CLK_VAV,OE_VAV接单片机,ST_1,DIN_1,CLK_1,OE_1反逻辑输出。
问题:分两次发送8位数据,两次最后发送的那一位数据丢失。
例如:(1)发送高8位0xFF,低8位0时,HEF4094输出0x007F。
(2)发送高8位0,低8位0xFF时,HEF4094输出0x7F00。
代码如下: #define ST_4094_1 PCout(12) //PC12 #define OE_4094_1 PDout(2) //PD2 #define DIN_4094_1 PCout(11) //PC11 #define CLK_4094_1 PCout(10) //PC10 void vavle_init(void) //初始化 { //初始化IO口 RCC->APB2ENR|=1<<4; //使能PORTC时钟 控制端口PC10-12 RCC->APB2ENR|=1<<5; //使能PORTD时钟 控制端口PD2 GPIOD->CRL&=0XFFFFF0FF;// GPIOD->CRL|=0X00000300;//PD2 推挽输出 GPIOD->ODR|=1<<2; //PD2 输出高 GPIOC->CRH&=0XFFF000FF;// GPIOC->CRH|=0X00033300;//PC10-12 推挽输出 GPIOC->ODR|=7<<2; //PC10-12 输出高 OE_4094_1=0; //反逻辑 } void TransByteTo4094_ElecExpValve1(u8 dat16_09,u8 dat08_01) //2个HEF4094锁存16位数据,并行输出,dat16_09高8位, dat08_01低8位。 { u8 j; u8 i,tt; CLK_4094_1=1; ST_4094_1 =1; tt=dat16_09; //先送高8位 for(i=0;i<8;i++) { j= tt &(0x01); if(j==1) { DIN_4094_1=0;} else { DIN_4094_1=1;} CLK_4094_1=1; //CLK引脚的上升沿把数据送入寄存器 delay_us(10); CLK_4094_1=0; delay_us(10); tt=tt>>1; } tt= dat08_01; //再送低8位 for(i=0;i<8;i++) { j= tt &(0x01); if(j==1) { DIN_4094_1=0;} else { DIN_4094_1=1;} CLK_4094_1=1; //CLK引脚的上升沿把数据送入寄存器 delay_us(10); CLK_4094_1=0; delay_us(10); tt=tt>>1; } ST_4094_1 =1; //ST引脚把两个寄存器的数据更新输出到HEF4094的输出引脚上并且锁存起来 delay_us(10); ST_4094_1 =0; delay_us(10); CLK_4094_1=1; //CLK拉低,抗干扰就增强 ST_4094_1 =1; DIN_4094_1=1; } |