// 主函數讀出 碼值,給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口燈全亮后, 無論怎么按鍵,就是木有變化 求邏輯上的改錯,,,,求 各位師兄指點迷津,跪求。 |