I am trying to implement a countdown that does the following: As the countdown progresses, you are required to display the remaining time on the LCD screen continuously, updating it every 0.5 seconds. For instance, if the input is 15 seconds, the LCD screen should show the remaining time as follows: "15 sec", "14.5 sec", "14 sec", and so forth, until reaching 0. when the count is "0" a message will be displayed on LCD .Countdown value will be given by user via keyboard. The code that i have written is given below :
input: DB 'INPUT = ',0
ORG 0
acall CONFIGURE_LCD
MOV DPTR,#input
CLR A
MOVC A,@A+DPTR
sendlcd: ACALL SEND_DATA
CLR A
INC DPTR
MOVC A,@A+DPTR
CJNE A,0,sendlcd
MOV DPTR,#0B
keyboardprocess:
MOV 70H, #2h
ACALL KEYBOARD
MOV 80h,A
;ACALL SEND_DATA
CLR A
DEC 70h
CJNE A,#'#',seconddigit
SJMP counter
seconddigit:
ACALL SEND_DATA
ACALL KEYBOARD
MOV 81h,A
ACALL SEND_DATA
DEC 70h
CJNE A,#'#',counter
CLR A
MOV A,80H
MOV 80h,81h
MOV 81h, A
counter:
CLR A
MOV R0,00h
MOV R0,#0Ah
innerloop:
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
CLR TF0
SETB TR0
SETB C
ANL C,TF0
here:JNC here
DEC R0
CJNE R0,#00h,innerloop
MOV R1,99h
CJNE R1,#01h,full
DEC 80h
half:
CLR A
MOV A,81h
ACALL send_data
CLR A
MOV A,80h
ACALL SEND_DATA
halfpoint: DB '0.5 ',0
MOV DPTR,#halfpoint
CLR A
MOVC A,@A+DPTR
sendlcd2: ACALL SEND_DATA
CLR A
INC DPTR
MOVC A,@A+DPTR
CJNE A,0,sendlcd2
MOV DPTR,#0B
MOV 99h,#01h
SJMP counter
full:
CLR A
MOV A,81h
DEC 80h
ACALL send_data
CLR A
MOV A,80h
ACALL SEND_DATA
MOV 99h,#00h
CLR A
MOV A,80h
CJNE A,#00h,counter
CLR A
MOV A,81h
CJNE A,#00h,cont
SJMP launch
cont:DEC 81h
SJMP counter
launch: DB 'LAUNCH = ',0
MOV DPTR,#launch
CLR A
MOVC A,@A+DPTR
sendlcd3: ACALL SEND_DATA
CLR A
INC DPTR
MOVC A,@A+DPTR
CJNE A,0,sendlcd3
MOV DPTR,#0B
;CODES FROM HERE ARE TAKEN FROM LAB0 TUTORIAL
CONFIGURE_LCD: ;THIS SUBROUTINE SENDS THE INITIALIZATION COMMANDS TO THE LCD
mov a,#38H ;TWO LINES, 5X7 MATRIX
acall SEND_COMMAND
mov a,#0FH ;DISPLAY ON, CURSOR BLINKING
acall SEND_COMMAND
mov a,#06H ;INCREMENT CURSOR (SHIFT CURSOR TO RIGHT)
acall SEND_COMMAND
mov a,#01H ;CLEAR DISPLAY SCREEN
acall SEND_COMMAND
mov a,#80H ;FORCE CURSOR TO BEGINNING OF THE FIRST LINE
acall SEND_COMMAND
ret
SEND_COMMAND: ;THIS SUBROUTINE SENDS THE LCD COMMANDS TO THE LCD
mov p1,a ;THE COMMAND IS STORED IN A, SEND IT TO LCD
clr p3.5 ;RS=0 BEFORE SENDING COMMAND
clr p3.6 ;R/W=0 TO WRITE
setb p3.7 ;SEND A HIGH TO LOW SIGNAL TO ENABLE PIN
acall DELAY
clr p3.7
ret
SEND_DATA: ;THIS SUBROUTINE SENDS DATA TO BE DISPLAYED IN AN ASCII FORMAT TO THE LCD
mov p1,a ;SEND THE DATA STORED IN A TO LCD
setb p3.5 ;RS=1 BEFORE SENDING DATA
clr p3.6 ;R/W=0 TO WRITE
setb p3.7 ;SEND A HIGH TO LOW SIGNAL TO ENABLE PIN
acall DELAY
clr p3.7
ret
DELAY:
push 0
push 1
mov r0,#50
DELAY_OUTER_LOOP:
mov r1,#255
djnz r1,$
djnz r0,DELAY_OUTER_LOOP
pop 1
pop 0
ret
KEYBOARD: ; takes the key pressed from the keyboard and puts it to A
mov P0, #0ffh ;makes P0 input
K1:
mov P2, #0 ;ground all rows
mov A, P0
anl A, #00001111B
cjne A, #00001111B, K1
K2:
acall DELAY
mov A, P0
anl A, #00001111B
cjne A, #00001111B, KB_OVER
sjmp K2
KB_OVER:
acall DELAY
mov A, P0
anl A, #00001111B
cjne A, #00001111B, KB_OVER1
sjmp K2
KB_OVER1:
mov P2, #11111110B
mov A, P0
anl A, #00001111B
cjne A, #00001111B, ROW_0
mov P2, #11111101B
mov A, P0
anl A, #00001111B
cjne A, #00001111B, ROW_1
mov P2, #11111011B
mov A, P0
anl A, #00001111B
cjne A, #00001111B, ROW_2
mov P2, #11110111B
mov A, P0
anl A, #00001111B
cjne A, #00001111B, ROW_3
ljmp K2
ROW_0:
mov DPTR, #KCODE0
sjmp KB_FIND
ROW_1:
mov DPTR, #KCODE1
sjmp KB_FIND
ROW_2:
mov DPTR, #KCODE2
sjmp KB_FIND
ROW_3:
mov DPTR, #KCODE3
KB_FIND:
rrc A
jnc KB_MATCH
inc DPTR
sjmp KB_FIND
KB_MATCH:
clr A
movc A, @A+DPTR; get ASCII code from the table
ret
;ASCII look-up table
KCODE0: DB '1', '2', '3', 'A'
KCODE1: DB '4', '5', '6', 'B'
KCODE2: DB '7', '8', '9', 'C'
KCODE3: DB '*', '0', '#', 'D'
END