下面就讲下74HC165级联的原理:
直接贴出代码,相应的语句已做好注释:
/*** 74hc165.c ***/#include "74hc165.h"//初始化74hc165void _74hc165_init(void){ HC165_CE = 0; //初始化使能时钟,后面就不需再使能 HC165_PL = 1; //PL拉高,不读取按键状态 HC165_CLK = 1; //时钟拉高,便于产生上升沿}//读取两个74HC165级联void _74hc165_read_2byte(uchar date[2]){ uchar i; uint temp = 0; HC165_PL = 0; //PL拉低,读取按键状态 HC165_PL = 1; //PL拉高,停止按键读取if(HC165_OUT == 1) //等于1即并行输入D7引脚的按键被按下 temp |= 0x01; //最低位置1表示按键被按下,反之则没按键被按下for(i = 0; i < 15; i ) //因为最高位不用移位即可读取,故循环(16-1)次,依次把次高位移到最高位,第一级74HC165优先读取 { temp = temp << 1; HC165_CLK = 0; //HC165_CLK = 0 ——> HC165_CLK = 1 产生上升沿,次高位D(n-1)移到高位D(n) _nop_(); _nop_(); HC165_CLK = 1;if(HC165_OUT == 1) temp |= 0x01; }//将16位数据分离为两个8位数据 date[0] = (uchar)(temp & 0x00ff);//第二级74HC165的数据 date[1] = (uchar)((temp >> 8) & 0x00ff);//第一级74HC165的数据}