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

使用C語言寫8051密碼鎖~程式太大無法Compiler~並且有功能不會寫~

答題得分者是:dllee
司逸
一般會員


發表:1
回覆:4
積分:1
註冊:2009-03-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-06-12 08:46:57 IP:203.64.xxx.xxx 訂閱
最近期末要交成品~所以寫了好久~
<style type="text/css"><br />
<!--
/* Font Definitions */
@font-face
{font-family:新細明體;
panose-1:2 2 3 0 0 0 0 0 0 0;
mso-font-alt:PMingLiU;
mso-font-charset:136;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 135135232 22 0 1048577 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
{font-family:"\@新細明體";
panose-1:2 2 3 0 0 0 0 0 0 0;
mso-font-charset:136;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 135135232 22 0 1048577 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:none;
font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:新細明體;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-size:10.0pt;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
mso-ascii-font-family:"Times New Roman";
mso-fareast-font-family:新細明體;
mso-hansi-font-family:"Times New Roman";
mso-font-kerning:0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:18.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{mso-list-id:1105492020;
mso-list-type:hybrid;
mso-list-template-ids:596536210 -829269284 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
{mso-level-tab-stop:none;
mso-level-number-position:left;
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><font face="Verdana">在密碼輸入成功後,亮綠色LED,並且將繼電器開啟(出現一聲)

2.Power
附上的檔案是我的電路圖



我的程式如下(有注解版):


//==宣告區============================================


#include /*定義8051暫存器之標頭檔*/

#define DO P2_0 /*93C66串列輸出腳*/
#define DI P2_1 /*93C66串列輸入腳*/
#define SK P2_2 /*93C66串列脈波輸入腳*/
#define CS P2_3 /*93C66致能輸入腳*/
#define SW P2_4 /*密碼鎖接腳*/
#define RS P2_5 /*LCD指令/資料暫存器選擇控制腳*/
#define RW P2_6 /*LCD讀寫控制腳*/
#define En P2_7 /*LCD致能輸入腳*/
#define ON 0 /*開啟*/
#define OFF 1 /*關閉*/
#define READ 0x0600 /*讀取:xxxxx110,A7-A0 */
#define WR_EN 0x04c0 /*寫入致能xxxxx100,11xxxxxx */
#define WRITE 0x0500 /*寫入xxxxx101,A7-A0 */
#define WR_ALL 0x0440 /*全部寫入xxxxx100,01xxxxxx */
#define WR_DS 0x0400 /*寫入除能xxxxx100,00xxxxxx */
#define ERASE 0x0700 /*清除xxxxx111,A7-A0 */
#define ER_ALL 0x0480 /*全部清除xxxxx100,10xxxxxx */
#define ShiftNo 5 /*移位次數*/
#define SIZE 4 /*存取93C66字元組數目*/
sbit P2_0 =0xa0; /*定義接腳*/
sbit P2_1 =0xa1; /*定義接腳*/
sbit P2_2 =0xa2; /*定義接腳*/
sbit P2_3 =0xa3; /*定義接腳*/
sbit P2_4 =0xa4; /*定義接腳*/
sbit P2_5 =0xa5; /*定義接腳*/
sbit P2_6 =0xa6; /*定義接腳*/
sbit P2_7 =0xa7; /*定義接腳*/
bit flag; /*迴圈控制旗標*/
bit error; /*密碼比較旗標,error=0:正確error=1:錯誤*/
char ScanLine=0x08; /*鍵盤掃描信號*/
char col=0; /*矩陣鍵盤行數*/
char row; /*矩陣鍵盤列數*/
char one=0; /*已釋放按鍵被偵測到的次數*/
char zero=0; /*已按下按鍵被偵測到的次數*/
int key=0; /*按鍵值*/
int KeyTemp=0xff; /*未消除彈跳的按鍵值*/
int KeyData=0xff; /*已消除彈跳的按鍵值*/
char sec_cnt=100; /*秒常數:1秒=100*10ms*/
char HOUR=12; /*時初值*/
char MIN=00; /*分初值*/
char SEC=00; /*秒初值*/
char TIME[8]="00:00:00"; /*系統時間緩衝區*/
char AHOUR; /*調整時暫存器*/
char AMIN; /*調整分暫存器*/
char ASEC; /*調整秒暫存器*/
char ATIME[6]; /*調整時間緩衝區*/
int USER_CODE[SIZE]={1,2,3,4}; /*系統密碼初值*/
int SYS_CODE[SIZE]; /*系統密碼緩衝區*/
unsigned char code MSG1[ ]="F1:TIME F2:ADJ"; /*定義字串*/
unsigned char code MSG2[ ]="F3:INPUT F4:SET"; /*定義字串*/
unsigned char code MSG3[ ]="Current Time"; /*定義字串*/
unsigned char code MSG4[ ]="Adjust Time"; /*定義字串*/
unsigned char code MSG5[ ]="Input Code"; /*定義字串*/
unsigned char code MSG6[ ]="exact"; /*定義字串*/
unsigned char code MSG7[ ]="error"; /*定義字串*/
unsigned char code MSG8[ ]="Input old code"; /*定義字串*/
unsigned char code MSG9[ ]="Input new code"; /*定義字串*/
unsigned char code MSG10[ ]="success!"; /*定義字串*/
void Out93c66cmd(int); /*定義函數原型*/
int read_93c66(int); /*定義函數原型*/
void write_93c66(int,int); /*定義函數原型*/
void CheckBusy93c66(void); /*定義函數原型*/
void delay(void); /*定義函數原型*/
void KeyScan(void); /*定義函數原型*/
void InitialLCD(void); /*定義函數原型*/
void WriteLCDcmd(char); /*定義函數原型*/
void WriteLCDdata(char); /*定義函數原型*/
void WriteLCDstring(char,char *); /*定義函數原型*/
void CheckBusyLCD(void); /*定義函數原型*/
void PowerOn(void); /*定義函數原型*/
void ConvertTime(void); /*定義函數原型*/
void AdjustTime(void); /*定義函數原型*/

//==主程式============================================


main() /*主程式*/

{
int i;
IE=0x8a; /*致能計時器0、1中斷*/
TMOD=0x11; /*計時器0、1工作在模式*/
TH0=(65536-10000)/256; /*設定計時器0初值*/
TL0=(65536-10000)%6;
TH1=(65536-5000)/256; /*設定計時器1初值*/
TL1=(65536-5000)%6;
TR0=1; /*啟動計時器0*/
TR1=1; /*啟動計時器1*/
SW=OFF; /*關閉密碼鎖*/
InitialLCD(); /*初始化LCD*/
PowerOn(); /*LCD顯示主功能表*/

for(i=0;i
write_93c66(i,USER_CODE[i]);

while(1)
{
ConvertTime(); /*轉換時間:BCD至ASCII*/
if(KeyData!=0xff) /*偵測按鍵狀態*/
{
if(KeyData==0x0b) /*按HELP鍵*/
{
KeyData=0xff; /*清除按鍵值*/
SW=OFF; /*關閉密碼鎖*/
PowerOn(); /*LCD顯示主畫面*/
}
if(KeyData==0x0c) /*按F1鍵?*/
{
KeyData=0xff; /*清除按鍵值*/
WriteLCDcmd(0x01); /*清除LCD螢幕*/
WriteLCDcmd(0x82); /*設定LCD座標*/
WriteLCDstring(12,MSG3); /*顯示提示字串: Current Time*/
while(KeyData==0xff) /*偵測按鍵狀態*/
{
ConvertTime(); /*轉換時間*/
WriteLCDcmd(0xc4); /*設定LCD座標*/
WriteLCDstring(8,TIME); /*顯示目前時間*/
}
}
if(KeyData==0x0d) /*按F2鍵?*/
{
i=0;
KeyData=0xff; /*清除按鍵值*/
WriteLCDcmd(0x01); /*清除LCD螢幕*/
WriteLCDcmd(0x82); /*設定LCD座標*/
WriteLCDstring(11,MSG4); /*顯示提示字串: Adjusr Time*/
WriteLCDcmd(0xc5); /*設定LCD座標*/
while(KeyData==0xff); /*偵測按鍵狀態*/
flag=1;
while(flag) /*若按鍵為F1、F2、F3、F4、HELP 則結束迴圈*/
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a) /*按SET鍵*/
{
flag=0;
KeyData=0xff; /*清除鍵值*/
AHOUR=ATIME[0]*10 ATIME[1]; /*轉換*/
AMIN=ATIME[2]*10 ATIME[3];
ASEC=ATIME[4]*10 ATIME[5];
if(AHOUR<24 & AMIN<60 & ASEC<60)
{
HOUR=AHOUR; /*儲存設定時間*/
MIN=AMIN;
SEC=ASEC;
}
InitialLCD(); /*清除LCD螢幕*/
PowerOn(); /*顯示主畫面*/
}
if(KeyData>=0 & KeyData<=9) /* 0-9 */ /*案0~9鍵*/
{
ATIME[i]=KeyData; /*儲存鍵值*/
WriteLCDdata(ATIME[i] 0x30); /*顯示鍵值*/
i ; /*下一鍵*/
if(i==6) /*已輸入6位*/
{
i=0;
WriteLCDcmd(0xc5); /*清除鍵值*/
}
KeyData=0xff;
} /*while(flag)*/
}
}
if(KeyData==0x0e) /*按F3鍵?*/
{
i=0;
KeyData=0xff; /*清除鍵值*/
WriteLCDcmd(0x01); /*清除LCD螢幕*/
WriteLCDcmd(0x83); /*設定LCD座標*/
WriteLCDstring(10,MSG5); /*顯示Input Code*/
WriteLCDcmd(0xc6); /*設LCD座標*/
while(KeyData==0xff); /*偵測按鍵狀態*/
flag=1;
while(flag)
{ /*若按鍵為F1、F2、F3、F4、HELP,則結束迴圈*/
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a) /*按SET鍵?*/
{
flag=0;
KeyData=0xff; /*清除鍵值*/
error=0;
for(i=0;i<4;i ) /*讀取系統密碼*/
SYS_CODE[i]=read_93c66(i);
for(i=0;i<4;i ) /*密碼正確*/
if(USER_CODE[i]!=SYS_CODE[i])
error=1; /*密碼錯誤*/
if(error==0) /*輸入密碼正確*/
{
WriteLCDstring(5,MSG6); /*顯示exact*/
SW=ON; /*開啟密碼鎖*/
}
else /*輸入密碼錯誤*/
{
WriteLCDcmd(0xc6);
WriteLCDstring(5,MSG7); /*顯示error*/
}
}
if(KeyData>=0 & KeyData<=9) /* 0-9 */ /*按0~9鍵?*/
{
USER_CODE[i]=KeyData; /*儲存密碼*/
WriteLCDdata(USER_CODE[i] 0x30); /*顯示*/
i ;
if(i==4) /*已輸入4位數?*/
{
i=0;
WriteLCDcmd(0xc6); /*游標回至開頭*/
}
KeyData=0xff; /*清除鍵值*/
}
}
}
if(KeyData==0x0f) /*按F4鍵?*/
{
i=0;
KeyData=0xff; /*清除鍵值*/
WriteLCDcmd(0x01); /*清除LCD螢幕*/
WriteLCDcmd(0x81); /*設LCD座標*/
WriteLCDstring(14,MSG8); /*顯示Input old code*/
WriteLCDcmd(0xc6); /*設LCD座標*/
while(KeyData==0xff); /*偵測按鍵狀態*/
flag=1;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a) /* SET */ /*按SET鍵?*/
{
flag=0; /*按SET鍵,結束迴圈*/
KeyData=0xff; /*清除鍵值*/
error=0;
for(i=0;i<4;i ) /*讀取4位系統密碼*/
SYS_CODE[i]=read_93c66(i);
for(i=0;i<4;i ) /*輸入密碼是否正確?*/
if(USER_CODE[i]!=SYS_CODE[i])
error=1; /*密碼錯誤*/
if(error==0) /*密碼正確*/
{
WriteLCDcmd(0x01); /*清除LCD螢幕*/
WriteLCDcmd(0x81); /*設LCD座標*/
WriteLCDstring(14,MSG9); /*顯示MSG9*/
WriteLCDcmd(0xc6); /*做LC座標*/
while(KeyData==0xff); /*偵測按鍵狀態*/
flag=1;
i=0;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a) /*按SET鍵?*/
{
flag=0;
KeyData=0xff; /*清除鍵值*/
error=0;
for(i=0;i
write_93c66(i,USER_CODE[i]);
WriteLCDcmd(0x01);
WriteLCDcmd(0x84);
WriteLCDstring(8,MSG10);
}
if(KeyData>=0 & KeyData<=9) /*0~9?*/
{
USER_CODE[i]=KeyData;
WriteLCDdata(USER_CODE[i] 0x30);
i ;
if(i==4) /*已輸入4位?*/
{
i=4;
WriteLCDcmd(0xc6);
}
KeyData=0xff;
}
}
}
else /*輸入密碼錯誤*/
{
WriteLCDcmd(0xc6); /*設LCD座標*/
WriteLCDstring(5,MSG7); /*顯示error*/
}
}
if(KeyData>=0 & KeyData<=9) /* 0-9 */ /*按鍵值為0~9?*/
{
USER_CODE[i]=KeyData; /*儲存鍵值*/
WriteLCDdata(USER_CODE[i] 0x30);
i ;
if(i==4) /*已輸入4位?*/
{
i=0;
WriteLCDcmd(0xc6); /*重設LC座標*/
}
KeyData=0xff; /*清除鍵值*/
}
}
}
}
}
} /* main */

//==副程式=============================================

void ConvertTime(void) /*轉換時間*/

{
TIME[0]=HOUR/10 0x30; /*轉換時資料*/
TIME[1]=HOUR 0x30;
TIME[3]=MIN/10 0x30; /*轉換分資料*/
TIME[4]=MIN 0x30;
TIME[6]=SEC/10 0x30; /*轉換秒資料*/
TIME[7]=SEC 0x30;
}

void T0_int(void) interrupt 1 /*TO=系統時間*/

{
TH0=(65536-10000)/256; /*重設計時器0初值*/
TL0=(65536-10000)%6;
if(--sec_cnt==0) /*是否已中斷100次?*/
{
sec_cnt=100; /*重設*/
AdjustTime(); /*已經過1秒,調整目前時間*/
}
} /* T0_int */

void T1_int(void) interrupt 3 /*T1=鍵盤掃描*/
{
TH1=(65536-5000)/256; /*重設計時器1初值*/
TL1=(65536-5000)%6;
KeyScan(); /*掃瞄鍵盤*/
} /* T1_int */

void PowerOn(void) /*顯示主功能表*/
{
WriteLCDcmd(0x80); /*設LCD座標在第1列第1行*/
WriteLCDstring(16,MSG1); /*顯示字串:F1:TIME F2:ADJ*/
WriteLCDcmd(0xc0); /*設定LCD座標在第2列第1行*/
WriteLCDstring(16,MSG2); /*顯示字串:F3INPUT F4:SET*/
}

void AdjustTime(void) /*調整系統時間*/
{
SEC ; /*秒加1*/
if(SEC==60) /*已經過60秒?*/
{
SEC=0; /*秒清除為0*/
MIN ; /*分加1*/
if(MIN==60) /*已經過60分?*/
{
MIN=0; /*分清除為0*/
HOUR ; /*時加1*/
if(HOUR==24) /*經過24時?*/
HOUR=0; /*時清除為0*/

}

}
}

void KeyScan(void) /*鍵盤掃描*/

{
int KeyStatus; /*按鍵狀態*/
P3=~ScanLine; /*輸出鍵盤掃描信號*/
KeyStatus=~P3; /*讀取按鍵狀態*/
KeyStatus&=0xf0; /*每行共4個鍵值需要偵測*/
for(row=0;row<4;row ) /*每行共4個鍵值需要偵測*/
{
if(KeyStatus==0x80) /*是否有按鍵輸入?*/
{
one=0;
if(KeyTemp!=key) /*此次按鍵值是否為上次鍵值?*/
{
KeyTemp=key; /*鍵值不同,儲存鍵值*/
zero=1; /*第1次偵測到此鍵值*/
}
else /*此次鍵值與上次鍵值相同*/
{
if(zero!=5) /*連續偵測到5次相同鍵值*/
{
zero ;
if(zero==5) /*連續偵測到5次相同鍵值*/
KeyData=KeyTemp; /*儲存已除彈跳的鍵值*/
}
}
}
key =1;
KeyStatus<<=1; /*偵測下一鍵*/
} /* row */
ScanLine>>=1; /*掃描下一行*/
if(ScanLine==0) /*已掃描至第4行?*/
ScanLine=0x08; /*已至第4行,重設掃描信號*/
col ; /*繼續掃描下一行*/
if(col==4) /*已掃描至第4行?*/
{
col=0; /*重新掃描第1行*/
key=0;
one ; /*one加1*/
if(one==5) /*one=5?*/
{
zero=0; /*one=5,按鍵已釋放且已除彈跳*/
KeyTemp=0xff; /*清除鍵值*/
KeyData=0xff; /*清除鍵值*/
}
}
} /* KeyScan */

int read_93c66(int rd_addr) /*讀取93C66字元資料*/
{
int i;
int rd_cmd;
int rd_word;
CS=1; /*致能93C66*/
rd_cmd=(READ|rd_addr)<<5; /*輸出11位元命令*/
Out93c66cmd(rd_cmd);
for(i=0;i<16;i ) /*自93C66讀取16位元字元資料*/
{
SK=1; /*產生串列脈波*/
SK=0;
rd_word<<=1;
if(DO==1)
rd_word|=0x0001; /*儲存1位元資料*/
}
CS=0; /*除能93C66*/
return(rd_word);
} /* read_93c66 */

void write_93c66(int wr_addr,int wr_word) /*寫入字元資料至93C66*/
{
int i;
int wr_cmd;
CS=1; /*致能*/
wr_cmd=(ERASE|wr_addr)<<5; /*輸出清除命令至93C66*/
Out93c66cmd(wr_cmd); /*輸出11位元命令*/
CheckBusy93c66(); /*檢查忙碌旗標*/
CS=0; /*結束清除命令*/
CS=1;
wr_cmd=(WR_EN<<5); /*輸出寫入致能至93C66*/
Out93c66cmd(wr_cmd); /*輸出11位元命令*/
CS=0; /*結束寫入致能*/
CS=1;
wr_cmd=(WRITE|wr_addr)<<5; /*輸出寫入命令至93C66*/
Out93c66cmd(wr_cmd); /*輸出11位元命令*/
for(i=0;i<16;i ) /*寫入字元資料至93C66*/
{
if(wr_word & 0x8000)
DI=1;
else
DI=0;
SK=1; /*產生串列脈波*/
SK=0;
wr_word<<=1; /*下一位元*/
}
CheckBusy93c66(); /*檢查忙碌旗標*/
wr_cmd=(WR_DS<<5); /*輸出寫入除能至93C66*/
Out93c66cmd(wr_cmd);
CheckBusy93c66(); /*檢查忙碌旗標*/
CS=0; /*除能93C66*/
} /* read_93c66 */

void Out93c66cmd(int command) /*輸出11位元命令至93C66*/
{
int i;
for(i=0;i<11;i )
{
if(command & 0x8000)
DI=1;
else
DI=0;
SK=1; /*產生串列脈波*/
SK=0;
command<<=1; /*下一位元*/
}
} /* Out93c66cmd */

void CheckBusy93c66(void) /*檢查忙碌旗標*/
{
CS=0; /*產生負脈波*/
CS=1;
while(DO==0); /*93C66忙碌中(DO=0)?*/
} /* CheckBusy93c66 */

void InitialLCD(void) /*初始化LCD*/
{
WriteLCDcmd(0x38); /*功能設定*/
WriteLCDcmd(0x38); /*功能設定*/
WriteLCDcmd(0x38); /*功能設定*/
WriteLCDcmd(0x38); /*功能設定*/
WriteLCDcmd(0x08); /*功能設定*/
WriteLCDcmd(0x01); /*關閉顯示*/
WriteLCDcmd(0x0c); /*清除LCD螢幕*/
WriteLCDcmd(0x06); /*開啟顯示,不顯示游標*/
} /* InitialLCD */ /*設定輸入模式*/

void WriteLCDcmd(char instruction) /*寫命令至LC*/
{
RS=0; /*選擇指令暫存器*/
RW=0; /*寫入*/
En=1; /*致能LCD*/
P1=instruction; /*輸入命令*/
En=0; /*除能LCD*/
CheckBusyLCD(); /*檢查LCD忙碌旗標*/
} /* WriteIns */

void WriteLCDdata(char i) /*寫資料至LCD*/
{
RS=1; /*選擇資料暫存器*/
RW=0; /*寫入*/
En=1; /*致能LCD*/
P1=i; /*輸出資料*/
En=0; /*除能LCD*/
CheckBusyLCD(); /*檢查LCD忙碌旗標*/
} /* WriteData */

void WriteLCDstring(count,MSG) /*寫字串至LCD*/
char count;
char MSG[ ];
{
char i;
for(i=0;i
WriteLCDdata(MSG[i]);
} /* Writestring */

void CheckBusyLCD(void) /*檢查LCD忙碌旗標*/
{
char i=0x80;
while(i&0x80) /*忙碌旗標BF=1?*/
{
RS=0; /*選擇指令暫存器*/
RW=1; /*讀取*/
En=1; /*致能LCD*/
i=P1; /*讀取資料*/
En=0; /*除能LCD*/
delay(); /*延遲10ms*/
}
} /* CheckBusy */

void delay(void) /*延遲10ms*/
{
int i;
for(i=0;i<500;i );
} /* delay */

我的程式如下(未注解版):

#include
#define DO P2_0
#define DI P2_1
#define SK P2_2
#define CS P2_3
#define SW P2_4
#define RS P2_5
#define RW P2_6
#define En P2_7
#define ON 0
#define OFF 1
#define READ 0x0600
#define WR_EN 0x04c0
#define WRITE 0x0500
#define WR_ALL 0x0440
#define WR_DS 0x0400
#define ERASE 0x0700
#define ER_ALL 0x0480
#define ShiftNo 5
#define SIZE 4
sbit P2_0 =0xa0;
sbit P2_1 =0xa1;
sbit P2_2 =0xa2;
sbit P2_3 =0xa3;
sbit P2_4 =0xa4;
sbit P2_5 =0xa5;
sbit P2_6 =0xa6;
sbit P2_7 =0xa7;
bit flag;
bit error;
char ScanLine=0x08;
char col=0;
char row;
char one=0;
char zero=0;
int key=0;
int KeyTemp=0xff;
int KeyData=0xff;
char sec_cnt=100;
char HOUR=12;
char MIN=00;
char SEC=00;
char TIME[8]="00:00:00";
char AHOUR;
char AMIN;
char ASEC;
char ATIME[6];
int USER_CODE[SIZE]={1,2,3,4};
int SYS_CODE[SIZE];
unsigned char code MSG1[ ]="F1:TIME F2:ADJ";
unsigned char code MSG2[ ]="F3:INPUT F4:SET";
unsigned char code MSG3[ ]="Current Time";
unsigned char code MSG4[ ]="Adjust Time";
unsigned char code MSG5[ ]="Input Code";
unsigned char code MSG6[ ]="exact";
unsigned char code MSG7[ ]="error";
unsigned char code MSG8[ ]="Input old code";
unsigned char code MSG9[ ]="Input new code";
unsigned char code MSG10[ ]="success!";
void Out93c66cmd(int);
int read_93c66(int);
void write_93c66(int,int);
void CheckBusy93c66(void);
void delay(void);
void KeyScan(void);
void InitialLCD(void);
void WriteLCDcmd(char);
void WriteLCDdata(char);
void WriteLCDstring(char,char *);
void CheckBusyLCD(void);
void PowerOn(void);
void ConvertTime(void);
void AdjustTime(void);
main()
{
int i;
IE=0x8a;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%6;
TH1=(65536-5000)/256;
TL1=(65536-5000)%6;
TR0=1;
TR1=1;
SW=OFF;
InitialLCD();
PowerOn();
for(i=0;iwrite_93c66(i,USER_CODE[i]);
while(1)
{
ConvertTime();
if(KeyData!=0xff)
{
if(KeyData==0x0b)
{
KeyData=0xff;
SW=OFF;
PowerOn();
}
if(KeyData==0x0c)
{
KeyData=0xff;
WriteLCDcmd(0x01);
WriteLCDcmd(0x82);
WriteLCDstring(12,MSG3);
while(KeyData==0xff)
{
ConvertTime();
WriteLCDcmd(0xc4);
WriteLCDstring(8,TIME);
}
}
if(KeyData==0x0d)
{
i=0;
KeyData=0xff;
WriteLCDcmd(0x01);
WriteLCDcmd(0x82);
WriteLCDstring(11,MSG4);
WriteLCDcmd(0xc5);
while(KeyData==0xff);
flag=1;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a)
{
flag=0;
KeyData=0xff;
AHOUR=ATIME[0]*10 ATIME[1];
AMIN=ATIME[2]*10 ATIME[3];
ASEC=ATIME[4]*10 ATIME[5];
if(AHOUR<24 & AMIN<60 & ASEC<60)
{
HOUR=AHOUR;
MIN=AMIN;
SEC=ASEC;
}
InitialLCD();
PowerOn();
}
if(KeyData>=0 & KeyData<=9)
{
ATIME[i]=KeyData;
WriteLCDdata(ATIME[i] 0x30);
i ;
if(i==6)
{
i=0;
WriteLCDcmd(0xc5);
}
KeyData=0xff;
}
}
}
if(KeyData==0x0e)
{
i=0;
KeyData=0xff;
WriteLCDcmd(0x01);
WriteLCDcmd(0x83);
WriteLCDstring(10,MSG5);
WriteLCDcmd(0xc6);
while(KeyData==0xff);
flag=1;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a)
{
flag=0;
KeyData=0xff;
error=0;
for(i=0;i<4;i )
SYS_CODE[i]=read_93c66(i);
for(i=0;i<4;i )
if(USER_CODE[i]!=SYS_CODE[i])
error=1;
if(error==0)
{
WriteLCDstring(5,MSG6);
SW=ON;
}
else
{
WriteLCDcmd(0xc6);
WriteLCDstring(5,MSG7);
}
}
if(KeyData>=0 & KeyData<=9)
{
USER_CODE[i]=KeyData;
WriteLCDdata(USER_CODE[i] 0x30);
i ;
if(i==4)
{
i=0;
WriteLCDcmd(0xc6);
}
KeyData=0xff;
}
}
}
if(KeyData==0x0f)
{
i=0;
KeyData=0xff;
WriteLCDcmd(0x01);
WriteLCDcmd(0x81);
WriteLCDstring(14,MSG8);
WriteLCDcmd(0xc6);
while(KeyData==0xff);
flag=1;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a)
{
flag=0;
KeyData=0xff;
error=0;
for(i=0;i<4;i )
SYS_CODE[i]=read_93c66(i);
for(i=0;i<4;i )
if(USER_CODE[i]!=SYS_CODE[i])
error=1;
if(error==0)
{
WriteLCDcmd(0x01);
WriteLCDcmd(0x81);
WriteLCDstring(14,MSG9);
WriteLCDcmd(0xc6);
while(KeyData==0xff);
flag=1;
i=0;
while(flag)
{
if(KeyData==0x0b|KeyData==0x0c|KeyData==0x0d|KeyData==0x0e|KeyData==0x0f)
flag=0;
if(KeyData==0x0a)
{
flag=0;
KeyData=0xff;
error=0;
for(i=0;iwrite_93c66(i,USER_CODE[i]);
WriteLCDcmd(0x01);
WriteLCDcmd(0x84);
WriteLCDstring(8,MSG10);
}
if(KeyData>=0 & KeyData<=9)
{
USER_CODE[i]=KeyData;
WriteLCDdata(USER_CODE[i] 0x30);
i ;
if(i==4)
{
i=4;
WriteLCDcmd(0xc6);
}
KeyData=0xff;
}
}
}
else
{
WriteLCDcmd(0xc6);
WriteLCDstring(5,MSG7);
}
}
if(KeyData>=0 & KeyData<=9)
{
USER_CODE[i]=KeyData;
WriteLCDdata(USER_CODE[i] 0x30);
i ;
if(i==4)
{
i=0;
WriteLCDcmd(0xc6);
}
KeyData=0xff;
}
}
}
}
}
}
void ConvertTime(void)
{
TIME[0]=HOUR/10 0x30;
TIME[1]=HOUR 0x30;
TIME[3]=MIN/10 0x30;
TIME[4]=MIN 0x30;
TIME[6]=SEC/10 0x30;
TIME[7]=SEC 0x30;
}
void T0_int(void) interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%6;
if(--sec_cnt==0)
{
sec_cnt=100;
AdjustTime();
}
}
void T1_int(void) interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%6;
KeyScan();
}
void PowerOn(void)
{
WriteLCDcmd(0x80);
WriteLCDstring(16,MSG1);
WriteLCDcmd(0xc0);
WriteLCDstring(16,MSG2);
}

void AdjustTime(void)
{
SEC ;
if(SEC==60)
{
SEC=0;
MIN ;
if(MIN==60)
{
MIN=0;
HOUR ;
if(HOUR==24)
HOUR=0;
}
}
}
void KeyScan(void)
{
int KeyStatus;
P3=~ScanLine;
KeyStatus=~P3;
KeyStatus&=0xf0;
for(row=0;row<4;row )
{
if(KeyStatus==0x80)
{
one=0;
if(KeyTemp!=key)
{
KeyTemp=key;
zero=1;
}
else
{
if(zero!=5)
{
zero ;
if(zero==5)
KeyData=KeyTemp;
}
}
}
key =1;
KeyStatus<<=1;
}
ScanLine>>=1;
if(ScanLine==0)
ScanLine=0x08;
col ;
if(col==4)
{
col=0;
key=0;
one ;
if(one==5)
{
zero=0;
KeyTemp=0xff;
KeyData=0xff;
}
}
}
int read_93c66(int rd_addr)
{
int i;
int rd_cmd;
int rd_word;
CS=1;
rd_cmd=(READ|rd_addr)<<5;
Out93c66cmd(rd_cmd);
for(i=0;i<16;i )
{
SK=1;
SK=0;
rd_word<<=1;
if(DO==1)
rd_word|=0x0001;
}
CS=0;
return(rd_word);
}
void write_93c66(int wr_addr,int wr_word)
{
int i;
int wr_cmd;
CS=1;
wr_cmd=(ERASE|wr_addr)<<5;
Out93c66cmd(wr_cmd);
CheckBusy93c66();
CS=0;
CS=1;
wr_cmd=(WR_EN<<5);
Out93c66cmd(wr_cmd);
CS=0;
CS=1;
wr_cmd=(WRITE|wr_addr)<<5;
Out93c66cmd(wr_cmd);
for(i=0;i<16;i )
{
if(wr_word & 0x8000)
DI=1;
else
DI=0;
SK=1;
SK=0;
wr_word<<=1;
}
CheckBusy93c66();
wr_cmd=(WR_DS<<5);
Out93c66cmd(wr_cmd);
CheckBusy93c66();
CS=0;
}
void Out93c66cmd(int command)
{
int i;
for(i=0;i<11;i )
{
if(command & 0x8000)
DI=1;
else
DI=0;
SK=1;
SK=0;
command<<=1;
}
}
void CheckBusy93c66(void)
{
CS=0;
CS=1;
while(DO==0) ;
}
void InitialLCD(void)
{
WriteLCDcmd(0x38);
WriteLCDcmd(0x38);
WriteLCDcmd(0x38);
WriteLCDcmd(0x38);
WriteLCDcmd(0x08);
WriteLCDcmd(0x01);
WriteLCDcmd(0x0c);
WriteLCDcmd(0x06);
}
void WriteLCDcmd(char instruction)
{
RS=0;
RW=0;
En=1;
P1=instruction;
En=0;
CheckBusyLCD();
}
void WriteLCDdata(char i)
{
RS=1;
RW=0;
En=1;
P1=i;
En=0;
CheckBusyLCD();
}
void WriteLCDstring(count,MSG)
char count;
char MSG[ ];
{
char i;
for(i=0;iWriteLCDdata(MSG[i]);
}
void CheckBusyLCD(void)
{
char i=0x80;
while(i&0x80)
{
RS=0;
RW=1;
En=1;
i=P1;
En=0;
delay();
}
}
void delay(void)
{
int i;
for(i=0;i<500;i );
}

編輯記錄
司逸 重新編輯於 2009-06-12 17:37:47, 註解 無‧
司逸 重新編輯於 2009-06-12 17:47:46, 註解 無‧
司逸 重新編輯於 2009-06-12 18:02:14, 註解 無‧
司逸 重新編輯於 2009-06-12 18:04:08, 註解 無‧
司逸 重新編輯於 2009-06-12 18:04:51, 註解 無‧
司逸 重新編輯於 2009-06-12 21:54:32, 註解 無‧
司逸 重新編輯於 2009-06-13 12:38:49, 註解 無‧
司逸 重新編輯於 2009-06-13 12:42:19, 註解 無‧
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-06-12 09:45:43 IP:76.245.xxx.xxx 未訂閱
貼程式碼的時候可以使用程式碼區塊,這樣會比較好看
司逸
一般會員


發表:1
回覆:4
積分:1
註冊:2009-03-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-06-12 17:36:00 IP:203.64.xxx.xxx 訂閱
嗯嗯~了解~謝謝大大指正~

不過重新修改了兩三次後~發覺排版實在是亂的很恐怖~

所以~還是維持不動好了~哈哈~
編輯記錄
司逸 重新編輯於 2009-06-12 17:52:31, 註解 無‧
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-06-13 02:18:24 IP:76.245.xxx.xxx 未訂閱
你在排你的code前,先在"程式碼區塊"選擇C++
他會產生以下的code
{code cpp}
{/code}

ps.為了讓你看清楚,我把[ ]改成{ }
編輯記錄
GGL 重新編輯於 2009-06-13 02:19:05, 註解 無‧
GGL 重新編輯於 2009-06-13 02:20:34, 註解 無‧
司逸
一般會員


發表:1
回覆:4
積分:1
註冊:2009-03-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-06-13 12:46:25 IP:203.64.xxx.xxx 訂閱
我知道了~但是在程式貼上後~前面會出現一堆<br><font><size=3>...這樣的網頁程式碼~

這樣...排版就全亂了說~

===================引 用 GGL 文 章===================
你在排你的code前,先在"程式碼區塊"選擇C
他會產生以下的code
{code cpp}
{/code}

ps.為了讓你看清楚,我把[ ]改成{ }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-06-15 00:48:57 IP:218.168.xxx.xxx 訂閱
應該不會有人幫你看那麼長且未排版的程式碼哪裡有問題
且無法compiler應該也會有錯誤訊息,可以把錯誤訊息POST上來
有經驗的前輩或許看到錯誤訊息就能猜出問題在哪
建議你用夾擊法收斂出問題在哪,看看程式是擴張到哪個地方後開始無法編譯

司逸
一般會員


發表:1
回覆:4
積分:1
註冊:2009-03-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-06-16 10:43:52 IP:140.127.xxx.xxx 訂閱
感謝高手的提醒,

我使用的是"Keil uVision3"作
compiler的動作

而出現錯誤訊息是:

assembling STARTUP.A51...

linking...
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2006
".\原始碼(未注解版).obj"
******************************************************************************
******************************************************************************
LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S)
LIMIT: 0800H BYTES
(2)

Build target 'Target 1'

compiling 原始碼(有注解版).c...
BL51 BANKED LINKER/LOCATER V6.02 - SN: Eval Version
"STARTUP.obj",
TO "2"
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 09C3H BYTE (122%) *
Program Size: data=65.2 xdata=0 code=2707
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
LIMIT: 0800H BYTES
Target not created

===================引 用 taishyang 文 章===================
應該不會有人幫你看那麼長且未排版的程式碼哪裡有問題
且無法compiler應該也會有錯誤訊息,可以把錯誤訊息POST上來
有經驗的前輩或許看到錯誤訊息就能猜出問題在哪
建議你用夾擊法收斂出問題在哪,看看程式是擴張到哪個地方後開始無法編譯


lishang83
初階會員


發表:12
回覆:44
積分:31
註冊:2005-07-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-06-17 09:02:09 IP:123.52.xxx.xxx 訂閱
原因可能是你的KEIL C51软件是评估版本,有2K代码限制。

===================引 用 司逸 文 章===================
感謝高手的提醒,

我使用的是"Keil uVision3"作
compiler的動作

而出現錯誤訊息是:

assembling STARTUP.A51...

linking...
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2006
".\原始碼(未注解版).obj"
******************************************************************************
******************************************************************************
LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S)
LIMIT: 0800H BYTES
(2)

Build target 'Target 1'

compiling 原始碼(有注解版).c...
BL51 BANKED LINKER/LOCATER V6.02 - SN: Eval Version
"STARTUP.obj",
TO "2"
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 09C3H BYTE (122%) *
Program Size: data=65.2 xdata=0 code=2707
*** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
LIMIT: 0800H BYTES
Target not created

===================引 用 taishyang 文 章===================
應該不會有人幫你看那麼長且未排版的程式碼哪裡有問題
且無法compiler應該也會有錯誤訊息,可以把錯誤訊息POST上來
有經驗的前輩或許看到錯誤訊息就能猜出問題在哪
建議你用夾擊法收斂出問題在哪,看看程式是擴張到哪個地方後開始無法編譯


------

☆☆ 网事如潮人如水,只叹世间人几回。 ☆☆
司逸
一般會員


發表:1
回覆:4
積分:1
註冊:2009-03-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-06-17 12:39:16 IP:203.64.xxx.xxx 訂閱
感謝高手的回應 ~ 不過 ~ 我該如何簡化程式碼讓我的程式能夠compiler呢?

或者是有沒有其他的軟體能夠compiler?

我自己本身有keil c51以及SIMLAB-8051 ~

不過
keil c51是試用版 ~ 所以沒辦法compiler ~

SIMLAB-8051我試過 ~ 可是發覺它只能夠compiler組合語言 ~ c語言就沒有辦法了 ~

===================引 用 lishang83 文 章===================
原因可能是你的KEIL C51软件是评估版本,有2K代码限制。
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-06-18 17:03:44 IP:114.32.xxx.xxx 訂閱
看了一下,問題並不在 Compiler 而是在 Linker。
不論您的程式是否有註解,Compiler 後的 OBJ 檔是一樣的,
OBJ 檔並不會包含註解。不必為了減少 code size 而分成有註解及無註解的版本。

* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 09C3H BYTE (122%) *

可以看到以上的訊息顯示, 試用版限制大小為 0x800 BYTE = 2,048 BYTE
而您的 code 有 0x9C3 BYTE = 2,499 BYTE

而此錯誤訊息是在 Linking 之後。

若是在學校作專題, 找老師要, 或找學長要可以用的版本再試吧。
------
http://www.ViewMove.com
系統時間:2024-05-02 11:34:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!