利用两个LS165级联,怎么只能控制一位拨码开关?帮我看看...

2020-01-27 11:42发布

/*******************************************************************************

********************************************************************************/
#include <reg52.H>
#include <intrins.h>

#define  NOP()   _nop_()   /* 定义空指令 */

//SPI 接口
sbit    CLK    = P1^5;           //串行时钟
sbit    IN_PL  = P1^6;    //把数据加载到锁存器中
sbit    IN_Dat = P1^7;    //数据通过P1.7脚移进单片机内处理

unsigned long ReHC74165(void);         //函数声名
//void beep();  
void Delay(void)
{
   unsigned char i , j;
   for(i=250;i>0;i--)
     for(j=250;j>0;j--);
}  

/********************************************************
*        主函数                                                                                                 *
*                                                                                                                 *
********************************************************/
main()
  {         
   unsigned char i;

  while(1)
  {
    unsigned long  Input=ReHC74165();//调用165驱动程序
     
     P2 = 0xff;          //清除
         P3 = 0xff;

         P2 = Input;
         Delay();
         Delay();
            for(i=0; i<8; i++)
    {
          Input=Input>>1;
     }
         P3 = Input;
         Delay();
         Delay();


   }   
   
}



unsigned long ReHC74165(void)
{  
  unsigned char i;
  unsigned long indata;
               
   IN_PL=0;
   NOP();    //短暂延时 产生一定宽度的脉冲
   IN_PL=1;         //将外部信号全部读入锁存器中
   NOP();
              
   indata=0;   //保存数据的变量清0  
   for(i=0; i<16; i++)
    {
          indata=indata<<1;         //左移一位
      if(IN_Dat==1)indata=indata+1;        //如果IN_Dat检测到高电平 保存数据的变量加1
          CLK=0;   //时钟置0
      NOP();
      CLK=1;   //时钟置1          
        }
   
   return(~indata);         //将保存数据的变量取反后返回
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。