1. 程式人生 > >51單片機:IO口擴展芯片用法(74HC165,74HC595)

51單片機:IO口擴展芯片用法(74HC165,74HC595)

效果 urn bit put AD NPU com 數據 輸入

IO口擴展芯片,主要是解決單片機IO口太少。

74HC165:數據從並轉串

74HC595:數據從串轉並

兩種芯片,都是通過時序電路,加上移位功能,進行數據傳輸

74HC165:數據從並轉串。以下實例,實現8個獨立按鍵,控制數碼管的8段

技術分享圖片

#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

void delay( u16 i ){
    while( i-- );
}

#define GPIO_DIG    P0

sbit IN_SG 
= P1^6; sbit IN_DATA = P1^7; sbit IN_CLK = P3^6; u8 read_74HC165(){ u8 indata; u8 i; IN_SG = 0; //先置入數據 _nop_(); //等待一個機器周期 IN_SG = 1; //芯片切入 移位功能 _nop_(); indata = 0; for( i = 0; i < 8; i++ ){ //在時序電路作用下,移動8次,得到一個字節數據 indata = indata << 1; IN_CLK
= 0; _nop_(); indata |= IN_DATA; IN_CLK = 1; } return indata; } void main (){ u8 hc165_data; GPIO_DIG = 0x0; while( 1 ) { hc165_data = read_74HC165(); if( hc165_data != 0xFF ) { GPIO_DIG = ~hc165_data; } } }

74HC595:數據從串轉並,以下程序,實現流水燈效果

#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

void delay( u16 i ){
    while( i-- );
}

#define GPIO_DIG    P0

sbit SRCLK = P3^6; //移位寄存器時鐘
sbit STORE_RCLK = P3^5; //存儲寄存器時鐘
sbit SER = P3^4; //串口輸入數據

void hc595_send_data( u8 input_data ) {
    u8 i;
    SRCLK = 1;
    STORE_RCLK = 1;
    for( i = 0 ; i < 8; i++ ){
        SER = input_data >> 7; //從最高位開始傳送
        input_data <<= 1; //把次高位移到最高位

        SRCLK = 0; //時序脈沖
        _nop_();
        _nop_();
        SRCLK = 1;
    }
    STORE_RCLK = 0; //時序脈沖
    _nop_();
    _nop_();
    STORE_RCLK = 1; //把寄存器的數據 送到輸出口
}

void main (){
    u8 led_num;
    led_num = 0x01; //先讓D11點亮
    while( 1 ) {
        hc595_send_data( led_num );
        led_num = _crol_( led_num, 1 );
        delay( 50000 );
        delay( 50000 );
    }     
}

51單片機:IO口擴展芯片用法(74HC165,74HC595)