原创 利用74LS165扩展输入口

2008-8-20 16:51 2012 7 7 分类: 模拟
//利用74LS165扩展输入口,可以串联很多个
//不要小看这个小小程序,有时还会弄错,请看错误部分吧。


#include <reg51.h>
//165
sbit p_sl=P1^7;
sbit p_cp=P1^6;
sbit p_out=P1^5;


unsigned char input_165(void) {
a0=p_out;
p_cp=0;p_cp=1;a1=p_out;
p_cp=0;p_cp=1;a2=p_out;
p_cp=0;p_cp=1;a3=p_out;
p_cp=0;p_cp=1;a4=p_out;
p_cp=0;p_cp=1;a5=p_out;
p_cp=0;p_cp=1;a6=p_out;
p_cp=0;p_cp=1;a7=p_out;
p_cp=0;p_cp=1;
return(ACC);
}


 


//错误的,因为在p_sl从0到1跳变后,p_out已经输出Qh的值,如果再用p_cp=0;p_cp=1;驱动时钟线,a0读入的是Qg的值。
unsigned char input_165_error(void) {
p_cp=0;p_cp=1;a0=p_out;
p_cp=0;p_cp=1;a1=p_out;
p_cp=0;p_cp=1;a2=p_out;
p_cp=0;p_cp=1;a3=p_out;
p_cp=0;p_cp=1;a4=p_out;
p_cp=0;p_cp=1;a5=p_out;
p_cp=0;p_cp=1;a6=p_out;
p_cp=0;p_cp=1;a7=p_out;
return(ACC);
}


unsigned char check_165(void) {
unsigned char i,j,dat,b_break=0;
unsigned char code yes_bit[]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
p_out=1;p_cp=0;
p_sl=0;p_sl=1;
for (i=0;i<20;i++) {
dat=input_165();
for (j=0;j<8;j++) { //处理一个字节的每一个位
if (!(dat&yes_bit[j])) {b_break=1;break;}
n++;
}
if (b_break) break;
}
return(n);
}


void main(void) {
unsigned char d[20],i,dat;
//输入一个的情况,用dat记录
p_sl=0;p_sl=1;
dat=input_165();
//连续输入输入多个的情况(串联20个74ls165,共160个输入口)
p_sl=0;p_sl=1;
for (i=0;i<20;i++) {
d=input_165();
}
//检查所有165的速入口有否按键按下(低电平),注意:只能检查一个按键按下的情况,多个按键的情况请聪明的你取完善吧。
i=check_165();
if (i<160) { //如果返还等于160,便是没有按键按下(全部为高电平)
switch (i) { //按键处理
case 0: //按键0
case 1: //按键1
//……
}
}
while (1) {}
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条