;****************************************************************************** ; * ; Filename: t6963c_fkt.asm * ; Date: 02.04.2007 * ; File Version: 0.1 * ; * ; Author: Fuchs * ; comment: funktionen des displays * ; * ; Anschluss des Displays: * ; C0: 19, FS1 * ; C1: 5, _WR * ; C2: 6, _RD * ; C3: 7, _CE * ; C4: 8, C/D * ; C5: 10, _Reset * ; D0 - D7: Data 0 bis Data 7 * ;****************************************************************************** ; * ; Files required: P18F4685.INC * ; * ;****************************************************************************** LIST P=18F4685 ;directive to define processor #include ;processor specific variable definitions ;****************************************************************************** ;Configuration bits ; Oscillator Selection: CONFIG OSC=IRCIO7 ;intern CONFIG WDT=OFF ;no Watchdog CONFIG CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CP4=OFF,CP5=OFF,CPB=OFF,CPD=OFF ;code protect off CONFIG WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRT4=OFF,WRT5=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF CONFIG PBADEN=OFF ;Port A as I/O CONFIG LVP=OFF ;low voltage programming ;****************************************************************************** ;Variable definitions UDATA WREG_TEMP ;variable used for context saving STATUS_TEMP ;variable used for context saving BSR_TEMP ;variable used for context saving UDATA_ACS lcddata RES 1 ;8bit zwischenspeicher: daten/cmd an gLCD lcdstatus RES 1 ;8bit zwischenspeicher: status gLCD adrLSB RES 1 ;8bit zwischenspeicher: address LSB adrMSB RES 1 ;8bit zwischenspeicher: address MSB rows RES 1 ;8bit zwischenspeicher: rows (text) lines RES 1 ;8bit zwischenspeicher: lines (text) loop RES 1 ;warten in ms loopcali RES 1 ;zeahlvar fuer wait_1ms ;****************************************************************************** ;Reset vector ; This code will start executing when a reset occurs. ORG 0x0000 goto Main ;go to start of main code ;****************************************************************************** ;Start of main program ; The main program code is placed here. Init: movlw 0x70 ; maximale interne Frequenz 8MHz (cyc. = 0,5µs) setzen movwf OSCCON movlw 0x07 movwf CMCON movlw 0x0F movwf ADCON1 movlw D'30' ;number of rows (at FS: 8x8) movwf rows movlw D'8' ;number of lines movwf lines clrf WREG ; Akkumulator loeschen movwf TRISD ; PortD als Ausgang definieren movwf TRISC ; PortC als Ausgang definieren movwf TRISB ; PortB als Ausgang definieren rcall Set_Display movlw 0x01 movwf LATB rcall Clear_Text return Main: ; *** main code goes here *** ORG 0x0100 rcall Init ;Initialisieren movlw 0x02 movwf LATB Main_: ;set cursor position ;clrf adrLSB ; low address (X) ;clrf adrMSB ; high address (Y) ;rcall set_cursorpt ;locate ;movlw 0x00 ; low address, pro zeile 40(30???) spalten. fortlaufend (1.spalte also: 00,28,51,...) ;movwf adrLSB ;clrf adrMSB ; high address ;rcall Set_address movlw 0x34 movwf lcddata ; "T" schreiben rcall write_char ;movlw 0x2A ;movwf lcddata ; "J" schreiben ;rcall write_char goto Main_ return Set_Display: bcf LATC,0 ; font select 0 for 8*8 bcf LATC,5 ; reset low bsf LATC,1 ; write high bsf LATC,2 ; read high movlw D'100' movwf loop ; reset 100 mS rcall Waitxms bsf LATC,5 ; reset high clrf lcddata rcall Gwrite_data rcall Gwrite_data movlw 0x40 movwf lcddata rcall Gwrite_cmd ; home adres text ram.upperleft corner 0000 movlw D'30' movwf lcddata ; columns depends on mode for 240 with mode 8 it is 30 rcall Gwrite_data clrf lcddata rcall Gwrite_data movlw 0x41 movwf lcddata ;linewidth text (char per line) rcall Gwrite_cmd ; clrf lcddata ; rcall Gwrite_data ; movlw 0x03 ; movwf lcddata ; rcall Gwrite_data ; 0300 ; movlw 0x42 ; movwf lcddata ; rcall Gwrite_cmd ; home adress graphical ram.upperleft corner 0300 ; movlw D'40' ; movwf lcddata ; rcall Gwrite_data ; clrf lcddata ; rcall Gwrite_data ; movlw 0x43 ; movwf lcddata ; linewidth graphic (bit per line) ; rcall Gwrite_cmd movlw 0x80 movwf lcddata ;' OR mode rcall Gwrite_cmd movlw 0x94 movwf lcddata ; text on, graphic off rcall Gwrite_cmd ; ldi r24,0x92 ; cursor on, blink off ; rcall Gwrite_cmd ; ldi r24,0x90 ; display off ; rcall Gwrite_cmd return Gstatus_check: bsf PORTC,4 ; command clrf LATD movlw 0xFF ; make port an input movwf TRISD Gstatus_check1: bcf LATC,2 ; RD low bcf LATC,3 ; Enable Chip nop movf PORTD,0 ; get status movwf lcdstatus bsf LATC,2 ; end RD bsf LATC,3 ; disable chip movlw 0x03 andwf lcdstatus,1 ; Mask Bits CPFSEQ lcdstatus bra Gstatus_check1 ; not ready clrf WREG ; Akkumulator loeschen clrf TRISD ; make output port return Gwrite_cmd: rcall Gstatus_check ; check status bsf LATC,4 ; command goto Gwrite_dataMisc ; same code Gwrite_data: rcall Gstatus_check ; check status bcf LATC,4 ; data Gwrite_dataMisc: bcf LATC,3 ; enable chip bcf LATC,1 ; write low movff lcddata, LATD ; write nop bsf LATC,1 ; write high bsf LATC,3 ; disable chip return set_cursorpt: movff adrLSB, lcddata rcall Gwrite_data movff adrMSB, lcddata rcall Gwrite_data movlw 0x21 movwf lcddata rcall Gwrite_cmd return Set_address: movff adrLSB, lcddata ; LSB rcall Gwrite_data movff adrMSB, lcddata ; MSB rcall Gwrite_data movlw 0x24 movwf lcddata ; set address goto Gwrite_cmd ; write command ;Clear_Graph: ; movlw D'00' ; movwf adrLSB ; movlw D'03' ; movwf adrMSB ; upperleft corner graphic ram 0300 ; rcall Set_address ; set address ; clrf r30 ; counter loop value ;movlw 0x0A ;movwf r31 ; last address Clear_Graph1: rcall Clear_Graph2 decf lines,1 ; substrahieren dec loop bnz Clear_Graph1 ; next return Clear_Graph2: clrf lcddata rcall write_char decf rows,1 bnz Clear_Graph2 return Clear_Text: clrf adrLSB ; base address clrf adrMSB rcall Set_address ; set address goto Clear_Graph1 write_char: rcall Gwrite_data movlw 0xC0 movwf lcddata rcall Gwrite_cmd return Waitxms: movlw 0xF9 movwf loopcali rcall Wait_1ms decf loop bnz Waitxms return Wait_1ms: decf loopcali nop nop nop nop nop bnz Wait_1ms return ;****************************************************************************** ;End of program END