// 主函数读出 码值,给P2口,驱动连接P2口的LED流水灯,看效果 //********************************************************************** #include <reg51.h> extern unsigned char datanum[4]; sbit red_line=P3^2; void init_int0() //中断初始化,下降沿触发方式 { EA=1; EX0=1; IT0=1; } void delay1(unsigned int i) { unsigned char j; for(i;i>0;i--) for(j=100;j>0;j--); } void main() { led_line=1; init_int0(); while(1){ P2=datanum[2]; delay1(1000); } }
//******************************************************* 中断部分 1.辨别是开始吗还是结束吗 有按键按下时,P3。2由高到低,触发中断,进入中断程序。第一步 关闭中断后,区分是引导吗还是结束吗,原理是,等待p3.2 口的电平为高,隔2.25ms后去检测P3.2的电平,如果是高电平,则是开始吗,进入码值读取部分,读取完32个位后,等待9MS后,此时的P3.2为高电平 开中断,历程结束。 如果是低电平,则是结束吗,跳过码值读取部分,等待9MS后,开中断,历程结束。 2.码值读取 由于引导吗读取后,P3.2电平为低的时候,才进入读取吗部分。所以,这个时候只需等待P3.2再次为高电平,等待0.84 ms后 读取P3.2的电平,为低则表示码值为0,为高表示码值为1,辨别完后,由 于不知道是读了1或者读了0,一律等待P3.2的电平为低电平后再次读取下一个位 //************************************************************** #include <reg51.h> sbit red_line=P3^2; unsigned char i,j; unsigned char datanum[4]={0,0,0,0};
void close_int0() { EX0=0; }
void init_xlat0(unsigned char high,unsigned char low) //时钟初始化的历程 { TMOD=9; TH0=high; TL0=low; TF0=0; TR0=1; }
unsigned char guide_wipe() //引导吗和结束吗的分辨 { while(1){ if(red_line==1){ init_xlat0(0xf7,0x35); while(1){ if(TF0==1){ if(red_line==1) return(1); else return(0); } } } } }
unsigned char dist_one_zero() //1和0的分辨 { init_xlat0(0xfd,0xc7); while(1){ if(TF0==1){ if(red_line==1) return(0x80); else return(0); } } } void delay(unsigned char a,unsigned char b) //延时历程 { init_xlat0(a,b); while(1){ if(TF0==1) break; } }
void read_datenum_bit(unsigned char c) //字节读取历程 { while(1){ if(red_line==1){ datanum[c]>>=1; datanum[c]|=dist_one_zero(); break; } } while(1){ if(red_line==0) break; } }
void into_in(void) interrupt 0 //中断历程 { close_int0(); if(guide_wipe()==1){ while(1){ if(red_line==0) break; } for(i=0;i<4;i++) for(j=0;j<8;j++){ read_datenum_bit(i); } } delay(0xdc,0xd7); EX0=1; }
问题: 程序运行不正常,起先P2口灯全亮后, 无论怎么按键,就是木有变化 求逻辑上的改错,,,,求 各位师兄指点迷津,跪求。 |