;checked OK same as book 12-2 .INCLUDE "M64DEF.INC" .EQU LCD_DPRT = PORTA ;LCD DATA PORT .EQU LCD_DDDR = DDRA ;LCD DATA DDR .EQU LCD_DPIN = PINA ;LCD DATA PIN .EQU LCD_CPRT = PORTC ;LCD COMMANDS PORT .EQU LCD_CDDR = DDRC ;LCD COMMANDS DDR .EQU LCD_CPIN = PINC ;LCD COMMANDS PIN .EQU LCD_RS = 4 ;LCD RS .EQU LCD_RW = 5 ;LCD RW .EQU LCD_EN = 6 ;LCD EN LDI R21,HIGH(RAMEND) OUT SPH,R21 LDI R21,LOW(RAMEND) OUT SPL,R21 LDI R21,0xFF; OUT LCD_DDDR, R21 ;LCD data port is output OUT LCD_CDDR, R21 ;LCD command port is output LDI R16,0x33 ;init LCD for 4-bit data CALL CMNDWRT ;call command function CALL DELAY_2ms ;init. hold LDI R16,0x32 ;init LCD for 4-bit data CALL CMNDWRT ;call command function CALL DELAY_2ms ;init. hold LDI R16,0x28 ;init LCD 2 lines,5*7 matrix CALL CMNDWRT ;call command function CALL DELAY_2ms ;init. hold LDI R16,0x0E ;display on, cursor on CALL CMNDWRT ;call command function LDI R16,0x01 ;clear lcd CALL CMNDWRT ;call command function CALL DELAY_2ms ;delay 2ms for clear lcd LDI R16,0x06 ;shift cursor right CALL CMNDWRT ;call command function LDI R16,'H' ;display letter 'H' CALL DATAWRT ;call data write function LDI R16,'i' ;display letter 'i' CALL DATAWRT ;call data write function HERE: JMP HERE ;stay here ;------------------------------------------------------- CMNDWRT: MOV R27,R16 ANDI R27,0xF0 OUT LCD_DPRT,R27 ;LCD data port = R16 CBI LCD_CPRT,LCD_RS ;RS = 0 for command CBI LCD_CPRT,LCD_RW ;RW = 0 for write SBI LCD_CPRT,LCD_EN ;EN = 1 for high pulse CALL SDELAY ;make a wide EN pulse CBI LCD_CPRT,LCD_EN ;EN =0 for H-to_L pulse CALL DELAY_100us ;make a wide EN pulse MOV R27,R16 SWAP R27 ANDI R27,0xF0 OUT LCD_DPRT,R27 ;LCD data port = R16 SBI LCD_CPRT,LCD_EN ;EN = 1 for high pulse CALL SDELAY ;make a wide EN pulse CBI LCD_CPRT,LCD_EN ;EN =0 for H-to_L pulse CALL DELAY_100us ;wait 100us RET ;------------------------------------------------------- DATAWRT: MOV R27,R16 ANDI R27,0xF0 OUT LCD_DPRT,R27 ;LCD data port = R16 SBI LCD_CPRT,LCD_RS ;RS = 1 for data CBI LCD_CPRT,LCD_RW ;RW = 0 for write SBI LCD_CPRT,LCD_EN ;EN = 1 for high pulse CALL SDELAY ;make a wide EN pulse CBI LCD_CPRT,LCD_EN ;EN =0 for H-to_L pulse MOV R27,R16 SWAP R27 ANDI R27,0xF0 OUT LCD_DPRT,R27 ;LCD data port = R16 SBI LCD_CPRT,LCD_EN ;EN = 1 for high pulse CALL SDELAY ;make a wide EN pulse CBI LCD_CPRT,LCD_EN ;EN =0 for H-to_L pulse CALL DELAY_100us ;wait 100us RET ;------------------------------------------------------- ;Delay Functions are the same as last program and should ;be placed here. ;------------------------------------------------------- SDELAY: NOP NOP RET ;------------------------------------------------------- DELAY_100us: PUSH R17 LDI R17,60 DR0: CALL SDELAY DEC R17 BRNE DR0 POP R17 RET ;------------------------------------------------------- DELAY_2ms: PUSH R17 LDI R17,20 LDR0: CALL DELAY_100US DEC R17 BRNE LDR0 POP R17 RET