??? 08/22/10 03:46 Read: times |
#178203 - specific quetion now! Responding to: ???'s previous message |
will this code work for my project??
This is "THE DIGITAL CODE LOCK" Program which takes a 4-digit password ;from the user and compares it with the already saved password. ;If the password entered is correct then the LED GLOWS!!!! ;$ THE DOOR OPENS!!!! ;Otherwise if the password entered is incorrect then the message - "INCORRECT CODE" ;is displayed on the screen of the LCD. ;PIN P0.7 an LED is attached which glows as the lock opens!!! MAIN : CLR P0.6 DB0 EQU P1.0 DB1 EQU P1.1 DB2 EQU P1.2 DB3 EQU P1.3 DB4 EQU P1.4 DB5 EQU P1.5 DB6 EQU P1.6 DB7 EQU P1.7 EN EQU P3.0 RS EQU P3.1 RW EQU P3.2 TEXT EQU P1 ACALL LCD_START ACALL DELAY_3 ACALL LCD_DISPLAY ACALL DELAY_3 MOV R1,#0H MOV R3,#46 ;Use 46 instead of 2 in real program. MOV TMOD,#10H MOV TL1,#0H MOV TH1,#0H SETB TR1 CLR TF1 ACALL LOOP_START LOOP_START:DEC R3 MOV TL1,#0H MOV TH1,#0H SETB TR1 CLR TF1 LOOP1: ACALL KEY ;Store value of digit at R1 SJMP GOTO GOTO : JNB P0.1,KEY_DISPLAY JNB TF1,LOOP1 CLR TF1 ;SET TRO ;CALL LOOP_START INC R3 DJNZ R3,LOOP_START ACALL EXIT KEY_DISPLAY:INC R1 MOV A,#1 CLR CY SUBB A,R1 JZ DISPLAY1 ;MOV R2,#46 ;ACALL LOOP_START MOV A,#2 CLR CY SUBB A,R1 JZ DISPLAY2 ;MOV R2,#46 ;ACALL LOOP_START MOV A,#3 CLR CY SUBB A,R1 JZ DISPLAY3 ;MOV R2,#46 ;ACALL LOOP_START MOV A,#4 CLR CY SUBB A,R1 JZ DISPLAY4 ;ACALL EXIT Control of EXIT is done by DISPLAY$ DISPLAY1:CLR P0.6 LCALL INIT_LCD CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C0h SETB EN CLR EN LCALL WAIT_LCD MOV A,R6 LCALL WRITE_TEXT CJNE R6,#0EEH,DISPLAY22 ;JNB P0.6,GOTO1 MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START ;RET ;GOTO1: CLR P0.6;ACALL LOOP RET DISPLAY22:SETB P0.6 ;To check if digit entered is wrong ;ACALL LOOP MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START RET DISPLAY2:;MOV DPTR, LCALL INIT_LCD CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C1h SETB EN CLR EN LCALL WAIT_LCD MOV A,R6 LCALL WRITE_TEXT CJNE R6,#0EEH,DISPLAY33 ;ACALL LOOP ;JNB P0.6,GOTO2 MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START ;RET ;GOTO2: CLR P0.6 RET DISPLAY33:SETB P0.6 MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START ;ACALL LOOP RET DISPLAY3:LCALL INIT_LCD CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C2h SETB EN CLR EN LCALL WAIT_LCD MOV A,R6 LCALL WRITE_TEXT CJNE R6,#0EEH,DISPLAY44 ;ACALL LOOP ;JNB P0.6,GOTO3 MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START RET ;GOTO3: CLR P0.6 ; RET DISPLAY44:SETB P0.6 MOV R3,#46 ;Use 46 instead of 2 in real program. ACALL LOOP_START ;ACALL LOOP RET DISPLAY4:LCALL INIT_LCD CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C3h SETB EN CLR EN LCALL WAIT_LCD MOV A,R6 LCALL WRITE_TEXT CJNE R6,#0EEH,DISPLAY55 ;JNB P0.6,GOTO4 ;RET ;GOTO4: CLR P0.6 ACALL CHECK DISPLAY55:SETB P0.6 ACALL CHECK CHECK:JNB P0.6,CORRECT ACALL WRONG CORRECT:CLR P0.7 ;CODE ENTERED ISCORRECT ....LED GLOWS....LOCK OPENS LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'C' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'T' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C0h SETB EN CLR EN LCALL WAIT_LCD LCALL INIT_LCD MOV A,#'D' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'P' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'S' LCALL WRITE_TEXT ACALL DELAY_3 ACALL EXIT WRONG:;Code entered is incorrest LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'I' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'T' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT ACALL DELAY_3 ACALL EXIT RET LCD_START:LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'D' LCALL WRITE_TEXT MOV A,#'I' LCALL WRITE_TEXT MOV A,#'G' LCALL WRITE_TEXT MOV A,#'I' LCALL WRITE_TEXT MOV A,#'T' LCALL WRITE_TEXT MOV A,#'A' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'L' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'K' LCALL WRITE_TEXT RET LCD_DISPLAY:LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'E' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'T' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#'R' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'C' LCALL WRITE_TEXT MOV A,#'O' LCALL WRITE_TEXT MOV A,#'D' LCALL WRITE_TEXT MOV A,#'E' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#':' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE MOV TEXT,#0C0h SETB EN CLR EN LCALL WAIT_LCD MOV A,#'*' LCALL WRITE_TEXT MOV A,#'*' LCALL WRITE_TEXT MOV A,#'*' LCALL WRITE_TEXT MOV A,#'*' LCALL WRITE_TEXT ;CLR RS ;PUT CURSOR AT THE STARTING OF THE SECOND LINE ;MOV TEXT,#0CAh ;SETB EN ;CLR EN ;LCALL WAIT_LCD RET ;CJNE R0,#4H,LOOP ;ACALL CHECK DELAY_3:MOV R4,#46 ;MOV R4,#5 ;This statement is for test only.Correct statement is the previous one. ACALL DELAY_ RET DELAY_ :MOV TMOD,#01H MOV TL0,#0H MOV TH0,#0H SETB TR0 CLR TF0 JNB TF0,$ DJNZ R4,DELAY_ RET INIT_LCD: CLR RS MOV TEXT,#38h SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV TEXT,#0Eh SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV TEXT,#06h SETB EN CLR EN LCALL WAIT_LCD RET CLEAR_LCD:CLR RS MOV TEXT,#01h SETB EN CLR EN LCALL WAIT_LCD RET WAIT_LCD:CLR EN ;Start LCD command CLR RS ;It's a command SETB RW ;It's a read command MOV TEXT,#0FFh ;Set all pins to FF initially SETB EN ;Clock out command to LCD MOV A,TEXT ;Read the return value ;CLR ACC.7 ;TEST Statement Remove for main prog. JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy CLR EN ;Finish the command CLR RW ;Turn off RW for future commands RET WRITE_TEXT:SETB RS MOV TEXT,A SETB EN CLR EN LCALL WAIT_LCD RET KEY: CLR P0.1 ;CLR P0.0 MOV R7,#50 ;It should be 50 instead of 2 in real program. ACALL SCANKEYPAD RET SCANKEYPAD:MOV R0,#07FH MOV R4,#0H ;MOV R6,R0 SETB P0.1 SCAN:SETB P0.1 MOV A,R0 RL A MOV R2,P2 MOV R5,P2 MOV R0,A ANL A,R5 CLR CY SUBB A,R5 JZ DEBOUNCE INC R4 CJNE R4,#4,SCAN ACALL NOKEYPRESSED RET DEBOUNCE:DEC R7 CJNE R7,#49,CHK ;It should be 49 instead of 1 for real prog. SETB P0.0 INC R7 MOV A,R5 MOV R6,A DJNZ R7,SCANKEYPAD ACALL KEYPRESSED RET CHK: MOV A,R6 CLR cy SUBB A,R2 JZ SCANKEY ACALL NOKEYPRESSED RET SCANKEY:INC R7 DJNZ R7,SCANKEYPAD ACALL KEYPRESSED RET KEYPRESSED:;MOV P2,R5 CLR P0.1 ACALL EXIT1 RET NOKEYPRESSED:NOP CLR P0.2 ACALL EXIT1 RET EXIT1:NOP ;ACALL GOT0 RET EXIT:NOP LCALL INIT_LCD LCALL CLEAR_LCD MOV A,#'E' LCALL WRITE_TEXT MOV A,#'N' LCALL WRITE_TEXT MOV A,#'D' END |