[KungFu8位 MCU] IO口扩展芯片用法(74HC165,74HC595)

[复制链接]
 楼主| magicoctoy 发表于 2019-2-26 15:22 | 显示全部楼层 |阅读模式
IO口扩展芯片,主要是解决单片机IO口太少。

74HC165:数据从并转串

74HC595:数据从串转并

两种芯片,都是通过时序电路,加上移位功能,进行数据传输

 楼主| magicoctoy 发表于 2019-2-26 15:22 | 显示全部楼层
74HC165:数据从并转串。以下实例,实现8个独立按键,控制数码管的8段
916925c74e94259ea6.png
 楼主| magicoctoy 发表于 2019-2-26 15:22 | 显示全部楼层
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. void delay( u16 i ){
  6.     while( i-- );
  7. }

  8. #define GPIO_DIG    P0

  9. sbit IN_SG = P1^6;
  10. sbit IN_DATA = P1^7;
  11. sbit IN_CLK = P3^6;

  12. u8 read_74HC165(){
  13.     u8 indata;
  14.     u8 i;
  15.     IN_SG = 0; //先置入数据
  16.     _nop_(); //等待一个机器周期
  17.     IN_SG = 1; //芯片切入 移位功能
  18.     _nop_();
  19.    
  20.     indata = 0;
  21.     for( i = 0; i < 8; i++ ){ //在时序电路作用下,移动8次,得到一个字节数据
  22.         indata = indata << 1;
  23.         IN_CLK = 0;
  24.         _nop_();
  25.         
  26.         indata |= IN_DATA;
  27.         IN_CLK = 1;   
  28.     }
  29.     return indata;
  30. }

  31. void main (){
  32.     u8 hc165_data;
  33.     GPIO_DIG = 0x0;
  34.     while( 1 ) {
  35.         hc165_data = read_74HC165();
  36.         if( hc165_data != 0xFF ) {
  37.             GPIO_DIG = ~hc165_data;
  38.         }
  39.     }   
  40. }
 楼主| magicoctoy 发表于 2019-2-26 15:23 | 显示全部楼层
74HC595:数据从串转并,以下程序,实现流水灯效果
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. void delay( u16 i ){
  6.     while( i-- );
  7. }

  8. #define GPIO_DIG    P0

  9. sbit SRCLK = P3^6; //移位寄存器时钟
  10. sbit STORE_RCLK = P3^5; //存储寄存器时钟
  11. sbit SER = P3^4; //串口输入数据

  12. void hc595_send_data( u8 input_data ) {
  13.     u8 i;
  14.     SRCLK = 1;
  15.     STORE_RCLK = 1;
  16.     for( i = 0 ; i < 8; i++ ){
  17.         SER = input_data >> 7; //从最高位开始传送
  18.         input_data <<= 1; //把次高位移到最高位

  19.         SRCLK = 0; //时序脉冲
  20.         _nop_();
  21.         _nop_();
  22.         SRCLK = 1;
  23.     }
  24.     STORE_RCLK = 0; //时序脉冲
  25.     _nop_();
  26.     _nop_();
  27.     STORE_RCLK = 1; //把寄存器的数据 送到输出口
  28. }

  29. void main (){
  30.     u8 led_num;
  31.     led_num = 0x01; //先让D11点亮
  32.     while( 1 ) {
  33.         hc595_send_data( led_num );
  34.         led_num = _crol_( led_num, 1 );
  35.         delay( 50000 );
  36.         delay( 50000 );
  37.     }     
  38. }
wakayi 发表于 2019-3-3 13:56 | 显示全部楼层
非常感谢楼主分享啊
zcskj 发表于 2019-3-15 11:05 | 显示全部楼层
   真诚欢迎电子行业的朋友们加入电子芯片交流群共同探讨 QQ群号 561558502
nbnhnjnm 发表于 2019-3-29 16:20 | 显示全部楼层
IO口扩展以及IO口复用都可以用较少的端口完成更多的功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

236

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部