* * Lcd1.asm ---- 16X2 LCD sample program for the Ep2711E9 Rev.C board * (c)2003, EVBplus.com, Written by Wayne Chu * * Function: This is the simplest way to displays a message on a * 16X2 LCD display module. The cursor is off. * If more controls to the display are needed, see LCD2.asm * DB0: equ 1 DB1: equ 2 * org $FFA0 ; Buffalo I/O routines upcase: rmb 3 wchek: rmb 3 dchek: rmb 3 init_sci: rmb 3 input: rmb 3 output: rmb 3 outlhlf: rmb 3 outrhlf: rmb 3 outa: rmb 3 out1byt: rmb 3 out1bsp: rmb 3 out2bsp: rmb 3 outcrlf: rmb 3 outstrg: rmb 3 outstrg0: rmb 3 inchar: rmb 3 * STACK: equ $8FFF ONE_MS equ 167 ; for 8 MHz 1000us/6us=167 FIVE_MS equ 835 TEN_MS equ 1670 PORTF equ $2201 DDRF equ $2203 d40us: equ 15 ; 15x6us= 90 us, 60us ok REG_SEL: equ DB0 ; 0=reg, 1=data ENABLE: equ DB1 NOT_REG_SEL: equ $FE NOT_ENABLE: equ $FD org 0 temp1: rmb 1 pfimg: rmb 1 reset_seq: rmb 1 disp_ram: rmb 3 * LCDimg: equ pfimg LCD_RSimg: equ pfimg LCD_ENimg: equ pfimg LCD: equ PORTF LCD_RS: equ PORTF LCD_EN: equ PORTF * org $D000 jmp start lcd_ini: ldaa #$FF staa DDRF clra staa pfimg staa PORTF ldx #inidsp1 ; point to init. codes. ldaa #1 staa reset_seq ; need more delay for first reset seq. jsr outins1 ; output codes. ldx #inidsp2 ; point to init. codes. clr reset_seq jsr outins2 ; output codes. rts inidsp1: fcb 2 ; number of instrutions fcb $33 ; reset char fcb $32 ; reste char inidsp2: fcb 4 ; number of instrutions fcb $28 ; 4bit, 2 line, 5X7 dot fcb $06 ; cursor increment, disable display shift fcb $0c ; display on, cursor off, no blinking fcb $01 ; clear display memory, set cursor to home pos outins1: pshb ; output instruction command. jsr sel_inst ldab 0,x inx onext1: ldaa 0,x jsr wrt_pulse ; initiate write pulse. inx jsr d5ms decb bne onext1 pulb rts * outins2: pshb ; output instruction command. jsr sel_inst ldab 0,x inx onext2: ldaa 0,x jsr wrt_pulse ; initiate write pulse. inx decb bne onext2 jsr d5ms pulb rts * delay_10ms: nop d10ms: pshx ldx #TEN_MS bsr del1 pulx rts d5ms: pshx ldx #FIVE_MS bsr del1 pulx rts del1: dex inx dex bne del1 rts * * sel_data: psha * bset LCD_RSimg REG_SEL ; select instruction ldaa LCD_RSimg oraa #REG_SEL bra sel_i sel_inst: psha * bclr LCD_RSimg REG_SEL ; select instruction ldaa LCD_RSimg anda #NOT_REG_SEL sel_i: staa LCD_RSimg staa LCD_RS pula rts * lcd_line1: jsr sel_inst ; select instruction ldaa #$80 ; starting address for the line1 bra line3 lcd_line2: jsr sel_inst ldaa #$C0 ; starting address for the line2 line3: jsr wrt_pulse * jsr sel_data jsr msg_out rts * at entry, x must point to the begining of the message, * b = number of the character to be sent out * msg_out: ldaa 0,x jsr wrt_pulse inx decb bne msg_out rts * * @ enter, a=data to output * wrt_pulse: pshx psha ; save it tomporarily. anda #$f0 ; mask out 4 low bits. staa temp1 ; save nibble value. ldaa LCDimg ; get LCD port image. anda #$0f ; need low 4 bits. oraa temp1 ; add in low 4 bits. staa LCDimg ; save it staa LCD ; output data * bsr enable_pulse ldaa reset_seq beq wrtpls jsr d5ms ; delay for reset sequence * wrtpls: pula asla ; move low bits over. asla asla asla staa temp1 ; store temporarily. * ldaa LCDimg ; get LCD port image. anda #$0f ; need low 4 bits. oraa temp1 ; add in loiw 4 bits. staa LCDimg ; save it staa LCD ; output data * bsr enable_pulse pulx rts * enable_pulse: * bset LCD_ENimg ENABLE ; ENABLE=high ldaa LCD_ENimg oraa #ENABLE staa LCD_ENimg staa LCD_EN * bclr LCD_ENimg ENABLE ; ENABLE=low ldaa LCD_ENimg anda #NOT_ENABLE staa LCD_ENimg staa LCD_EN pshx ldx #d40us jsr del1 pulx rts * start: lds #STACK jsr delay_10ms ; delay 20ms during power up jsr delay_10ms jsr lcd_ini ; initialize the LCD back: ldx #MSG1 ; MSG1 for line1, x points to MSG1 ldab #16 ; send out 16 characters jsr lcd_line1 * ldx #MSG2 ; MSG2 for line2, x points to MSG2 ldab #16 ; send out 16 characters jsr lcd_line2 jsr delay_10ms jsr delay_10ms jmp back MSG1: FCC " YOU DESERVE A " MSG2: FCC " BREAK TODAY " end