Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WR_CMD EQU 0FF2CH
- WR_DATA EQU 0FF2DH
- RD_STATUS EQU 0FF2EH
- RD_DATA EQU 0FF2FH
- LCD_INIT EQU 038H
- LCD_CLEAR EQU 001H
- LCD_MODE EQU 1111B
- TIME EQU 50
- LOAD EQU (65536-1000*TIME)
- COUNTER EQU 30h
- SECONDS EQU 31h
- MINUTES EQU 32h
- HOURS EQU 33h
- ALARM EQU 34h
- ORG 0
- LJMP MAIN
- ORG 0BH
- JMP timer_interrupt
- ORG 00B0H
- main:
- ;Call only once!
- lcall initialize
- lcall delay
- test:
- lcall print_time
- sjmp test
- ;--------------------------------------------------
- ; Initializes lcd
- ;--------------------------------------------------
- initialize:
- mov A, #LCD_INIT
- lcall send_command
- mov A, #LCD_CLEAR
- lcall send_command
- mov A, #LCD_MODE
- lcall send_command
- ret
- ;--------------------------------------------------
- ; Checks status of lcd and waits
- ;--------------------------------------------------
- wait_until_not_busy:
- mov DPTR, #RD_STATUS
- wait:
- movx A, @DPTR
- jb ACC.7, wait
- ret
- ;--------------------------------------------------
- ; A - command to execute
- ;--------------------------------------------------
- send_command:
- push ACC
- lcall wait_until_not_busy
- mov DPTR, #WR_CMD
- pop ACC
- movx @DPTR, A
- ret
- ;--------------------------------------------------
- ; A - char to write
- ;--------------------------------------------------
- write_char:
- push ACC
- lcall wait_until_not_busy
- mov DPTR, #WR_DATA
- pop ACC
- movx @DPTR, A
- ret
- ;--------------------------------------------------
- ; DPTR - address of string to write
- ;--------------------------------------------------
- write_string:
- clr A
- movc A, @A+DPTR
- jz write_string_ret
- push dph
- push dpl
- lcall write_char
- pop dpl
- pop dph
- inc dptr
- jmp write_string
- write_string_ret:
- ret
- ;--------------------------------------------------
- ; A - coordinates
- ; line in 4 bit
- ; column in 0-3 bits
- ;--------------------------------------------------
- set_position: ; x in
- anl A, #00011111B
- jnb ACC.4, jump_to_first_line
- clr ACC.4
- add A, #40H
- jump_to_first_line:
- orl A, #10000000B
- lcall send_command
- ret
- ;--------------------------------------------------
- ; Function that converts number
- ; A - number to convert
- ; Returns first digit in A, and second in B
- ;--------------------------------------------------
- convert:
- mov B, #10
- div AB
- add A, #30H
- push ACC
- push B
- pop ACC
- add A, #30H
- push ACC
- pop B
- pop ACC
- ret
- ;--------------------------------------------------
- ; Function that setups timer to wait
- ; TIME miliseconds
- ;--------------------------------------------------
- delay:
- mov SECONDS, #0
- mov MINUTES, #0
- mov HOURS, #0
- lcall print_time
- mov COUNTER, #20
- mov ALARM, #5
- clr TR0
- mov TL0, #LOW(LOAD)
- mov TH0, #HIGH(LOAD)
- anl TMOD, #11110000B
- orl TMOD, #00000001B
- clr TF0
- setb ET0
- setb EA
- setb TR0
- ret
- ;--------------------------------------------------
- ; Function that prints current time
- ;--------------------------------------------------
- print_time:
- mov A, #0
- lcall set_position
- ; Print hours
- mov A, HOURS
- lcall convert
- push B
- lcall write_char
- pop ACC
- lcall write_char
- mov A, #':'
- lcall write_char
- ; Print minutes
- mov A, MINUTES
- lcall convert
- push B
- lcall write_char
- pop ACC
- lcall write_char
- mov A, #':'
- lcall write_char
- ; Print seconds
- mov A, SECONDS
- lcall convert
- push B
- lcall write_char
- pop ACC
- lcall write_char
- ret
- ;--------------------------------------------------
- ; Function that handles alarm
- ;--------------------------------------------------
- handle_alarm:
- mov A, #10H
- lcall set_position
- ; Print alarm string
- mov DPTR, #alarm_text
- lcall write_string
- ret
- ;--------------------------------------------------
- ; Interrupt handler
- ;--------------------------------------------------
- timer_interrupt:
- mov TL0, #LOW(LOAD)
- mov TH0, #HIGH(LOAD)
- push ACC
- push PSW
- djnz COUNTER, dont_increment
- mov COUNTER, #20
- inc SECONDS
- mov A, SECONDS
- cjne A, #60, dont_increment
- mov SECONDS, #0
- inc MINUTES
- mov A, MINUTES
- cjne A, #60, dont_increment
- mov MINUTES, #0
- inc HOURS
- mov A, HOURS
- cjne A, #24, dont_increment
- mov HOURS, #0
- dont_increment:
- pop PSW
- pop ACC
- reti
- alarm_text: DB 'ALARM!!!', 0
- new_sign: DB 0H, 4H, 2H, 0H, 2H, 4H, 0H, 0H
- END
- /*
- ;--------------------------------------------------
- ; DPTR - address of sign to write
- ; A - where to write sign
- ; address is in lower 6 bits
- ;--------------------------------------------------
- write_own_sign:
- push ACC
- lcall read_address
- pop R0
- push ACC ;save DDRAM adress
- push R0
- pop ACC
- lcall set_cgram_address
- mov R0, #8
- write_own_sign_loop:
- clr A
- movc A, @A+DPTR
- push dph
- push dpl
- lcall write_char
- pop dpl
- pop dph
- inc dptr
- djnz R0, write_own_sign_loop
- pop ACC ;restore DDRAM adress
- lcall set_ddram_address
- ret
- ;--------------------------------------------------
- ; Sets CGRAM address
- ; A contains address on 6 lower bits
- ;--------------------------------------------------
- set_cgram_address:
- anl A, #00111111B
- orl A, #01000000B
- lcall send_command
- ret
- ;--------------------------------------------------
- ; Sets DDRAM address
- ; A contains address on 7 lower bits
- ;--------------------------------------------------
- set_ddram_address:
- anl A, #01111111B
- orl A, #10000000B
- lcall send_command
- ret
- ;--------------------------------------------------
- ; Reads current address
- ; Returns it in A
- ;--------------------------------------------------
- read_address:
- mov DPTR, #RD_STATUS
- movx A, @DPTR
- anl A, #01111111B
- ret
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement