lcd_enable_edge: ; Routine which generates enable pulse PUSH R11 LDX R11,LCD_TEMPEN LDX LCD_POUT,R11 BSET LCD_PIN_EN,R11 LDX LCD_POUT,R11 BCLR LCD_PIN_EN,R11 LDX LCD_POUT,R11 POP R11 RET lcd_init: PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 ; 8-bit init (required according to datasheet) BSET LCD_PIN_D5,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_init_functionset_delay ; Delay required on initialisation CLR R11 BSET LCD_PIN_D5,R11 ; 1st 4-bit init LDX LCD_TEMPEN,R11 CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPFU CALL lcd_enable_edge CALL lcd_init_functionset_delay BSET LCD_PIN_D5,R11 ; 2nd 4-bit init LDX LCD_TEMPEN,R11 CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPFU CALL lcd_enable_edge CALL lcd_init_functionset_delay LDX LCD_TEMPEN,#%00 ; Display on CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPOF CALL lcd_enable_edge CALL lcd_wait_busy CLR R11 ; Display clear LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CLR R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge LDX LCD_TEMPEN,#00 ; Entry mode set CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPES CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_init_functionset_delay: ; Delay route for function set routine at init PUSH R11 PUSH R10 LDX R11,#LCD_INIT_FUNCTIONSET_DELAY LDX R10,#LCD_INNER_DELAY OR R11,R11 JP NZ,lcd_init_inner_fu_delay_decrement lcd_init_fu_delay_done: POP R10 POP R11 RET lcd_init_inner_fu_delay_decremented: DEC R11 OR R11,R11 JP Z,lcd_init_fu_delay_done LDX R10,#LCD_INNER_DELAY lcd_init_inner_fu_delay_decrement: DEC R10 OR R10,R10 JP NZ,lcd_init_inner_fu_delay_decrement JP lcd_init_inner_fu_delay_decremented lcd_busy_delay: ; Delay required before safe reading of busy flag PUSH R11 PUSH R10 LDX R11,#LCD_BUSY_DELAY LDX R10,#LCD_INNER_DELAY OR R11,R11 JP NZ,lcd_init_inner_bu_delay_decrement lcd_init_bu_delay_done: POP R10 POP R11 RET lcd_init_inner_bu_delay_decremented: DEC R11 OR R11,R11 JP Z,lcd_init_bu_delay_done LDX R10,#LCD_INNER_DELAY lcd_init_inner_bu_delay_decrement: DEC R10 OR R10,R10 JP NZ,lcd_init_inner_bu_delay_decrement JP lcd_init_inner_bu_delay_decremented lcd_wait_busy: ; Routine waits for busy flag PUSH R10 PUSH R11 CLR R10 CLR R11 BSET LCD_PIN_RW,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_busy_delay BSET LCD_PIN_D7,R10 LDX LCD_PADDR,#%01 LDX LCD_PCTL,#%FF lcd_busy_readin: LDX R11,LCD_PIN ANDX R11,R10 JP NZ,lcd_busy_readin LDX LCD_PADDR,#%01 LDX LCD_PCTL,#%00 POP R11 POP R10 RET lcd_clear_display: ; Clears the whole display PUSH R11 CLR R11 LDX LCD_TEMPEN,#%00 CALL lcd_enable_edge BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_return_home: ; Return cursor to initial position PUSH R11 CLR R11 LDX LCD_TEMPEN,#%00 CALL lcd_enable_edge BSET LCD_PIN_D5,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_entry_mode: ; Entry mode routine PUSH R11 CLR R11 LDX LCD_TEMPEN,#%00 CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPES CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_set_cursor_move_right: ; Cursor moves to the right PUSH R11 LDX R11,LCD_TEMPES BSET LCD_PIN_D6,R11 BSET LCD_PIN_D5,R11 LDX LCD_TEMPES,R11 POP R11 RET lcd_set_cursor_move_left: ; Cursor moves to the left PUSH R11 LDX R11,LCD_TEMPES BSET LCD_PIN_D6,R11 BCLR LCD_PIN_D5,R11 LDX LCD_TEMPES,R11 POP R11 RET lcd_set_cursor_shift_enable: ; Enable shifting of display PUSH R11 LDX R11,LCD_TEMPES BSET LCD_PIN_D6,R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPES,R11 POP R11 RET lcd_set_cursor_shift_disable: ; Disable shifting of display PUSH R11 LDX R11,LCD_TEMPES BSET LCD_PIN_D6,R11 BCLR LCD_PIN_D4,R11 LDX LCD_TEMPES,R11 POP R11 RET lcd_set_display_on: ; Set whole display on PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BSET LCD_PIN_D6,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_set_display_off: ; Set whole display off PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BCLR LCD_PIN_D6,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_set_cursor_on: ; Enable cursor PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BSET LCD_PIN_D5,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_set_cursor_off: ; Disable cursor PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BCLR LCD_PIN_D5,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_set_cursor_blink: ; Cursor blinks PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_set_cursor_noblink: ; Cursor does not blink PUSH R11 LDX R11,LCD_TEMPOF BSET LCD_PIN_D7,R11 BCLR LCD_PIN_D4,R11 LDX LCD_TEMPOF,R11 POP R11 RET lcd_display_onoff: ; Display ON/OFF routine PUSH R11 CLR R11 LDX LCD_TEMPEN,#%00 CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPOF CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_set_one_line: ; Display is one line type PUSH R11 LDX R11,LCD_TEMPFU BCLR LCD_PIN_D7,R11 LDX LCD_TEMPFU,R11 POP R11 RET lcd_set_two_line: ; Display has two lines PUSH R11 LDX R11,LCD_TEMPFU BSET LCD_PIN_D7,R11 LDX LCD_TEMPFU,R11 POP R11 RET lcd_set_5x08: ; Character has 5x8 dots PUSH R11 LDX R11,LCD_TEMPFU BCLR LCD_PIN_D6,R11 LDX LCD_TEMPFU,R11 POP R11 RET lcd_set_5x11: ; Character has 5x11 dots PUSH R11 LDX R11,LCD_TEMPFU BSET LCD_PIN_D6,R11 LDX LCD_TEMPFU,R11 POP R11 RET lcd_function: ; "Set Function" routine PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 BSET LCD_PIN_D5,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge LDX LCD_TEMPEN,LCD_TEMPFU CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_cursor_shift_right: ; Shift cursor 1 position to the right PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CLR R11 BSET LCD_PIN_D6,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_cursor_shift_left: ; Shift cursor 2 position to the left PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CLR R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_display_shift_right: ; Shift whole display to the right PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CLR R11 BSET LCD_PIN_D6,R11 BSET LCD_PIN_D7,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_display_shift_left: ; Shift whole display to the left PUSH R11 CLR R11 BSET LCD_PIN_D4,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CLR R11 BSET LCD_PIN_D7,R11 LDX LCD_TEMPEN,R11 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 RET lcd_put_data: ; Puts data in LCD_DATA out PUSH R10 PUSH R11 CLR R10 LDX R11,LCD_DATA AND R11,#%80 JP NZ,lcd_d_set_bit7 lcd_d_bit7_set: LDX R11,LCD_DATA AND R11,#%40 JP NZ,lcd_d_set_bit6 lcd_d_bit6_set: LDX R11,LCD_DATA AND R11,#%20 JP NZ,lcd_d_set_bit5 lcd_d_bit5_set: LDX R11,LCD_DATA AND R11,#%10 JP NZ,lcd_d_set_bit4 lcd_d_bit4_set: BSET LCD_PIN_RS,R10 LDX LCD_TEMPEN,R10 CALL lcd_enable_edge CLR R10 LDX R11,LCD_DATA AND R11,#%08 JP NZ,lcd_d_set_bit3 lcd_d_bit3_set: LDX R11,LCD_DATA AND R11,#%04 JP NZ,lcd_d_set_bit2 lcd_d_bit2_set: LDX R11,LCD_DATA AND R11,#%02 JP NZ,lcd_d_set_bit1 lcd_d_bit1_set: LDX R11,LCD_DATA AND R11,#%01 JP NZ,lcd_d_set_bit0 lcd_d_bit0_set: BSET LCD_PIN_RS,R10 LDX LCD_TEMPEN,R10 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 POP R10 RET lcd_d_set_bit7: BSET LCD_PIN_D7,R10 JP lcd_d_bit7_set lcd_d_set_bit6: BSET LCD_PIN_D6,R10 JP lcd_d_bit6_set lcd_d_set_bit5: BSET LCD_PIN_D5,R10 JP lcd_d_bit5_set lcd_d_set_bit4: BSET LCD_PIN_D4,R10 JP lcd_d_bit4_set lcd_d_set_bit3: BSET LCD_PIN_D7,R10 JP lcd_d_bit3_set lcd_d_set_bit2: BSET LCD_PIN_D6,R10 JP lcd_d_bit2_set lcd_d_set_bit1: BSET LCD_PIN_D5,R10 JP lcd_d_bit1_set lcd_d_set_bit0: BSET LCD_PIN_D4,R10 JP lcd_d_bit0_set lcd_address_set: ; Sets display DRAM address PUSH R10 PUSH R11 CLR R10 LDX R11,LCD_ADDRESS BSET LCD_PIN_D7,R10 ; Adresses start with bit7 high AND R11,#%40 JP NZ,lcd_a_set_bit6 lcd_a_bit6_set: LDX R11,LCD_ADDRESS AND R11,#%20 JP NZ,lcd_a_set_bit5 lcd_a_bit5_set: LDX R11,LCD_ADDRESS AND R11,#%10 JP NZ,lcd_a_set_bit4 lcd_a_bit4_set: LDX LCD_TEMPEN,R10 CALL lcd_enable_edge CLR R10 LDX R11,LCD_ADDRESS AND R11,#%08 JP NZ,lcd_a_set_bit3 lcd_a_bit3_set: LDX R11,LCD_ADDRESS ANDX R11,#%04 JP NZ,lcd_a_set_bit2 lcd_a_bit2_set: LDX R11,LCD_ADDRESS ANDX R11,#%02 JP NZ,lcd_a_set_bit1 lcd_a_bit1_set: LDX R11,LCD_ADDRESS ANDX R11,#%01 JP NZ,lcd_a_set_bit0 lcd_a_bit0_set: LDX LCD_TEMPEN,R10 CALL lcd_enable_edge CALL lcd_wait_busy POP R11 POP R10 RET lcd_a_set_bit6: BSET LCD_PIN_D6,R10 JP lcd_a_bit6_set lcd_a_set_bit5: BSET LCD_PIN_D5,R10 JP lcd_a_bit5_set lcd_a_set_bit4: BSET LCD_PIN_D4,R10 JP lcd_a_bit4_set lcd_a_set_bit3: BSET LCD_PIN_D7,R10 JP lcd_a_bit3_set lcd_a_set_bit2: BSET LCD_PIN_D6,R10 JP lcd_a_bit2_set lcd_a_set_bit1: BSET LCD_PIN_D5,R10 JP lcd_a_bit1_set lcd_a_set_bit0: BSET LCD_PIN_D4,R10 JP lcd_a_bit0_set