📄 rfid.a51
字号:
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAME1
CALL DISP_NAME
AJMP GAN2
GAN6: ;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#0C0H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN7
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#0D0H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAME1
CALL DISP_NAME
AJMP GAN2
GAN7: ;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#0E0H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN8
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#0F0H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAME1
CALL DISP_NAME
AJMP GAN2
GAN8: ;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#30H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN9
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#40H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAME1
CALL DISP_NAME
AJMP GAN2
GAN9:
CALL CARD_ERROR
GAN2: SETB ES
CALL DELAYS
CALL DELAYS
AJMP TOP
;##########################################################
; DISPLAY ROUTINES
;##########################################################
TITLES:
MOV DPTR,#MSAG
CALL LCD_MSG
RET
MSAG:
DB 1H,81H,'RFID Based',0C0H,'Attendance Sys',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TITLE1:
MOV DPTR,#MSAG1
CALL LCD_MSG
RET
MSAG1:
DB 1H,81H,'RFID Data:',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY:
MOV DPTR,#MSAG2
CALL LCD_MSG
RET
MSAG2:
DB 1H,80H,'Master Card',0C0H,'Detected...',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY1:
MOV DPTR,#MSAG3
CALL LCD_MSG
RET
MSAG3:
DB 1H,80H,'Press Enter...',0C0H,'*** ADD TAG ***',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY2:
MOV DPTR,#MSAG4
CALL LCD_MSG
RET
MSAG4:
DB 1H,80H,'Press Enter...',0C1H,'** EDIT TAG **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY3:
MOV DPTR,#MSAG5
CALL LCD_MSG
RET
MSAG5:
DB 1H,80H,'Please show the',0C3H,'** TAG **',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY4:
MOV DPTR,#MSAG6
CALL LCD_MSG
RET
MSAG6:
DB 1H,0FH,80H,'Plz enter Name',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY5:
MOV DPTR,#MSAG7
CALL LCD_MSG
RET
MSAG7:
DB 1H,80H,'Press enter EDIT',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP1:
MOV DPTR,#MSG1
CALL LCD_MSG
RET
MSG1:
DB 1H,84H,'Keyboard',0C3H,'* Not Ok *', 00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DATE_DISP:
MOV DPTR,#MSG2
CALL LCD_MSG
RET
MSG2:
DB 1H,80H,'Enter Date',0C0H,'(01-31):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MON_DISP:
MOV DPTR,#MSG3
CALL LCD_MSG
RET
MSG3:
DB 1H,80H,'Enter Month',0C0H,'(01-12):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
YR_DISP:
MOV DPTR,#MSG4
CALL LCD_MSG
RET
MSG4:
DB 1H,80H,'Enter Year',0C0H,'(00-99):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
HR_DISP:
MOV DPTR,#MSG5
CALL LCD_MSG
RET
MSG5:
DB 1H,80H,'Enter Hour',0C0H,'(01-12):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MIN_DISP:
MOV DPTR,#MSG6
CALL LCD_MSG
RET
MSG6:
DB 1H,80H,'Enter Minutes',0C0H,'(00-59):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DAY_DISP:
MOV DPTR,#MSG7
CALL LCD_MSG
RET
MSG7:
DB 1H,80H,'Enter Day',0C0H,'(0-7):',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMS_DISP:
MOV DPTR,#MSG8
CALL LCD_MSG
RET
MSG8:
DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1:',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AM_DISP:
MOV DPTR,#MSG9
CALL LCD_MSG
RET
MSG9:
DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1: AM',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PM_DISP:
MOV DPTR,#MSG10
CALL LCD_MSG
RET
MSG10:
DB 1H,80H,'Enter AM/PM',0C0H,'AM=0,PM=1: PM',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRESS_ENTER:
MOV DPTR,#MSG11
CALL LCD_MSG
RET
MSG11:
DB 1H,82H,'Press Enter',0C4H,'to Save',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ID_SAVED:
MOV DPTR,#MSG12
CALL LCD_MSG
RET
MSG12:
DB 1H,83H,'TAG Saved',0C2H,'Sucessfully',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NAME1:
MOV DPTR,#MSG13
CALL LCD_MSG
RET
MSG13:
DB 1H,82H,'* Welcome *',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CARD_ERROR:
MOV DPTR,#MSG14
CALL LCD_MSG
RET
MSG14:
DB 1H,84H,'Card Not',0C3H,,'Programmed',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NO_CARD:
MOV DPTR,#MSG15
CALL LCD_MSG
RET
MSG15:
DB 1H,84H,'No card',0C3H,,'Programmed',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; COMPARE WITH MASTER CARD
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
COMPARE:
MOV A,BYTES
CJNE A,BYTE,FGG
MOV A,BYTES+1
CJNE A,BYTE+1,FGG
MOV A,BYTES+2
CJNE A,BYTE+2,FGG
MOV A,BYTES+3
CJNE A,BYTE+3,FGG
MOV A,BYTES+4
CJNE A,BYTE+4,FGG
MOV A,BYTES+5
CJNE A,BYTE+5,FGG
MOV A,BYTES+6
CJNE A,BYTE+6,FGG
MOV A,BYTES+7
CJNE A,BYTE+7,FGG
MOV A,BYTES+8
CJNE A,BYTE+8,FGG
MOV A,BYTES+9
CJNE A,BYTE+9,FGG
SETB MAS
FGG: RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DELAY:
MOV R1,#0FFH
RE1: MOV R2,#0FFH
RE: NOP
DJNZ R2,RE
DJNZ R1,RE1
RET
;**********************************************************
DELAYS: ;One second delay routine
MOV R0,#05H
RS3: MOV R1,#0FFH
RA1: MOV R2,#0FFH
RS2: NOP
DJNZ R2,RS2
DJNZ R1,RA1
DJNZ R0,RS3
RET
;---------==========----------==========---------=========---------
SERIAL:
PUSH PSW ; save current registerset
MOV PSW,#RB1
PUSH ACC
JB TI,TRANS
MOV A,SBUF
CJNE A,#0AH,DOWNW
MOV COUNTER,#01H
AJMP DDWN
DOWNW:CJNE A,#0DH,DOWN2
MOV COUNTER,#01H
AJMP DDWN
DOWN2:
MOV R1,COUNTER
CJNE R1,#01H,YH1
MOV BYTE,A
AJMP DOWN1
YH1: CJNE R1,#02H,YH2
MOV BYTE+1,A
AJMP DOWN1
YH2: CJNE R1,#03H,YH3
MOV BYTE+2,A
AJMP DOWN1
YH3: CJNE R1,#04H,YH4
MOV BYTE+3,A
AJMP DOWN1
YH4: CJNE R1,#05H,YH5
MOV BYTE+4,A
AJMP DOWN1
YH5: CJNE R1,#06H,YH6
MOV BYTE+5,A
AJMP DOWN1
YH6: CJNE R1,#07H,YH7
MOV BYTE+6,A
AJMP DOWN1
YH7: CJNE R1,#08H,YH8
MOV BYTE+7,A
AJMP DOWN1
YH8: CJNE R1,#09H,YH9
MOV BYTE+8,A
AJMP DOWN1
YH9: CJNE R1,#0AH,DOWN1
MOV BYTE+9,A
SETB RECEIVED
AJMP DOWN1
DOWN1:INC COUNTER
DDWN: CLR RI
POP ACC
POP PSW
RETI
TRANS: CLR TI
POP ACC
POP PSW
RETI
;**********************************************************
; INITIALIZE THE LCD 4-BIT MODE
;**********************************************************
INITLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
MOV R4, #CONFIG; FUNCTION SET - DATA BITS,
; LINES, FONTS
CALL WRLCDCOM4
MOV R4, #ONDSP ; DISPLAY ON
CALL WRLCDCOM4
MOV R4, #ENTRYMODE ; SET ENTRY MODE
CALL WRLCDCOM4 ; INCREMENT CURSOR RIGHT, NO SHIFT
MOV R4, #CLRDSP; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
RET
; **********************************************************
; SOFTWARE VERSION OF THE POWER ON RESET
; **********************************************************
RESETLCD4:
CLR LCD_RS ; LCD REGISTER SELECT LINE
CLR LCD_E ; ENABLE LINE
CLR LCD_DB7 ; SET BIT PATTERN FOR...
CLR LCD_DB6 ; ... POWER-ON-RESET
SETB LCD_DB5
SETB LCD_DB4
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #4 ; DELAY 4 MILLISECONDS
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
CLR LCD_DB4 ; SPECIFY 4-BIT OPERATION
SETB LCD_E ; START ENABLE PULSE
CLR LCD_E ; END ENABLE PULSE
MOV A, #1 ; DELAY 1 MILLISECOND
CALL MDELAY
MOV R4, #CONFIG; FUNCTION SET
CALL WRLCDCOM4
MOV R4, #08H ; DISPLAY OFF
CALL WRLCDCOM4
MOV R4, #1 ; CLEAR DISPLAY, HOME CURSOR
CALL WRLCDCOM4
MOV R4,#ENTRYMODE ; SET ENTRY MODE
ACALL WRLCDCOM4
JMP INITLCD4
; **********************************************************
; SUB WRITES A COMMAND WORD TO THE LCD
; COMMAND MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDCOM4:
CLR LCD_E
CLR LCD_RS ; SELECT SEND COMMAND
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
CALL MADELAY
POP ACC
RET
; **********************************************************
; SUB TO WRITE A DATA WORD TO THE LCD
; DATA MUST BE PLACED IN R4 BY CALLING PROGRAM
; **********************************************************
WRLCDDATA:
CLR LCD_E
SETB LCD_RS ; SELECT SEND DATA
PUSH ACC ; SAVE ACCUMULATOR
MOV A, R4 ; PUT DATA BYTE IN ACC
MOV C, ACC.4 ; LOAD HIGH NIBBLE ON DATA BUS
MOV LCD_DB4, C ; ONE BIT AT A TIME USING...
MOV C, ACC.5 ; BIT MOVE OPERATOINS
MOV LCD_DB5, C
MOV C, ACC.6
MOV LCD_DB6, C
MOV C, ACC.7
MOV LCD_DB7, C
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
MOV C, ACC.0 ; SIMILARLY, LOAD LOW NIBBLE
MOV LCD_DB4, C
MOV C, ACC.1
MOV LCD_DB5, C
MOV C, ACC.2
MOV LCD_DB6, C
MOV C, ACC.3
MOV LCD_DB7, C
CLR LCD_E
SETB LCD_E ; PULSE THE ENABLE LINE
CLR LCD_E
NOP
NOP
POP ACC
RET
; **********************************************************
; SUB TAKES THE STRING IMMEDIATELY FOLLOWING THE CALL AND
; DISPLAYS ON THE LCD. STRING MUST BE TERMINATED WITH A
; NULL (0).
; **********************************************************
LCD_MSG:
CLR A ; Clear Index
MOVC A,@A+DPTR ; Get byte pointed by Dptr
INC DPTR ; Point to the next byte
JZ LCD_Msg9 ; Return if found the zero (end of stringz)
CJNE A,#001H,Lcd_Msg1 ; Check if is a Clear Command
MOV R4,A
CALL WRLCDCOM4 ;If yes, write it as command to LCD
JMP LCD_MSG ;Go get next byte from stringz
Lcd_Msg1: CJNE A,#0FFH,FLL ;Check for displaying full character
MOV R4,A
CALL WRLCDDATA
JMP LCD_MSG
FLL: CJNE A,#080h,$+3 ; Data or Address? If => 80h then is address.
JC Lcd_Msg_Data ; Carry will be set if A < 80h (Data)
MOV R4,A
CALL WRLCDCOM4 ; Carry not set if A=>80, it is address
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg_Data: ;
MOV R4,A
CALL WRLCDDATA ; It was data, write it to Lcd
JMP Lcd_Msg ; Go get next byte from stringz
Lcd_Msg9:
RET ; Return to Caller
; **********************************************************
; 1 MILLISECOND DELAY ROUTINE
; **********************************************************
MDELAY:
PUSH ACC
MOV A,#0A6H
MD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MD_OLP
NOP
POP ACC
RET
MADELAY:
PUSH ACC
MOV A,#036H
MAD_OLP:
INC A
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
JNZ MAD_OLP
NOP
POP ACC
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; **********************************************************
; SUB SETS THE DS1307 OSCILLATOR
; **********************************************************
OSC_CONTROL:
ACALL SEND_START ; GENERATE START CONDITION
MOV A,#DS1307W ; 1101 0000 ADDRESS + WRITE-BIT
ACALL SEND_BYTE ; SEND BYTE TO 1307
MOV A,#00H ; ADDRESS BYTE TO REGISTER 00H
ACALL SEND_BYTE ; SECONDS REGISTER, ALWAYS LEAVE
SETB LASTREAD ; REG 00H-BIT #7 = 0 (LOW)
ACALL SEND_STOP ; IF REG 00H-BIT #7 = 1 CLOCK
ACALL SEND_START ; OSCILLATOR IS OFF.
MOV A,#DS1307R ; 1101 0001 ADDRESS + READ-BIT
ACALL SEND_BYTE ;
ACALL READ_BYTE ; READ A BYTE FROM THE 1307
CLR ACC.7 ; CLEAR REG 00H-BIT #7 TO ENABLE
OSC_SET: ; OSCILLATOR.
PUSH ACC ; SAVE ON STACK
ACALL SEND_STOP ;
ACALL SEND_START ;
MOV A,#DS1307W ; SETUP TO WRITE
ACALL SEND_BYTE ;
MOV A,#00H ; REGISTER 00H ADDRESS
ACALL SEND_BYTE ;
POP ACC ; GET DATA TO START OSCILLATOR
ACALL SEND_BYTE ; SEND IT
ACALL SEND_STOP
RET
; **********************************************************
; THIS SUB CONTROLS THE SQW OUTPUT 1HZ
; **********************************************************
SQW_CONTROL_1HZ:
LCALL SEND_START ; SEND START CONDITION
MOV A,#DS1307W ; SET POINTER TO REG 07H ON
; DS1307
LCALL SEND_BYTE
MOV A,#07H
LCALL SEND_BYTE
MOV A,#90H ; SQW/OUT ON AT 1HZ
JNB SQW,SQW_SET ; JUMP IF SQW BIT IS ACTIVE
MOV A,#80H ; TURN SQW/OUT OFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -