使用C語言寫8051密碼鎖~程式太大無法Compiler~並且有功能不會寫~ |
答題得分者是:dllee
|
司逸
一般會員 發表:1 回覆:4 積分:1 註冊:2009-03-08 發送簡訊給我 |
最近期末要交成品~所以寫了好久~
<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 #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;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;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;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 ); } |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
司逸
一般會員 發表:1 回覆:4 積分:1 註冊:2009-03-08 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
司逸
一般會員 發表:1 回覆:4 積分:1 註冊:2009-03-08 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
司逸
一般會員 發表:1 回覆:4 積分:1 註冊:2009-03-08 發送簡訊給我 |
感謝高手的提醒,
我使用的是"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 發送簡訊給我 |
原因可能是你的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 發送簡訊給我 |
感謝高手的回應 ~ 不過 ~ 我該如何簡化程式碼讓我的程式能夠compiler呢?
或者是有沒有其他的軟體能夠compiler? 我自己本身有keil c51以及SIMLAB-8051 ~ 不過keil c51是試用版 ~ 所以沒辦法compiler ~ 而SIMLAB-8051我試過 ~ 可是發覺它只能夠compiler組合語言 ~ c語言就沒有辦法了 ~ ===================引 用 lishang83 文 章=================== 原因可能是你的KEIL C51软件是评估版本,有2K代码限制。 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
看了一下,問題並不在 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |