74hc165级联用法(74hc165级联威廉希尔官方网站 图及程序)

IC应用威廉希尔官方网站 图

491人已加入

描述

  74HC165的级联威廉希尔官方网站 图

74HC165

  74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no.7A。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。

  74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互斥的串行输出(Q7和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地读取进寄存器内。

  而当PL为高时,数据将从DS输入端串行进入寄存器,在每个时钟脉冲的上升沿向右移动一位(Q0→Q1→Q2,等等)。利用这种特性,只要把Q7输出绑定到下一级的DS输入,即可实现并转串扩展。

  74HC165的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效时钟使能(CE)输入。CP和CE的引脚分配是独立的并且在必要时,为了布线的方便可以互换。只有在CP为高时,才允许CE由低转高。在PL上升沿来临之前,不论是CP还是CE,都应当置高,以防止数据在PL的活动状态发生位移。

  74HC165是一种并入串出的芯片,我们可以用它来做按键检测。它可以外接8个接键,然后将数据转成串行的送入单片机。如果用74HC165做键盘的话,能节省很多IO口。

  74hc165使用方法与级联程序

74HC165
74HC165

  LCD程序是采用wang1jin带您从零学单片机里面的1602程序修改。

  #include《AT89X52.H》

  #include“LCD.h”

  #defineuint16unsignedint

  #defineuint8unsignedchar

  #defineAUDIO_OUTP0

  ///////////////////////////////////////////////////////

  sbitHC165_CE=P1^1;//HC165控制端L有效

  sbitHC165_PL=P1^2;//HC165锁存引脚H高效

  sbitHC165_CLK=P1^0;//HC165时钟引脚

  sbitHC165_IN=P1^3;//HC165数据输出引脚

  uint8Address=0;//本地地址变量

  uint8Priority=0;//优先级变量

  ///////////////////////////////////////////////////////

  uint8LCD_DATA1[]={

  ‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’

  };

  voidInit_INT(void);

  voidRead_HC165(void);

  voidmain(void){

  Init_INT();LCD1602();

  Init_Lcd();while(1){

  Read_HC165();

  Display_LCD_Byte(0,0,‘0’);

  Display_LCD_Byte(0,1,‘x’);

  Display_LCD_Byte(0,2,LCD_DATA1[Address/16]);

  Display_LCD_Byte(0,3,LCD_DATA1[Address%16]);

  Display_LCD_Byte(1,0,‘0’);

  Display_LCD_Byte(1,1,‘x’);

  Display_LCD_Byte(1,2,LCD_DATA1[Priority/16]);

  Display_LCD_Byte(1,3,LCD_DATA1[Priority%16]);

  }

  }

  ////////////////////////////////////////////////定时器初始化

  //////////////////////////////////////////////voidInit_INT(void)

  {

  TMOD=0x01;

  ET0=1;

  TR0=1;

  EA=1;

  TH0=0xF8;

  TL0=0xC5;

  }

  //////////////////////////////////////////////

  //读取优先级和本机地址

  //当执行本次程序时

  //函数会将165的信号优先级

  //以及本机的地址送到Priority和Address

  //////////////////////////////////////////////

  voidRead_HC165(void)

  {

  uint8i=0;//临时变量

  uint8BJ_Address=0;

  uint8BJ_Priority=0;

  HC165_CE=0;//打开165选通端

  HC165_PL=0;//允许数据进入165

  for(i=0;i《8;i++)//读8次数据

  {

  HC165_PL=1;//允许数据移位

  HC165_CLK=0;//低电平时读取数据

  if(HC165_IN)//数据高位在前

  {

  BJ_Priority|=0x80》》i;

  }

  HC165_CLK=1;//数据移位

  }

  for(i=0;i《8;i++)//读取下一个165的数据

  {

  HC165_CLK=0;

  if(HC165_IN)

  {

  BJ_Address|=0x80》》i;

  }

  HC165_CLK=1;

  }

  HC165_CE=1;

  HC165_PL=0;

  Address=BJ_Address;

  Priority=BJ_Priority;

  }

  #ifndef_LCD_H_

  #define_LCD_H_

  #include《AT89X52.H》

  #defineLCD_DATAP3

  sbitRS=P1^5;

  sbitRW=P1^6;

  sbitEN=P1^7;

  voidLCD1602(void);

  voidRead_Busy(void);

  voidWrite_Lcd(unsignedcharValue,biti);voidInit_Lcd(void);

  voidDelay(unsignedinti);

  voidDisplay_LCD_Byte(unsignedchary,unsignedcharx,unsignedcharValue);

  #endif

  #include“LCD.h”

  voidLCD1602(void)

  {

  EN=0;

  RS=1;

  RW=1;

  LCD_DATA=0xFF;

  }

  voidRead_Busy(void)

  {

  LCD_DATA=0xFF;

  RS=0;

  RW=1;

  EN=1;

  //while(LCD_DATA&0x80);

  Delay(100);

  EN=0;}

  voidWrite_Lcd(unsignedcharValue,biti)//i=0写指令.i=1写数据;

  {

  Read_Busy();

  LCD_DATA=Value;

  RS=i;RW=0;

  EN=1;

  EN=0;

  }

  voidInit_Lcd(void)

  {

  Delay(15000);

  Write_Lcd(0x38,0);

  Delay(5000);

  Write_Lcd(0x38,0);

  Delay(5000);

  Write_Lcd(0x38,0);

  Write_Lcd(0x08,0);

  Write_Lcd(0x01,0);

  Write_Lcd(0x06,0);

  Write_Lcd(0x0c,0);

  }

  voidDisplay_LCD_Byte(unsignedchar

  y,unsignedcharx,unsignedcharValue)

  {

  y&=0x01;//y不能大于1x&=0x0F;//x不能大于15

  if(y)//是否显示在第二行;

  {

  x+=0x40;//显示在第二行,加0X40;

  }

  x+=0x80;

  Write_Lcd(x,0);//写入显示的位置

  Write_Lcd(Value,1);//写入显示数据}

  voidDelay(unsignedinti)

  {

  while(--i);

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分