Trying to implement countdown in assembly language for 8051

38 Views Asked by At

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
0

There are 0 best solutions below