線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1578
推到 Plurk!
推到 Facebook!

有關用89S51作密碼鎖的問題~

缺席
cliff1989
一般會員


發表:6
回覆:2
積分:1
註冊:2009-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-18 20:58:28 IP:115.43.xxx.xxx 未訂閱
如題,要求是透過4x4鍵盤輸入4個值,每輸入一個值文字型20X2LCD顯示一個*字號,輸入完4個值按鍵盤的0,判斷密碼正確或錯誤~正確顯示OK,錯誤顯示ERROR,以下是程式碼,但不知錯在哪...通電後畫面就顯示一個*然後卡住,麻煩有寫過相關類似程式的高手們給些提示...
[code cpp]
#include
#define RS P3_0
#define RW P3_1
#define E P3_2
#define DB P1
void init(void);
void position(char line,column);
void wrins(char instruction);
void display(char *string);
void wrdata(char d);
void delayms(unsigned int time);
char keypad(void);
char a,b,c,d,n;
code char string1[]={ "*" };
code char string2[]={ "OK" };
code char string3[]={ "ERROR" };
main()
{
init();
keypad();
while(keypad()!= 0xff)
{
a=keypad();
position(1,1);
display(string1);
}
keypad();
while(keypad()!= 0xff)
{
b=keypad();
position(1,2);
display(string1);
}
keypad();
while(keypad()!= 0xff)
{
c=keypad();
position(1,3);
display(string1);
}
keypad();
while(keypad()!= 0xff)
{
d=keypad();
position(1,4);
display(string1);
}
n=keypad();
if(n==0)
{
if(a==1 && b==2 && c==3 && d==4)
{
position(2,1);
display(string2);
}
else
{
position(2,1);
display(string3);
}
}
}
void init(void)
{
delayms(30);
wrins(0x38);
wrins(0x38);
wrins(0x38);
wrins(0x38);
wrins(0x08);
wrins(0x01);
wrins(0x06);
wrins(0x0c);
}

void position(char line,column)
{
unsigned char instruction;
line--;
column--;
instruction=0x80 (0x40*line column);
wrins(instruction);
}

void wrins(char instruction)
{
RS=0;
RW=0;
E=0;
delayms(1);
E=1;
DB=instruction;
delayms(1);
E=0;
delayms(8);
}

void display(char *string)
{
char k=0;
while(string[k] !=0x00)
{
wrdata(string[k]);
k ;
}
}

void wrdata(char d)
{
RS=1;
RW=0;
E=0;
delayms(1);
E=1;
DB=d;
delayms(1);
E=0;
delayms(1);
}

void delayms(unsigned int time)
{
unsigned int n;
while(time>0)
{
n=120;
while(n>0) n--;
time--;
}
}
char keypad(void)
{
char key=0xff;
P2=0x7f;
if(P2_3==0) key=15;
if(P2_2==0) key=11;
if(P2_1==0) key=10;
if(P2_0==0) key=0;
P2=0xbf;
if(P2_3==0) key=14;
if(P2_2==0) key=3;
if(P2_1==0) key=2;
if(P2_0==0) key=1;
P2=0xdf;
if(P2_3==0) key=13;
if(P2_2==0) key=6;
if(P2_1==0) key=5;
if(P2_0==0) key=4;
P2=0xef;
if(P2_3==0) key=12;
if(P2_2==0) key=9;
if(P2_1==0) key=8;
if(P2_0==0) key=7;
return key;
}
[/code]
編輯記錄
cliff1989 重新編輯於 2009-05-18 20:58:51, 註解 無‧
阿信
版主


發表:111
回覆:983
積分:813
註冊:2005-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-25 13:29:20 IP:114.32.xxx.xxx 訂閱
你的主程式架構有問題!

考慮如下的架構:

unsigned char K;
unsigned char PW[4],PW_cnt;

main() {
init();
PW_cnt=0;
while(1) {
K=keypad();
if (K!=0xFF) {
if (K==0) {
if (PW[0]==1 && PW[1]==2 && PW[2]==3 && PW[4]==4) {
position(2,1);
display(string2);

else {
position(2,1);
display(string3);
}
PW[0]=0; PW[1]=0; PW[2]=0; PW[3]=0; PW_cnt=0;
delayms(5000);
}
else {
PW[PW_cnt]==K;
if (PW_cnt<3) PW_cnt ;
position(1,PW_cnt 1);
display(string1);

}
}
}
使用全形空格,勿直接複製。
編輯記錄
阿信 重新編輯於 2009-05-25 13:38:05, 註解 無‧
阿信 重新編輯於 2009-05-25 13:39:38, 註解 無‧
系統時間:2024-05-06 17:33:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!