#include<reg52.h> #include "intrins.h" #define uchar unsigned char #define uint unsigned int sbit SHLD=P1^7; //1脚SH/LD移位控制/置入控制(低电平有效) sbit CLK=P1^6; //2脚CLK,CLK INH时钟输入端(上升沿有效) sbit QH=P1^5; //9脚QH输出端 uint data1=0, data2=0; data3=0; void XD_74hc165_Readdata(void) { uchar i; //位移时使用 unsigned char readdata1, readdata2, readdata3;//获取数据时使用 readdata1 = 0x00; //初始值 readdata2 = 0x00; readdata3 = 0x00;
SHLD=0; //将165外部端口数据装入内部寄存器 置入控制端口(低电平有效) _nop_(); SHLD=1; //抬高为移位准备 移位控制(高电平有效) /****************读取第一个74HC165***************************************************/ for(i=0;i<8;i++) //移动8位字节 { readdata1<<=1; //每次左移一位 CLK=0; //时钟低 _nop_(); readdata1|=QH; //先接收高位 CLK=1; //时钟高,上升沿下一个数据移出 _nop_(); } /****************读取第二个74HC165***************************************************/ for(i=0;i<8;i++) //移动8位字节 { readdata2<<=1; //每次左移一位 CLK=0; //时钟低 _nop_(); readdata2|=QH; //先接收高位 CLK=1; //时钟高,上升沿下一个数据移出 _nop_(); } /****************读取第三个74HC165***************************************************/ for(i=0;i<8;i++) //移动8位字节 { readdata3<<=1; //每次左移一位 CLK=0; //时钟低 _nop_(); readdata3|=QH; //先接收高位 CLK=1; //时钟高,上升沿下一个数据移出 _nop_(); }
data1=readdata1; //返回接收字符 data2=readdata2; data3=readdata3; }
void main() { XD_74hc165_Readdata(); while(1) { P2=data1; //显示 P3=data2; P0=data3; } }
|