;Routines for Hitachi LM238XB 240x128 graphic & alpha-numeric display ;with HD61830 controller. ;Translated from Jeff Sampson's code for the 8751. ;For 16Cxx with RA4 pin ;10/97 LIST P=16C84 ; include "p16c84.inc" __CONFIG _XT_OSC&_WDT_OFF&_CP_OFF lcd_data equ PORTB ;LCD data port #define lcd_rs PORTA,1 ;reg select 0=data 1=reg #define lcd_rw PORTA,0 ;0=write 1-read(swx'd) #define lcd_en PORTA,2 ;data xfer enable 1=active #define lcd_cs PORTA,3 ;chip sel 0=active #define lcd_rst PORTA,4 ;reset 0=active (O.C. needs pull-up) reg equ H'0c' cmd equ H'0d' ccnt equ H'0e' lcnt equ H'0f' dlyc equ H'10' org 0 ;Setup i/o ports with control lines in idle movlw H'df' option ;TMR0 mode (RA4=i/o) movlw H'10' movwf PORTA ;rst =1,rs,rw,en,cs=0 movlw H'00' movwf PORTB tris PORTA ;all out tris PORTB ;all out main call lcd_init goto $ ;puts LCD in graphics mode and clears screen.(char mode for test) ;The LM238 has a resolution of 240x128 dots or 40x16 (5x7)chars ; lcd_init ;Pulse reset line call delay ; 1/4mS bcf lcd_rst call delay bsf lcd_rst call delay ;Init controller registers movlw D'0' ;reg 0(Data sheet starts movwf reg ;at 1) movlw H'32' ;32H=Grapics mode movwf cmd call lcd_cmd movlw D'1' ;reg 1 movwf reg movlw H'75' ;77H for graphics 8x8 movwf cmd call lcd_cmd movlw D'2' ;reg 2 movwf reg movlw H'1d' ;Hp (30-1)8bits movwf cmd call lcd_cmd movlw D'3' ;reg 3 movwf reg movlw H'3f' ;Vp (64-1) movwf cmd call lcd_cmd movlw D'4' ;reg 4 movwf reg movlw H'07' ;Cursor position-1 movwf cmd call lcd_cmd movlw D'8' ;reg8 movwf reg movlw H'00' ;Low disply addr movwf cmd call lcd_cmd movlw D'9' ;reg9 movwf reg movlw H'00' ;High disply addr movwf cmd call lcd_cmd ;Clear the LCD screen call lcd_clr return ;Send byte in cmd to reg lcd_cmd ;Check for BUSY status (Bit 7 high if busy) movlw H'ff' tris PORTB ;Make sure input mode bsf lcd_rs ;set rs to control bsf lcd_rw ;set r/w to read lcd_cmd1 bsf lcd_en ;enable active movf PORTB,W ;get data byte bcf lcd_en ;cancel enable andlw B'10000000' ;mask all but MSB btfss STATUS,Z goto lcd_cmd1 ;loop until not busy movlw H'00' ;Swx to output tris PORTB ;Output register bcf lcd_rw ;set to write movf reg,0 ;get reg# movwf PORTB ;put on output bsf lcd_en ;pulse enable bcf lcd_en ;Output data bcf lcd_rs ;set to register to data movf cmd,0 ;get data movwf PORTB ;put on output bsf lcd_en ;pulse enable bcf lcd_en return ;Clear screen on LCD lcd_clr movlw D'10' ;register 10 movwf reg movlw H'0' ;set cursor low addr movwf cmd call lcd_cmd movlw D'11' ;register 11 movwf reg movlw H'0' ;set cursor high addr movwf cmd call lcd_cmd movlw D'12' ;register 12 - data reg movwf reg movlw H'ff' ;write 0 to clr pixels in byte movwf cmd movlw D'128' ;64v movwf lcnt lcd_clr1 movlw D'30' ;30*8h movwf ccnt lcd_clr2 call lcd_cmd decfsz ccnt,1 goto lcd_clr2 decfsz lcnt,1 goto lcd_clr1 ;Reset cursor position to beginning of display movlw D'10' ;reg 10 movwf reg movlw H'0' ;cursor low addr movwf cmd call lcd_cmd movlw D'11' ;reg 11 movwf reg movlw H'0' ;cursor high addr movwf cmd call lcd_cmd return delay movlw H'ff' ;about 256uS movwf dlyc delay1 decfsz dlyc,1 goto delay1 return END