Professional Documents
Culture Documents
SW
SW
PDF
RB0 EQU 00H ; Select Register Bank 0
RB1 EQU 08H ; Select Register Bank 1 ...poke to PSW to use
RB2 EQU 10H ; Select Register Bank 1 ...poke to PSW to use
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; PORT DECLERATION
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SDA EQU P1.2 ;SDA=PIN5
SCL EQU P1.1 ;SCL=PIN6
; ***SYSTEM INSTRUCTIONS***
DSEG ; This is internal data memory
ORG 20H ; Bit adressable memory
FLAGS1: DS 1
RECEIVED BIT FLAGS1.0
AM BIT FLAGS1.1
MAS BIT FLAGS1.2
KEYBRD BIT FLAGS1.3
AMS BIT FLAGS1.4
COUNTER: DS 1
FLAGS: DS 1
LASTREAD BIT FLAGS.0
SQW BIT FLAGS.4
ACKS BIT FLAGS.5
BUS_FLT BIT FLAGS.6
_2W_BUSY BIT FLAGS.7
; ***MACRO'S***
SCL_HIGH MACRO
SETB SCL ; SET SCL HIGH
JNB SCL,$ ; LOOP UNTIL STRONG 1 ON SCL
ENDM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CSEG ; Code begins here
; ---------==========----------==========---------=========---------
; Main routine. Program execution starts here.
; ---------==========----------==========---------=========---------
ORG 00H ; Reset
AJMP MAIN
ORG 23H
JMP SERIAL
; ---------==========----------==========---------=========---------
MAIN:
MOV PSW,#RB0 ; Select register bank 0
MOV SP,#STACK
; **********************************************************
; INITILIZE RTC
; **********************************************************
SETB SDA ; ENSURE SDA HIGH
SCL_HIGH ; ENSURE SCL HIGH
CLR ACKS ; CLEAR STATUS FLAGS
CLR BUS_FLT
CLR _2W_BUSY
CLR SQW
CALL OSC_CONTROL ;Initilize the RTC
; **********************************************************
MOV TMOD,#20H
MOV TH1,#0FDH
MOV SCON,#50H
SETB ES
SETB EA
SETB TR1
MOV COUNTER,#01H
CLR RECEIVED
CLR KEYBRD
CALL RESETLCD4
CALL INITLCD4
CALL TITLES
;**********************************************************
; STORE RTC TIME
;**********************************************************
KBNotOKS:
CALL DISP1
JB ENTER,$
NOP
JNB ENTER,$
AJMP FXC4
;***********************************************************************
*
SET_RTC:
MOV TEMP,#00H
JB KEYBRD,LAOPS
FXC4: CALL InitKeyb ;Inizialize Keyboard
MOV a, KB_OK
JZ KBNotOKS
SETB KEYBRD
LAOPS: LCALL LOAPA
;***********************************************************************
*
;***********************************************************************
*
; MOV R1,#BYTE
; MOV R4,#10H ;MASTER ADDRESS
; CALL STORE_EEPROM
; MOV TOTAL,#00H
; CALL WRITE_TOTAL
; MOV COUNTT,#00H
; CALL WRITE_COUNTT
;***********************************************************************
*
TOOPS: SETB SEND
TOP: CALL RTCLOCK
MOV R0,#04H
RX3: MOV R1,#0FFH
RX1: MOV R2,#0FFH
RX2: JB RECEIVED,TOPS
DJNZ R2,RX2
DJNZ R1,RX1
DJNZ R0,RX3
AJMP TOP
;***********************************************************************
*
TOPS: MOV COUNTER,#01H
CLR RECEIVED
CLR ES
MOV R1,#BYTES ;CHECK FOR MASTER CARD
MOV R4,#10H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,OTHER1
CALL DISPLAY
CALL DELAYS
CALL DELAYS
REP1: MOV TEMP,#01H
CALL DISPLAY1 ;Press enter to add tag
SETB UP
SETB DOWN
SETB ENTER
SETB CANCEL
UJI1: JNB CANCEL, VBN1
JNB UP,VBN2
JNB DOWN,VBN3
JNB ENTER,VBN4
AJMP UJI1
OTHER1: AJMP OTHER
VBN1: JNB CANCEL,$
SETB ES
CLR RECEIVED
AJMP TOP
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@
GHO1: CJNE R5,#02H,GHO2 ;Delete Tag
JNB ENTER,$
JMP DELETE_PGM
GHO2: JNB ENTER,$
AJMP UJI1
KBNotOK:
CALL DISP1
JB ENTER,$
NOP
JNB ENTER,$
AJMP FDC4
REAP1: CALL DELAY
JNB CANCEL,$
AJMP REP1
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@
VBN4: MOV R5,TEMP
CJNE R5,#01H,GHO1 ;Add Tag
VBC1: CLR RECEIVED
CALL DISPLAY3 ;Show TAG
SETB ES
FVG1: JNB CANCEL,REAP1
JNB RECEIVED,FVG1
CLR ES
JB KEYBRD,LOOP1
FDC4: CALL InitKeyb ;Inizialize Keyboard
MOV a, KB_OK
JZ KBNotOK
SETB KEYBRD
LOOP1: CALL DISPLAY4 ;plz enter name
MOV TEMP,#00H
CALL CLEAR_RAM
EDC: CALL LOOP
INC TEMP
MOV R2,TEMP
CJNE R2,#01H,EDC1
MOV R1,#NAMES
MOV @R1,KB_DATA
EDC1: CJNE R2,#02H,EDC2
MOV R1,#NAMES+1
MOV @R1,KB_DATA
EDC2: CJNE R2,#03H,EDC3
MOV R1,#NAMES+2
MOV @R1,KB_DATA
EDC3: CJNE R2,#04H,EDC4
MOV R1,#NAMES+3
MOV @R1,KB_DATA
EDC4: CJNE R2,#05H,EDC5
MOV R1,#NAMES+4
MOV @R1,KB_DATA
EDC5: CJNE R2,#06H,EDC6
MOV R1,#NAMES+5
MOV @R1,KB_DATA
EDC6: CJNE R2,#07H,EDC7
MOV R1,#NAMES+6
MOV @R1,KB_DATA
EDC7: CJNE R2,#08H,EDC8
MOV R1,#NAMES+7
MOV @R1,KB_DATA
EDC8: CJNE R2,#09H,EDC9
MOV R1,#NAMES+8
MOV @R1,KB_DATA
EDC9: CJNE R2,#10,EDC10
MOV R1,#NAMES+9
MOV @R1,KB_DATA
EDC10: CJNE R2,#11,EDC11
MOV R1,#NAMES+10
MOV @R1,KB_DATA
EDC11: CJNE R2,#12,EDC12
MOV R1,#NAMES+11
MOV @R1,KB_DATA
EDC12: CJNE R2,#13,EDC13
MOV R1,#NAMES+12
MOV @R1,KB_DATA
EDC13: CJNE R2,#14,EDC14
MOV R1,#NAMES+13
MOV @R1,KB_DATA
EDC14: CJNE R2,#15,EDC15
MOV R1,#NAMES+14
MOV @R1,KB_DATA
EDC15: CJNE R2,#16,EDC16
MOV R1,#NAMES+15
MOV @R1,KB_DATA
EDC16: CJNE R2,#17,EDC
CALL DELAYS
CALL PRESS_ENTER
SETB ENTER
SETB CANCEL
HHJ: JNB CANCEL,LOOP1S
JB ENTER,HHJ
CALL READ_TOTAL
INC TOTAL
MOV A,TOTAL
CJNE A,#01H,JNM1
MOV R1,#BYTE ;store tag ID
MOV R4,#20H ;Starting Address
MOV R6,#10 ;STORE 10 BYTES
CALL STORE_EEPROM
CALL MDELAY
MOV R1,#NAMES ;store Name
MOV R4,#30H ;Starting Address
MOV R6,#16 ;STORE 16 BYTES
CALL STORE_EEPROM
AJMP JNM
LOOP1S: AJMP LOOP1
Loop: CALL Check_Keyb
JNB ENTER,GHBH
JNB CANCEL,DCFV1
JNC Loop
MOV R4,KB_DATA
CALL WRLCDDATA
RET
GHBH: JNB ENTER,$
MOV TEMP,#16
RET
DCFV1: JNB CANCEL,$
AJMP LOOP1
;********************************************
OTHER:
CALL READ_TOTAL
MOV R2,TOTAL
CALL CLEAR_RAM
;check first card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#20H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN1
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#30H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAMES1
CALL DISP_NAME
AJMP GAN2
GAN1:
;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#40H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN3
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#50H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAMES1
CALL DISP_NAME
AJMP GAN2
GAN3:
;check 3 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#60H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN4
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#70H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAMES1
CALL DISP_NAME
AJMP GAN2
GAN4:
;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#80H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN5
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#90H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAMES1
CALL DISP_NAME
AJMP GAN2
GAN5:
;check 2 card
MOV R1,#BYTES ;GET DATA IN BYTES(RAM)
MOV R4,#0A0H ;MASTER ADDRESS
MOV R6,#10 ;NUMBER OF BYTES
CALL READ_EEPROM
CLR MAS
CALL COMPARE
JNB MAS,GAN6
MOV R1,#NAMES ;GET DATA IN BYTES(RAM)
MOV R4,#0B0H ;MASTER ADDRESS
MOV R6,#16 ;NUMBER OF BYTES
CALL READ_EEPROM
CALL NAMES1
CALL DISP_NAME
AJMP GAN2
NAMES1:
JNB AM,ASX1 ;jmp if PM
CALL NAME1
RET
ASX1: CALL NAME3
RET
;##########################################################
; 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,80H,'* Good Morning *',0C0H,00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NAME3:
MOV DPTR,#MSG132
CALL LCD_MSG
RET
MSG132:
DB 1H,80H,'* Good Evening *',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
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SENDING_DATA:
MOV DPTR,#MSG16
CALL LCD_MSG
RET
MSG16:
DB 1H,80H,'Sending Data...',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TIME_OUT:
MOV DPTR,#MSG17
CALL LCD_MSG
RET
MSG17:
DB 1H,82H,'** Sorry **',0C4H,'Time out',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SHOW_MASTER:
MOV DPTR,#MSG18
CALL LCD_MSG
RET
MSG18:
DB 1H,80H,'Show Master Card',0C0H,'to Send data PC',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SEND_COMPLETED:
MOV DPTR,#MSG19
CALL LCD_MSG
RET
MSG19:
DB 1H,80H,'Datas tranmitted',0C3H,'Sucessfully',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WANTTO_DELETE:
MOV DPTR,#MSG20
CALL LCD_MSG
RET
MSG20:
DB 1H,80H,'Want to Delete',0C3H,'All Records',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DATA_DELETED:
MOV DPTR,#MSG21
CALL LCD_MSG
RET
MSG21:
DB 1H,80H,'* Data Deleted *',0C3H,'Sucessfully',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CARD_NOTPROG:
MOV DPTR,#MSG22
CALL LCD_MSG
RET
MSG22:
DB 1H,80H,'* Master Card *',0C5H,'Error',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 – OFF HIGH
SQW_SET:
LCALL SEND_BYTE
LCALL SEND_STOP
RET
; **********************************************************
; THIS SUB READS ONE BYTE OF DATA FROM THE DS1307
; **********************************************************
READ_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS DATA
MOV A,#00H
SETB SDA ; SET SDA HIGH TO ENSURE LINE
; FREE
READ_BITS:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
RLC A ; ROTATE CARRY-BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ BITCNT,READ_BITS
; LOOP FOR 8-BITS
JB LASTREAD,ACKN
; CHECK TO SEE IF THIS IS
; THE LAST READ
CLR SDA ; IF NOT LAST READ SEND ACK-BIT
ACKN:
SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CLR SCL ; OR NOT ACKNOWLEDGE BIT
RET
; **********************************************************
; SUB SENDS START CONDITION
; **********************************************************
SEND_START:
SETB _2W_BUSY ; INDICATE THAT 2-WIRE
CLR ACKS ; OPERATION IS IN PROGRESS
CLR BUS_FLT ; CLEAR STATUS FLAGS
JNB SCL,FAULT
JNB SDA,FAULT
SETB SDA ; BEGIN START CODITION
SCL_HIGH
CLR SDA
ACALL DEELAY
CLR SCL
RET
FAULT:
SETB BUS_FLT
RET
; **********************************************************
; SUB SENDS STOP CONDITION
; **********************************************************
SEND_STOP:
CLR SDA
SCL_HIGH
SETB SDA
CLR _2W_BUSY
RET
; **********************************************************
; SUB DELAYS THE BUS
; **********************************************************
DEELAY:
NOP ; DELAY FOR BUS TIMING
RET
; **********************************************************
; THIS SUB SENDS 1 BYTE OF DATA TO THE DS1307
; CALL THIS FOR EACH REGISTER SECONDS TO YEAR
; ACC MUST CONTAIN DATA TO BE SENT TO CLOCK
; **********************************************************
SEND_BYTE:
MOV BITCNT,#08H; SET COUNTER FOR 8-BITS
SB_LOOP:
JNB ACC.7,NOTONE; CHECK TO SEE IF BIT-7 OF
SETB SDA ; ACC IS A 1, AND SET SDA HIGH
JMP ONE
NOTONE:
CLR SDA ; CLR SDA LOW
ONE:
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
RL A ; ROTATE ACC LEFT 1-BIT
CLR SCL ; TRANSITION SCL LOW-TO-HIGH
DJNZ BITCNT,SB_LOOP; LOOP FOR 8-BITS
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
CLR ACKS
JNB SDA,SB_EX ; CHECK FOR ACK OR NOT ACK
SETB ACKS ; SET ACKNOWLEDGE FLAG FOR
; NOT ACK
SB_EX:
CALL DEELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
CALL DEELAY ; DELAY FOR AN OPERATION
RET
; **********************************************************
; SUB READS THE CLOCK AND WRITES IT TO THE SCRATCHPAD MEMORY
; ON RETURN FROM HERE DATE & TIME DATA WILL BE STORED IN THE
; DATE & TIME REGISTERS FROM 24H (SECS) TO 2AH (YEAR)
; ALARM SETTINGS IN REGISTERS 2CH(HRS) AND 2DH(MINUTES).
; **********************************************************
READ_CLOCK:
MOV R1,#SECS ; SECONDS STORAGE LOCATION
MOV BYTECNT,#00H
CLR LASTREAD
CALL SEND_START
MOV A,#DS1307W
CALL SEND_BYTE
MOV A,#00H
CALL SEND_BYTE
CALL SEND_STOP
CALL SEND_START
MOV A,#DS1307R
CALL SEND_BYTE
READ_LOOP:
MOV A,BYTECNT
CJNE A,#09H,NOT_LAST
SETB LASTREAD
NOT_LAST:
CALL READ_BYTE
MOV @R1,A
MOV A,BYTECNT
CJNE A,#00H,NOT_FIRST
MOV A,@R1
CLR ACC.7 ; ENSURE OSC BIT=0 (ENABLED)
MOV @R1,A
NOT_FIRST:
INC R1
INC BYTECNT
MOV A,BYTECNT
CJNE A,#0AH,READ_LOOP
CALL SEND_STOP
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
; DISPLAY CLOCK ON LCD
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
RTCLOCK:
CALL READ_CLOCK
MOV R4,#01H
CALL WRLCDCOM4
CALL MDELAY
MOV R4,#81H
CALL WRLCDCOM4
CALL MDELAY
MOV R3,DATE1
CALL SPLIT_DATA
MOV R4,#'-'
CALL WRLCDDATA
CALL MDELAY
MOV R3,MONTH
CALL SPLIT_DATA
MOV R4,#'-'
CALL WRLCDDATA
CALL MDELAY
MOV R4,#'2'
CALL WRLCDDATA
CALL MDELAY
MOV R4,#'0'
CALL WRLCDDATA
CALL MDELAY
MOV R3,YEAR
CALL SPLIT_DATA
MOV A,DAY
CJNE A,#01H,TGY1
CALL SUN
JMP TGY
TGY1: CJNE A,#02H,TGY2
CALL MON
JMP TGY
TGY2: CJNE A,#03H,TGY3
CALL TUE
JMP TGY
TGY3: CJNE A,#04H,TGY4
CALL WED
JMP TGY
TGY4: CJNE A,#05H,TGY5
CALL THU
JMP TGY
TGY5: CJNE A,#06H,TGY6
CALL FRI
JMP TGY
TGY6: CJNE A,#07H,TGY
CALL SAT
JMP TGY
TGY: MOV R4,#0C3H
CALL WRLCDCOM4
CALL MDELAY
MOV A,HRS
JNB ACC.5,DCF3
CLR AM
AJMP DCF2
DCF3: SETB AM
DCF2: ANL A,#00011111B
MOV R3,A
CALL SPLIT_DATA
MOV R4,#':'
CALL WRLCDDATA
CALL MDELAY
MOV R3,MINS
CALL SPLIT_DATA
MOV R4,#':'
CALL WRLCDDATA
CALL MDELAY
MOV R3,SECS
CALL SPLIT_DATA
MOV R4,#' '
CALL WRLCDDATA
CALL MDELAY
JNB AM,DCF0
MOV R4,#'A'
CALL WRLCDDATA
CALL MDELAY
JMP DCF4
DCF0: MOV R4,#'P'
CALL WRLCDDATA
CALL MDELAY
DCF4: MOV R4,#'M'
CALL WRLCDDATA
CALL MDELAY
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
SPLIT_DATA:
MOV A,R3
ANL A,#0F0H
SWAP A
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
MOV A,R3
ANL A,#0FH
ADD A,#30H
MOV R4,A
CALL WRLCDDATA
CALL MDELAY
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SUN:
MOV DPTR,#MAG1
CALL LCD_MSG
RET
MAG1:
DB ' SUN',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MON:
MOV DPTR,#MAG2
CALL LCD_MSG
RET
MAG2:
DB ' MON',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TUE:
MOV DPTR,#MAG3
CALL LCD_MSG
RET
MAG3:
DB ' TUE',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WED:
MOV DPTR,#MAG4
CALL LCD_MSG
RET
MAG4:
DB ' WED',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
THU:
MOV DPTR,#MAG5
CALL LCD_MSG
RET
MAG5:
DB ' THU',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FRI:
MOV DPTR,#MAG6
CALL LCD_MSG
RET
MAG6:
DB ' FRI',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SAT:
MOV DPTR,#MAG7
CALL LCD_MSG
RET
MAG7:
DB ' SAT',00H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;**********************************************************************
*
; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
; to the EEPROM and includes START condition. Refer to the data sheets
; for discussion of START and STOP conditions.
;***********************************************************************
;**********************************************************************
; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
; without sending a START condition.
;**********************************************************************
;*********************************************************************
; This routine test for WRITE DONE condition
; by testing for an ACK.
; This routine can be run as soon as a STOP condition
; has been generated after the last data byte has been sent
; to the EEPROM. The routine loops until an ACK is received from
; the EEPROM. No ACK will be received until the EEPROM is done with
; the write operation.
;*********************************************************************
ACKTST: MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND
ADDRESS
MOV R2,#8 ;LOOP COUNT -- EQUAL TO BIT COUNT
CLR SDA1 ;START CONDITION -- DATA = 0
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK = 0
AKTLP: RLC A ;SHIFT BIT
JNC AKTLS
SETB SDA1 ;DATA = 1
JMP AKTL1 ;CONTINUE
AKTLS: CLR SDA1 ;DATA = 0
AKTL1: SETB SCL1 ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
CLR SCL1 ;CLOCK LOW
DJNZ R2,AKTLP ;DECREMENT COUNTER
SETB SDA1 ;TURN PIN INTO INPUT
NOP ;NOTE 1
SETB SCL1 ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
JNB SDA1,EXIT ;EXIT IF ACK (WRITE DONE)
JMP ACKTST ;START OVER
EXIT: CLR SCL1 ;CLOCK LOW
CLR SDA1 ;DATA LOW
NOP ;NOTE 1
NOP
NOP
SETB SCL1 ;CLOCK HIGH
NOP
NOP
SETB SDA1 ;STOP CONDITION
RET
;*********************************************************************
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; STORE ID IN EEPROM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
STORE_EEPROM:
MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
BTLP: MOV A,@R1 ;GET DATA
CALL OUT ;SEND IT
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,BTLP ;LOOP TILL DONE
CALL STOP ;SEND STOP CONDITION
RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; READ DATAS FROM EEPROM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
READ_EEPROM:
MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,#RDCMD ;LOAD READ COMMAND
CALL OUTS ;SEND IT
BRDLP: CALL IN ;READ DATA
MOV @R1,a ;STORE DATA
INC R1 ;INCREMENT DATA POINTER
DJNZ R6,AKLP ;DECREMENT LOOP COUNTER
CALL STOP ;IF DONE, ISSUE STOP CONDITION
RET ;DONE, EXIT ROUTINE
;*************************************
; InitKeyb:
;*************************************
InitKeyb:
mov KB_TEMP, #0
mov KB_OK, #0
mov r1, #0FFH
call Write_Keyb
call Check_Keyb
call CheckACK
jnc InitKeyb
;*************************************
; Keyb_Leds: Set KB_STATS as leds
;*************************************
Keyb_Leds:
mov r1, #0EDH ; Set Leds
call Write_Keyb
call Check_Keyb
call CheckACK
jnc KeybErr
mov r1, KB_STATS
call Write_Keyb
call Check_Keyb
call CheckACK
KeybErr:
ret
;*************************************
; Zero2One: Wait for 0 to 1 on kb
; clock line, read the kb data line
; and shift right the bit to acc.7
;*************************************
Zero2One:
jnb KEYB_CLOCK, $
jb KEYB_CLOCK, $
mov c, KEYB_DATA
rrc a
ret
;*************************************
; Check_Keyb: Check to see if any key
; are pressed or release, returns
; ASCII codes on KB_DATA, or 1 for
; special keys, 2 for same special
; with shift. Return also the scan
; code on KB_SCAN.
; Special Keys are basicaly all non
; printable keys. See the table below
; all 1 and 2 returned are special keys
;*************************************
Check_Keyb:
setb KEYB_DATA
setb KEYB_CLOCK ; CLOCK & DATA high = Idle Pos
mov r0, #50
CheckAgain:
jnb KEYB_CLOCK, KeyHit
djnz r0, CheckAgain ; check r0 times
sjmp KeyEnd
KeyHit:
jnb KEYB_DATA, KeyHit2 ; Start bit must be 0
KeyEnd:
clr KEYB_CLOCK ; disable keyb
clr c ; c=0 = no keypress
ret
KeyHit2:
mov r0, #8 ; 8 bits
clr a
KeyHit3:
call Zero2One
djnz r0, KeyHit3
mov r1, a
clr a
call Zero2One ; Parity bit
call Zero2One ; Stop bit
; acc.7 = stop, acc.6 = parity
clr KEYB_CLOCK
NoIgnore:
mov KB_SCAN, r1
NoKbACK:
cjne r1, #KB_PAUSE, NoKbPause
mov KB_TEMP, #7 ; Ignore next 7 scans
mov a, KB_OK
cpl acc.6
mov KB_OK, a
sjmp ChkKbEndNC
NoKbPause:
cjne r1, #KB_EXT, NoKbExt
orl KB_OK, #EXTENDED
sjmp ChkKbEndNC
NoKbExt:
cjne r1, #KB_REL, NoRelease
orl KB_STATS, #RELEASE
sjmp ChkKbEndNC
NoRelease:
; Test Num lock, if pressed toggle led
cjne r1, #KB_NUML, NoNumLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.1
clr acc.7
mov KB_STATS, a
call Keyb_Leds
sjmp ChkKbEndNC
NoNumLock:
; Test Caps lock, if pressed toggle led
cjne r1, #KB_CAPS, NoCapsLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.2
clr acc.7
mov KB_STATS, a
call Keyb_Leds
sjmp ChkKbEndNC
NoCapsLock:
; Test Scroll lock, if pressed toggle led
cjne r1, #KB_SCROLL, NoScrollLock
mov a, KB_STATS
jnb acc.7, ChkKbEndNC
cpl acc.0
clr acc.7
mov KB_STATS, a
call Keyb_Leds
ChkKbEndNC:
clr c
ret
NoScrollLock:
; Test L & R shifts, set bit if pressed, clear on release
cjne r1, #KB_LSHIFT, NoShift1
ShiftOK:
mov a, KB_STATS
jbc acc.7, ShiftRel
setb acc.3 ; not releasing, so Set SHIFT bit
sjmp ShiftEnd
ShiftRel:
clr acc.3 ; releasing, so Clear SHIFT bit
ShiftEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoShift1:
cjne r1, #KB_RSHIFT, NoShift
sjmp ShiftOK
NoShift:
cjne r1, #KB_CTRL, NoCtrl
mov a, KB_STATS
jbc acc.7, CtrlRel
setb acc.5 ; not releasing, so Set CTRL bit
sjmp CtrlEnd
CtrlRel:
clr acc.5 ; releasing, so Clear SHIFT bit
CtrlEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoCtrl:
cjne r1, #KB_ALT, NoAlt
mov a, KB_STATS
jbc acc.7, AltRel
setb acc.6 ; not releasing, so Set ALT bit
sjmp AltEnd
AltRel:
clr acc.6 ; releasing, so Clear ALT bit
AltEnd:
mov KB_STATS, a
sjmp ChkKbEndNC
NoAlt:
mov a, KB_STATS ; Releasing key test
jnb acc.7, NoRel2
clr acc.7 ; if releasing > clear
mov KB_STATS, a ; rel bit on KB_STATS
clr c ; and do nothing
ret
NoRel2:
mov a, KB_OK ; Extended key test
jnb acc.7, KbChars
clr acc.7 ; if Extended > clear
mov KB_OK, a ; EXT bit on KB_OK
clr c ; and do nothing
ret
KbChars:mov dptr, #KbScanCodes
mov a, KB_STATS
jnb acc.2, TestShift
jb acc.3, KbChkOK
mov a, r1
movc a, @a+dptr
mov r0, a
subb a, #97
jc KbChkOK
mov a, r0
subb a, #123
jnc KbChkOK
mov dptr, #KbScanCodes2 ; if (a to z) & Caps > table 2
sjmp KbChkOK
TestShift:
jnb acc.3, KbChkOK
mov dptr, #KbScanCodes2 ; with shift table 2
KbChkOK:
mov a, r1
movc a, @a+dptr
mov KB_DATA, a
setb c
ret
;*************************************
; Zero2One2: Wait for high to low in
; kb clock line
;*************************************
Zero2One2:
jnb KEYB_CLOCK, $
jb KEYB_CLOCK, $
ret
;*************************************
; Write_Keyb: Send r1 to the kb
;*************************************
Write_Keyb:
mov r0, #8 ; 8 bits to receive
clr KEYB_CLOCK ; break the Keyboard
mov r7, #00H ; some delay (safety reasons)
_WKwait:djnz r7, _WKwait
clr KEYB_DATA ; request to send
setb KEYB_CLOCK ; enable the Keyboard
acall Zero2One2 ; Start Bit
mov a, r1 ; Data Bits
TxData:
rrc a
mov KEYB_DATA, c
call Zero2One2
djnz r0, TxData
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TRANSMIT_DATA:
MOV SBUF,#'@'
CALL MDELAY
MOV R3,DATE1
CALL SPLIT_DATAS
MOV R3,MONTH
CALL SPLIT_DATAS
MOV R3,YEAR
CALL SPLIT_DATAS
MOV R3,DAY
CALL SPLIT_DATAS
MOV A,HRS
ANL A,#00011111B
MOV R3,A
CALL SPLIT_DATAS
MOV R3,MINS
CALL SPLIT_DATAS
MOV R3,SECS
CALL SPLIT_DATAS
JNB AM,DFV2
MOV SBUF,#'A'
AJMP DFV1
DFV2: MOV SBUF,#'P'
DFV1: CALL MDELAY
MOV SBUF,#'#'
CALL MDELAY
MOV R3,NAMES
CALL MDELAYX
MOV R3,NAMES+1
CALL MDELAYX
MOV R3,NAMES+2
CALL MDELAYX
MOV R3,NAMES+3
CALL MDELAYX
MOV R3,NAMES+4
CALL MDELAYX
MOV R3,NAMES+5
CALL MDELAYX
MOV R3,NAMES+6
CALL MDELAYX
MOV R3,NAMES+7
CALL MDELAYX
MOV R3,NAMES+8
CALL MDELAYX
MOV R3,NAMES+9
CALL MDELAYX
MOV R3,NAMES+10
CALL MDELAYX
MOV R3,NAMES+11
CALL MDELAYX
MOV R3,NAMES+12
CALL MDELAYX
MOV R3,NAMES+13
CALL MDELAYX
MOV R3,NAMES+14
CALL MDELAYX
MOV R3,NAMES+15
CALL MDELAYX
MOV R3,#0CCH
CALL MDELAYX
MOV SBUF,#'$'
CALL MDELAY
RET
SPLIT_DATAS:
MOV A,R3
ANL A,#0F0H
SWAP A
ADD A,#30H
MOV SBUF,A
CALL MDELAY
MOV A,R3
ANL A,#0FH
ADD A,#30H
MOV SBUF,A
CALL MDELAY
RET
MDELAYX:
CJNE R3,#0FFH,WSE
RET
WSE: MOV SBUF,R3
CALL MDELAY
RET
; last 262 addr of code mem with scan codes tables
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$
; last 262 addr of code mem with scan codes tables
org 1E00H
KbScanCodes:
; Keyboard Scancodes
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
db 0, 1 , 0, 1 , 1 , 1 , 1 , 1 , 0, 1 , 1 , 1 , 1 , 1 , '~'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
db 0, 0, 0 , 0 , 0, 0 , 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
db 0, 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
db '5', 0, 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
db '8', 0, 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
db '-', 0, 0, 0, 39 , 0, '[', '=', 0, 0, 0 , 0 , 1 , ']', 0, 92
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
db '.', '2', '5', '6', '8', 1 , 0 , 1 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
db 0, 0, 0, 0, 1
KbScanCodes2:
; Keyboard Scancodes with shift
; ?, F9, ?, F5, F4, F1, F2, F12, ?, F10, F8, F6, F4, TAB, ~
db 0, 2 , 0, 2 , 2 , 2 , 2 , 2 , 0, 2 , 2 , 2 , 2 , 2 , '`'
; ?, ?,Lalt,Lshf, ?,Lctr, Q , ! , ?, ?, ?, Z , S , A , W , @
db 0, 0, 0 , 0 , 0, 0 , 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@'
; ?, ?, C , X , D , E , $ , # , ?, ?, " ", V , F , T , R
db 0, 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R'
; % , ?, ?, N , B , H , G , Y , ^ , ?, ?, ?, M , J , U , &
db '%', 0, 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&'
; * , ?, ?, < , K , I , O , ) , ( , ?, ?, > , ? , L , : , P
db '*', 0, 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P'
; _ , ?, ?, ?, " , ?, { , + , ?, ?,Caps,Rshf,Entr, } , ?, |
db '_', 0, 0, 0, '"', 0, '{', '+', 0, 0, 0 , 0 , 2 , '}', 0, '|'
; ?, ?, ?, ?, ?, ?, ?, ?,BkSp, ?, ?, 1 , ?, 4 , 7 , ?, ?, ?, 0
db 0, 0, 0, 0, 0, 0, 0, 0, 2 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0'
; . , 2 , 5 , 6 , 8 , ESC,Numl, F11, + , 3 , - , * , 9 ,Scrl
db '.', '2', '5', '6', '8', 2 , 0 , 2 , '+', '3', '-', '*', '9', 0
; ?, ?, ?, ?, F7
db 0, 0, 0, 0, 2
END
On Wed, Jan 12, 2011 at 8:48 PM, aruna jyothi <aruna_jyothi15@yahoo.com> wrote: