全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1232
推到 Plurk!
推到 Facebook!

想請問大家電子密碼鎖的掃描程式問題

尚未結案
cake10414
一般會員


發表:7
回覆:2
積分:1
註冊:2010-10-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-26 19:51:31 IP:218.167.xxx.xxx 訂閱

[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 for (j=1;j<120;j );// 執行120次,延遲1ms
} // delay1ms()函數結束

[/code]
如以上程式
我是想做一個可以輸入4位元密碼鎖
是要顯示在LCM上的
我這個程式是這樣的:
首先當第一次掃描時(k==0),先執行掃描函數[前](scanner1)
然後當按鍵按下時,執行轉換函數(changer)。
而當第二~第四次掃描時,在執行掃描函數[前](scanner1)
然後當按鍵按下時,執行轉換函數(changer)。
可是當我燒到89S51的時候
接到LCM卻是空白的,按鍵盤也沒反應
能請高手們幫幫我嗎感謝



系統時間:2024-04-27 0:25:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!