想請問大家電子密碼鎖的掃描程式問題 |
尚未結案
|
cake10414
一般會員 發表:7 回覆:2 積分:1 註冊:2010-10-29 發送簡訊給我 |
[code cpp] #include #define LCDP P0 // 定義LCM 資料匯流排接至P0 #define KEYP P2 sbit RS = P3^2; // 暫存器選擇位元(0:指令,1:資料) sbit RW = P3^1; // 設定讀寫位元 (0:寫入,1:讀取) sbit E = P3^0; // 致能位元 (0:禁能,1:致能) sbit BF = P0^7; // 忙碌檢查位元(0:不忙,1:忙碌) void init_LCM(void); // 初始設定函數 void scanner(void); //總掃描函數 void scanner1(void);//掃描函數(前) void changer(void);//掃描函數 (後) unsigned char col,row; //宣告col=行.row=列 unsigned char rowkey,kcode; unsigned char b; unsigned char scan[4]={0xef,0xdf,0xbf,0x7f}; unsigned char password[4]; unsigned char c[9]; char k=0; unsigned char y=0; void write_inst(char); // 寫入指令函數 void write_char(char); // 寫入字元資料函數 void check_BF(void); // 檢查忙碌函數 void delay1ms(int); // 延遲函數 // ============ 主程式 =========================== main() { init_LCM(); while(1) {scanner(); } } // 主程式main()結束 //====初始設定函數(8位元傳輸模式)=================== void init_LCM(void) { write_inst(0x30); // 設定功能-8位元-基本指令 write_inst(0x30); // 設定功能-8位元-基本指令 write_inst(0x30); // 英文LCM相容設定,中交LCM可忽略 write_inst(0x38); // 英文LCM設定兩列,中交LCM可忽略 write_inst(0x08); // 顯示功能-關顯示幕-無游標-游標不閃 write_inst(0x01); // 清除顯示幕(填0x20,I/D=1) write_inst(0x06); // 輸入模式-位址遞增-關顯示幕 write_inst(0x0c); // 顯示功能-開顯示幕-無游標-游標不閃 } // init_LCM()函數結束 //==== 寫入指令函數 ================================ void write_inst(char inst) { check_BF(); // 檢查是否忙碌 LCDP = inst; // LCM讀入MPU指令 RS = 0; RW = 0; E = 1; // 寫入指令至LCM check_BF(); // 檢查是否忙碌 } // write_inst()函數結束 //==== 寫入字元資料函數 ============================ void write_char(char chardata) { check_BF(); // 檢查是否忙碌 LCDP = chardata; // LCM讀入字元 RS = 1; RW = 0 ;E = 1; // 寫入資料至LCM check_BF(); // 檢查是否忙碌 } // write_char()函數結束 //====檢查忙碌函數================================ void check_BF(void) { E=0; // 禁止讀寫動作 do // do-while迴圈開始 { BF=1; // 設定BF為輸入 RS = 0; RW = 1;E = 1; // 讀取BF及AC }while(BF == 1); // 忙碌繼續等 } // check_BF()函數結束 //====掃描副程式================================== void scanner(void) { if(k==0) { scanner1(); if(rowkey!=0) {changer(); } else {goto end;} } else {y=0; A: while(y<1000) {scanner1(); if(rowkey!=0) {changer(); } else {y=y 1; goto A;} } if(k==4) {goto end; } end: delay1ms(4); } } //====掃描前函數================================ void scanner1(void) {for(col=0;col<4;col ) {KEYP=scan[col]; rowkey= ~KEYP&0x0f;} } //====轉換函數================================== void changer(void) {if(rowkey==0x01) row=0; else if(rowkey==0x02) row=1; else if(rowkey==0x04) row=2; else if(rowkey==0x08) row=3; kcode=4*col row; b=kcode 0x30; password[k]=b; write_char(b); k=k 1; } //==== 延遲函數 ================================ void delay1ms(int x) { int i,j; // 宣告變數 for (i=1;i } // delay1ms()函數結束 [/code] 如以上程式 我是想做一個可以輸入4位元密碼鎖 是要顯示在LCM上的 我這個程式是這樣的: 首先當第一次掃描時(k==0),先執行掃描函數[前](scanner1) 然後當按鍵按下時,執行轉換函數(changer)。 而當第二~第四次掃描時,在執行掃描函數[前](scanner1) 然後當按鍵按下時,執行轉換函數(changer)。 可是當我燒到89S51的時候 接到LCM卻是空白的,按鍵盤也沒反應 能請高手們幫幫我嗎感謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |