
Har en lcd från kjell 2*16
4Mhz osc och delayrutiner från piclist:s mall.
Körde först med en pic16F84A. Då fick jag igång den men nästan alla tecken blev några andra. Kunde få fram det jag ville på skärmen genom att experimentera lite men det stämde inte med ascii tabellen i databladet. När man körde clear så gick pekaren till första raden men inga tecken raderades.
Bytte processor till en 16F867A istället för att utesluta att picen var paj eller bråkade med wispen(portb=db0-7). Då får jag en helt annat fel skärmen blir helt blank efter initieringen.
Har mixtrat med tiderna och bytt kristal men det ser inte ut att hjälpa, har jag missat nåt i initieringen av portarna? Har testat och mätt att alla portar gör det dom ska. lcd porten visar att det sista tecknet jag ville skriva ut är på(bit 0&5 på db0-7). Man ser att det händer något iallfall då jag väntar en sekund innan den initeras och då ser man svarta fyrkanter på 1 rad innan den blir blank...
Kod: Markera allt
; Använder extosc på 4 Mhz.
;
; E : RA0
; RW:GND
; RS: RA2
; D1-D7 : Rc1-Rc7
;
;
;**********************************************************************
List p=16F876A ;Val av pic
Include <P16F876A.inc> ;Inkluderar variabler etc för reg.
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF &_PWRTE_ON & _WDT_OFF & _hs_OSC & _LVP_OFF
ERRORLEVEL -302 ;Visar inte jobbit felmedd...
;************************************************************
;VAriabler för utgångar
#define LCD_E PORTA, 1
; #define LCD_RW PORTA, 0
#define LCD_RS PORTA, 2
#define LCDDAT PORTC ;8 data bitar.
;VAriabler för delay
cblock 0x21
d1
d2
d3
endc
;************************************************************
org 0x000 ;Resetvektor (start av program)
goto init
;************************************************************
init ;Initiering av portar och register...
banksel adcon1 ;Bank 1
movlw b'00000110' ;Stänger av alla Analoga I/O.
movwf adcon1 ;så att alla blir Digitala..
movlw 0x00 ;Port A & B,C är utgångar
movwf trisa
movwf trisb
movwf trisc
banksel porta ;Bank0
bcf adcon0,adon ;stänger av A/D omvandlare.
bcf intcon,gie ;Stänger av Interupts.
clrf porta ;Rensar portarna
clrf portb
clrf portc
clrw
;**********************************************************************
start
call Dly1s ;Väntar 1sek så allt hinner starta upp...
; MOVLW 0XFF
; MOVWF LCDDAT
; bsf lcd_e
; bcf lcd_rs
; GOTO $
call LCDinit
call dly1s
bsf porta,3
;movlw 0x01 ;LCD clr
;call lcdwrc
movlw 0x4b ;H
call lcdwr
movlw 0x45 ;E
call lcdwr
movlw 0x4a ;J
call lcdwr
movlw 0x20 ;SPACE
call lcdwr
movlw 0x44 ;D
call lcdwr
movlw 0x55 ;U
call lcdwr
movlw 0x21 ;!
call lcdwr
call dly1s
call dly1s
call dly1s
call dly1s
call dly1s
; movlw 0x00 ;LCD clr
; call lcdwrc
loop goto loop
;**********************************************************************
LCDinit
; bcf lcd_rw
bcf lcd_rs
bcf lcd_e
call Dly45ms
call dly5ms
movlw 0x3c ;Function set: 2rader, 5x10pix, 8bitar
call LCDWRC
call dly5ms
call dly5ms
movlw 0x3c ;Function set: 2rader, 5x10pix, 8bitar
call lcdwrc
call dly100us
call dly100us
movlw 0x3c ;Function set: 2rader, 5x10pix, 8bitar
call lcdwrc
call dly40us
movlw 0x3c ;Function set: 2rader, 5x10pix, 8bitar
call lcdwrc
call dly40us
movlw 0x08 ;LCD OFF
call lcdwrc
call dly40us
movlw 0x01 ;LCD clr
call lcdwrc
call dly40us
call dly40us
movlw 0x07 ;entrymode
call lcdwrc
call dly40us
call dly40us
movlw 0x0F ;lcd on
call lcdwrc
call dly40us
call dly40us
return
;**********************************************************************
LCDWRC ;Skriver till lcd:s kontrollregister.
movwf lcddat ;Lägger ut datan på porten
; bcf lcd_rw ;Write
; nop
bcf lcd_rs ;Välj dataregister
;nop
; nop
bsf lcd_e ;Enable
;nop
; nop
; nop
bcf lcd_e ;Disable
call dly40us
return
;**********************************************************************
LCDWR ;Skriver till lcd:s dataregister.
movwf lcddat ;Lägger ut datan på porten
; bcf lcd_rw ;Write
; nop
bsf lcd_rs ;Välj dataregister
nop
nop
bsf lcd_e ;Enable
nop
nop
nop
bcf lcd_e ;Disable
call dly40us
call dly40us
return
;**********************************************************************
dly40us ;40 cycles
movlw 0x0D
movwf d1
Delay_0
decfsz d1, f
goto Delay_0
return
;**********************************************************************
dly100us
;100 cycles
movlw 0x21
movwf d1
Delay_1
decfsz d1, f
goto Delay_1
return
;**********************************************************************
dly5ms ;4998 cycles
movlw 0xE7
movwf d1
movlw 0x04
movwf d2
Delay_2
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_2
;2 cycles
goto $+1
return
;**********************************************************************
Dly45ms
;44998 cycles
movlw 0x27
movwf d1
movlw 0x24
movwf d2
Delay_3
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_3
;2 cycles
goto $+1
return
;**********************************************************************
Dly1s ;999997 cycles
movlw 0x08
movwf d1
movlw 0x2F
movwf d2
movlw 0x03
movwf d3
Delay_4
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_4
;3 cycles
goto $+1
nop
return
;**********************************************************************
end