原理圖如下:
1.png (58.1 KB, 下載次數: 68)
下載附件
2018-9-4 15:09 上傳
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; }
|