请问各位大侠,小弟刚学51单片机不久在做一个项目时需要很多输入按钮(大概22个按钮)发现用hc165联级的方式最多只能采集到两片HC165的联级的数据,第三片hc165的数据采集不到,代码如下:
#include "reg51.h"
#include "intrins.h
typedef unsigned char u8;
typedef unsigned int u16
/*74HC165管脚定义*/
sbit out_q7=P1^0;
sbit CLK=P1^1;
sbit PL=P1^2
sbit test=P1^3;
u16 HC165ReadData()
{
u16 Datavalue,inData1,inData2,inData3,i;
inData1=0;
inData2=0;
inData3=0;
Datavalue=0;
PL=0;
_nop_();
PL=1;//
_nop_();
/*读取第1片HC165数据*/
for(i=0;i<8;i++)
{
inData1=inData1<<1
CLK=0;
_nop_();
inData1|=out_q7;
CLK=1;
_nop_();
}
/*读取第2片HC165数据*/
for(i=0;i<8;i++)
{
inData2=inData2<<1
CLK=0;
_nop_();
inData2|=out_q7;
CLK=1;
_nop_();
}
/*读取第2片HC165数据*/
for(i=0;i<8;i++)
{
inData3=inData3<<1
CLK=0;
_nop_();
inData3|=out_q7;
CLK=1;
_nop_();
}
Datavalue=inData1;
Datavalue<<=8;
Datavalue|=inData2;
Datavalue<<=8;
Datavalue|=inData3;
return(Datavalue);
}
void delay(u16 y)
{
while(y--);
}
void main()
{
u16 hc165value;
while(1)
{
hc165value=HC165ReadData();
if((hc165value&(1<<0))==0) //此处范围只能设置0-15,超过这个范围结果一直是0小灯一直闪烁
test=0;
delay(20000);
test=1;
delay(20000);
}
}
|