| 利用74LS165扩展输入口
//利用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[i]=input_165(); } //检查所有165的速入口有否按键按下(低电平),注意:只能检查一个按键按下的情况,多个按键的情况请聪明的你取完善吧。 i=check_165(); if (i<160) { //如果返还等于160,便是没有按键按下(全部为高电平) switch (i) { //按键处理 case 0: //按键0 case 1: //按键1 //…… } } while (1) {} } (综合电子论坛) |