Ik wil een lcd scherm (2x16) in 4 bit mode aan een pic hangen, maar ik krijg hem niet aan de praat. ik wil nu alleen nog maar de cursor zien.
ik heb al op het forum gezocht maar kan niet het antwoord vinden.
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
LIST p=16F628A
INCLUDE <p16F628A.inc>
__CONFIG _BODEN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
#define lcd PORTB ;d4 = portb.0, d7 = portb.3
#define rs PORTA, 4
#define en PORTA, 3
cblock 0x20
wacht1_1
wacht1_2
wacht1_3
wacht1_4
wacht2_1
wacht2_2
wacht2_3
aantalms
endc
org 0x00
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
clrf PORTA
clrf PORTB
bsf 03h, d'5' ;bank 1
bcf 81h, d'7' ;portb pull-ups on
clrf TRISA
clrf TRISB
bcf 83h, d'5' ;bank 0
;-------------------------------------------------------
main
movlw d'5'
call delay100ms
call init
goto einde
;-------------------------------------------------------
delay100ms
movwf wacht1_1 ;1 stap
movlw d'100' ;1 stap
movwf aantalms
delayms movf aantalms,0 ;1 stap
movwf wacht1_2 ;1 stap
delayms1
movlw d'2' ;1 stap
movwf wacht1_3 ;1 stap
delayms2
movlw d'166' ;1 stap ]
movwf wacht1_4 ;1 stap ]
delayms3 ; ]500 stappen
DECFSZ wacht1_4, f ;1 stap ]
goto delayms3 ;2 stappen ]
decfsz wacht1_3, f ;1 stap
goto delayms2 ;2 stappen
decfsz wacht1_2, f ;1 stap
goto delayms1 ;2 stappen
decfsz wacht1_1, f ;1 stap
goto delayms ;2 stappen
return ;2 stappen
;---------------------------------------------------------------------------------------------------------------------------------------------------------------
delayus ;wachtijd -4 delen door 3 en antwoord invullen
movwf wacht2_1 ;1 stap
delayus1
decfsz wacht2_1, f ;1 stap
goto delayus1 ;2 stappen
return
;-----------------------------------------------------------------------------------------------
cls
bcf rs
clrf lcd
call enabled
movlw b'00000001'
movwf lcd
call enabled
bsf rs
return
;--------------------------------------------------------------
init
bcf rs
movlw b'00000100'
movwf lcd
call enabled
call enabled
movlw b'00001100'
movwf lcd
call enabled
clrf lcd
call enabled
movlw b'00001111'
movwf lcd
call enabled
call cls
bcf rs
clrf lcd
call enabled
movlw b'00000100'
movwf lcd
call enabled
bsf rs
return
;--------------------------------------------------------------
enabled
bsf en
nop
nop
nop
nop
nop
bcf en
movlw d'50'
movwf aantalms
call delayms
return
;--------------------------------------------------------------
einde
sleep ;toegevoegt
goto einde ;toegevoegt
end
Fuzzbass
Mijn echte naam: Joris | Mijn elektronica website: Fuzzcraft.com
Zonder je listing verder te bekijken, moet bij het label einde nog staan: goto einde, anders blijft je PIC elke keer opnieuw beginnen, als hij alle NOPs in het geheugen heeft afgelopen en weer bij adres 0 uit komt.
"end" is een assembler directive, geen processor instructie. De PIC loopt dus gewoon door een deel van het programmageheugen waar ongedefinieerde instructies staan. Bij een nieuwe PIC zijn dat NOPs, maar wie weet wat voor programmaresten er nog rondslingeren....
bedankt, ik dacht dat dat ook zorgte dat de pic er niet mee verder ging. ik heb eerst met picbasic gewerkt en daar was het zo dat het programma daarmee ophield. nu zag ik het ook in de tuts staan maar zonder echte uitleg dus dacht ik dat het het zelfde deed.
ik doe het zo:
;****************************************************************************
; program for making a standard hitachi lcd controllable by serial commands
;runs on a pic 16f628A on 4Mhz, comms is 19k2,8,n,1
; (c) M.A. Pals 2007
;****************************************************************************
; Revision : 0.06 Init LCD now works
; : 0.07 inproved lcd routines. no garbage on screen anymore!
; : 0.08 trying to be fasterrrr...
; : 0.09 faster! faster!
; : 0.10 trying 9600 baud and 19k2: pass!
; : 0.11 now implemement the interrupt handling of RX data: done!
;****************************************************************************
LIST P=16F628A,f=inhx8m,r=hex
INCLUDE ".\P16F628A.inc"
; Special symbolic names for this project
LCD_POS EQU 0x30 ;position on the LCD
LCD_CHR EQU 0x31 ;character or command to send to the LCD
LCD_PNT EQU 0x32 ;RS232/LCD memory pointer
LCD_DAT EQU 0x40 ;RS232/LCD memory start (20 bytes)
;data is on port B: 4 bit LCD data is on RB4 to 7
E EQU 0 ;PORTA, bit 0
RS EQU 1 ;PORTA, bit 1
RW EQU 2 ;PORTA, bit 2
;Configuration word setting
__CONFIG _BODEN_ON &_CP_OFF &_DATA_CP_OFF &_PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_ON &_HS_OSC
; Begin code at 0
org 0x00 ; origin
goto start ;goto start vector
org 0x04 ;this is the INT vector
goto inthnd ;this is the name of the inthandler subroutine
;---- initilisiation ----
start:
call initall ;initialize all PIC global settings
call LCDInit ;initialize LCD
call ActivateInt ;activate the interrupts
;---- main program ----
mainlp:
btfsc PORTB,3
goto dolo
bsf PORTB,3
goto mainlp
dolo bcf PORTB,3
goto mainlp
;---- init routines and subroutines go here ----
initall:
call bank0 ;be sure we're in bank 0
movlw H'007'
movwf CMCON ;comparators off
movlw b'00000000' ; set up portA
movwf PORTA
movlw b'00000100' ; RB2(TX)=1 others are 0
movwf PORTB
call bank1 ;set bank 1
movlw b'11110000' ; RA0-3 output, others input
movwf TRISA ; portA all pins input
movlw b'00000010' ; RB1(RX)=input, others output
movwf TRISB
movlw 0x0C ; 0C hex = 19200 baud / 19hex = 9600 baud / 33hex = 4800 baud
movwf SPBRG ; put in register
movlw b'00100100' ;BRGH=1 and TXEN=1
movwf TXSTA ;put in register
call bank0 ;set bank 0
movlw b'10010000' ;SPEN=1 and CREN=1
movwf RCSTA ;put in register
call longwt ;wait some
movf RCREG,W ;flush receive buffer
movf RCREG,W ;flush receive buffer
movf RCREG,W ;flush receive buffer
return
ActivateInt:
call bank0
clrf PIR1 ;make sure these interrupt flags are clear
movlw b'11000000' ;enable interrupt mask to peripheral interrupts & set interrupt enable
movwf INTCON
call bank1
movlw b'00100000'
movwf PIE1 ;enable serial RX interrupt
call bank0
return
;---- LCD init routines and subroutines go here ----
LCDInit:
call longwt ;wait for the LCD to become settled
movlw b'00100000' ;goto 4 bit mode
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00100000' ;lcd data setup: font etc (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'10000000' ;lcd data setup: font etc (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;lcd display on (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'11110000' ;lcd display on (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;clear display (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00010000' ;clear lcd display (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;autoincrement display (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'01100000' ;autoincrement display (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
return
LCD_SendCMD:
;THIS ROUTINE DOES HALF A COMMAND! so it has to be run twice for each command (except goto 4 bit that is)
bcf PORTA,RS ; Set RS in command mode
bcf PORTA,RW ; Set RW in write mode
movlw b'00001111' ;set mask
andwf PORTB,SAME ; Clear the upper nibble on the port
movf LCD_CHR,W ; load the char to send in W (upper nibble)
andlw b'11110000' ; Get upper nibble of char
iorwf PORTB,SAME ; Send data to LCD
call ToggleE ;issue the command
call lcdwt ;wait some
return
LCD_SendCHR:
bsf PORTA,RS ; Set RS in char mode
bcf PORTA,RW ; Set RW in write mode
movlw b'00001111' ; set mask
andwf PORTB,SAME ; Clear the upper nibble on the port
movf LCD_CHR,W ; load the char to send in W (upper nibble)
andlw b'11110000' ; Get upper nibble of char in W only
iorwf PORTB,SAME ; Send data to LCD
call ToggleE ; issue the command
call lcdwt ; wait some
movlw b'00001111' ; set mask
andwf PORTB,SAME ; Clear the upper nibble on the port
swapf LCD_CHR,W ; load the char to send in W (lower nibble)
andlw b'11110000' ; Get upper nibble of char in W only
iorwf PORTB,SAME ; Send data to LCD
call ToggleE ; issue the command
call lcdwt ; wait some
return
ToggleE:
bsf PORTA,E ;put E high
call shrtwt ;wait some
bcf PORTA,E ;Put E low
return
;---- Interrupt handling routines and subroutines go here ----
inthnd:
btfss PIR1,RCIF ;check whether char was received
retfie ;it wasn't.....
movf RCREG,W ;store char in w
movwf LCD_CHR ; store the char in LCD_CHR RAM
movwf TXREG ;send away char in W
call LCD_SendCHR ;send to the LCD
clrf PIR1 ;reset the interrupt
retfie ;return from interrupt.
;---- wait routines and subroutines go here ----
;short wait loop
shrtwt movlw 0x3
movwf SR1
lusje decfsz SR1,SAME
goto lusje
return
;long wait loop
longwt movlw 0x20
movwf SR1
outer movlw 0xFF
movwf SR2
inner decfsz SR2,SAME
goto inner
decfsz SR1,SAME
goto outer
return
;lcd wait loop:
lcdwt movlw 0x05
movwf SR1
lusje2 decfsz SR1,SAME
goto lusje2
return
;---- bank switch routines go here ----
bank0 bcf STATUS,RP0
bcf STATUS,RP1
return
bank1 bsf STATUS,RP0
bcf STATUS,RP1
return
END
deze code is tried and tested!
FRIPSTER
bedankt 
maar ik wou eigenlijk de rw pin niet gebruiken. of werkt deze code ook als de rw pin niet is aangesloten
hoi,
zou eigenlijk ook moeten kunnen, ik heb de RW ook niet echt gebruikt (ik zet hem laag, en daarna nergens meer hoog), dus altijg op laag zetten zou ook moeten kunnen. Waarom niet eerst proberen?
Verder: SRxx = een willekeurige RAM lokatie. Het is een naam die ik voor mijzelf heb bedacht (Scratch Ram = SR)
fripster
De RW pin kan je gewoon aan de massa hangen. Die RW pin gebruik je als de busyflag wilt uitlezen. Maar als je gewoon een voldoende lange delay in je software gebruikt heb je dat niet nodig. Het display werkt op 1MHz (bij 3V). Dus een delay van 1uS is genoeg.
hij geeft nu elke keer de error code:
Error[113] D:\ASM\LCD.ASM 190 : Symbol not previously defined (SAME)
wat moet ik met dat SAME doen?
oh ja... dat betekent 'hetzelfde'. Zie ook mijn INC file hier:
LIST
; P16F628A.INC Standard Header File, Version 1.01 Microchip Technology, Inc.
NOLIST
; Verify Processor
IFNDEF __16F628A
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
; Register Definitions
W EQU H'0000'
F EQU H'0001'
; Register Files
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
PCLATH EQU H'000A'
INTCON EQU H'000B'
PIR1 EQU H'000C'
TMR1L EQU H'000E'
TMR1H EQU H'000F'
T1CON EQU H'0010'
TMR2 EQU H'0011'
T2CON EQU H'0012'
CCPR1L EQU H'0015'
CCPR1H EQU H'0016'
CCP1CON EQU H'0017'
RCSTA EQU H'0018'
TXREG EQU H'0019'
RCREG EQU H'001A'
CMCON EQU H'001F'
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
PIE1 EQU H'008C'
PCON EQU H'008E'
PR2 EQU H'0092'
TXSTA EQU H'0098'
SPBRG EQU H'0099'
EEDATA EQU H'009A'
EEADR EQU H'009B'
EECON1 EQU H'009C'
EECON2 EQU H'009D'
VRCON EQU H'009F'
; STATUS Bits
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
; INTCON Bits
GIE EQU H'0007'
PEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'
; PIR1 Bits
EEIF EQU H'0007'
CMIF EQU H'0006'
RCIF EQU H'0005'
TXIF EQU H'0004'
CCP1IF EQU H'0002'
TMR2IF EQU H'0001'
TMR1IF EQU H'0000'
; T1CON Bits
T1CKPS1 EQU H'0005'
T1CKPS0 EQU H'0004'
T1OSCEN EQU H'0003'
NOT_T1SYNC EQU H'0002'
TMR1CS EQU H'0001'
TMR1ON EQU H'0000'
; T2CON Bits
TOUTPS3 EQU H'0006'
TOUTPS2 EQU H'0005'
TOUTPS1 EQU H'0004'
TOUTPS0 EQU H'0003'
TMR2ON EQU H'0002'
T2CKPS1 EQU H'0001'
T2CKPS0 EQU H'0000'
; CCP1CON Bits
CCP1X EQU H'0005'
CCP1Y EQU H'0004'
CCP1M3 EQU H'0003'
CCP1M2 EQU H'0002'
CCP1M1 EQU H'0001'
CCP1M0 EQU H'0000'
; RCSTA Bits
SPEN EQU H'0007'
RX9 EQU H'0006'
SREN EQU H'0005'
CREN EQU H'0004'
ADEN EQU H'0003'
FERR EQU H'0002'
OERR EQU H'0001'
RX9D EQU H'0000'
; CMCON Bits
C2OUT EQU H'0007'
C1OUT EQU H'0006'
C2INV EQU H'0005'
C1INV EQU H'0004'
CIS EQU H'0003'
CM2 EQU H'0002'
CM1 EQU H'0001'
CM0 EQU H'0000'
; OPTION Bits
NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'
; PIE1 Bits
EEIE EQU H'0007'
CMIE EQU H'0006'
RCIE EQU H'0005'
TXIE EQU H'0004'
CCP1IE EQU H'0002'
TMR2IE EQU H'0001'
TMR1IE EQU H'0000'
; PCON Bits
OSCF EQU H'0003'
NOT_POR EQU H'0001'
NOT_BO EQU H'0000'
NOT_BOR EQU H'0000'
NOT_BOD EQU H'0000'
; TXSTA Bits
CSRC EQU H'0007'
TX9 EQU H'0006'
TXEN EQU H'0005'
SYNC EQU H'0004'
BRGH EQU H'0002'
TRMT EQU H'0001'
TX9D EQU H'0000'
; EECON1 Bits
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'
; VRCON Bits
VREN EQU H'0007'
VROE EQU H'0006'
VRR EQU H'0005'
VR3 EQU H'0003'
VR2 EQU H'0002'
VR1 EQU H'0001'
VR0 EQU H'0000'
; RAM Definition
__MAXRAM H'01FF'
__BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
__BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
__BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
__BADRAM H'185', H'187'-H'189', H'18C'-H'1EF'
; Scratch RAM (SR) byte locations
SR1 EQU H'020'
SR2 EQU H'021'
SR3 EQU H'022'
SR4 EQU H'023'
SR5 EQU H'024'
SR6 EQU H'025'
SR7 EQU H'026'
SR8 EQU H'027'
SR9 EQU H'028'
SR10 EQU H'029'
; Configuration Bits
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_CP_ALL EQU H'03FF'
_CP_75 EQU H'17FF'
_CP_50 EQU H'2BFF'
_CP_OFF EQU H'3FFF'
_DATA_CP_ON EQU H'3EFF'
_DATA_CP_OFF EQU H'3FFF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_MCLRE_ON EQU H'3FFF'
_MCLRE_OFF EQU H'3FDF'
_ER_OSC_CLKOUT EQU H'3FFF'
_ER_OSC_NOCLKOUT EQU H'3FFE'
_INTRC_OSC_CLKOUT EQU H'3FFD'
_INTRC_OSC_NOCLKOUT EQU H'3FFC'
_EXTCLK_OSC EQU H'3FEF'
_LP_OSC EQU H'3FEC'
_XT_OSC EQU H'3FED'
_HS_OSC EQU H'3FEE'
; FSR Bit locations
IRP EQU H'7'
RP1 EQU H'6'
RP0 EQU H'5'
Z EQU H'2'
W EQU H'0'
SAME EQU H'1' ;same defines destination of register instead of W
LIST
Dit is de file P16F628A.INC die ge-include wordt aan het begin van de ASM file.
fripster
Het werkt!!!
:):) bedankt
edit: toch niet ik zie wel een cursor op het scherm, maar ik krijg er geen tekst op. ik heb de subroutines gekopieerd van Fripsters stuk en letters verzonden maar er komt niks op
main
call LCDInit ;initialize LCD
movlw b'01001000' ;H
movwf LCD_CHR
call LCD_SendCHR
movlw 'o'
movwf LCD_CHR
call LCD_SendCHR
movlw 'i'
movwf LCD_CHR
call LCD_SendCHR
goto einde
dit is het stukje dat ik zend
ps ik heb de datapinnen hangen aan b4 tot b7 klopt dit? ik heb het ook al geprobeert met b0 tot b3 toen lukte de initialisatie ook. dus begrijp ik er niks van
[Bericht gewijzigd door robojan op (92%)]
hoi,
dit zijn de pinnen:
Data RB4 bit 0 databus LCD
RB5 bit 1
RB6 bit 3
RB7 bit 4
E RA0
RS RA1
RW RA2
hope this helps!
ik weet wat er fout is op een of ander manier gaat de rs pin niet hoog. ik heb er nu een led aan hangen en die brand niet.
edit: ik heb nu de pic aangezet tot de initialisatie was gelukt en toen de rs pin handmatig hoog gemaakt en toen kwam de tekst.
(ik heb de instructie van schrijven in een oneindige lus gegooit.)
zou het een kapote poort kunnen zijn?
edit2: ik heb de rs pin op een andere poort aangesloten en nu werkt die wel
edit3:
nu weer niet en ik krijg nu op bijde poorten ook geen led meer aan het knipperen dus wat is er
dat die poorten kapot maakt?
dit is niet leuk.
hadv
Just find out what you like and let it kill you
Alles gecontroleerd op kortsluiting, dus ook bij het lcd? Als een pin stuk is is dat meestal een kortsluiting waardoor het poort na een tijdje sterft.
Plaats is een 2.2K weerstandje in de RS en EN lijnen (en eventueel de RW). Het display moet dan gewoon werken, maar je hebt wel een goede stroom begrenzing.
ik had dit misschien eerder moeten vertellen maar in pic basic lukt het me wel om tekst er op te krijgen en gaat de poort niet kapot. volgens hun aansluit metode. toch niet kapot ik krijg opeens weer alle poorten knipperen.
edit: hij werkt ik was de wachtijd vergeten na de initialisatie
[Bericht gewijzigd door robojan op (13%)]
ik ben nu met een projectje bezig. alleen het lukt mij weer niet om de lcd aan de praat te krijgen. het probleem is een beetje vreemd. namenlijk je krijgt 1 rij blokjes als de initialistatie niet goed gaat. maar ik krijg gewoon 1 rij blokjes zoals het hoort zonder pic, maar met pic krijg ik ook 1 rij blokjes op de eerste rij maar op de 2 rij zijn de 3 bovenste pixels ook aan. en de pixels worden wat doffer.
ik heb de lcd aangesloten op de pinnen 4 tot 7 van poort a en de en aan poort a.3 en rs aan poort a.2. dit heb ik gedaan omdat ik geen plaats meer had op poort b. ik heb dus alle poort b's in de code vervangen door poort a's. omdat de datapinnen op de zelfde plaats zaten maar dan op de andere poort en de en en rs poort veranderd.
hopelijk kunnen jullie helpen
; Code bij Robbert-jan
; led klok met speciale effecten
; zie voor verdere informatie www.freewebs.com/robojan
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
LIST p=16F628A
INCLUDE <p16F628A.inc>
__CONFIG _BODEN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
#define lcd PORTA ;d4 = portb.0, d7 = portb.3
E EQU 3 ;PORTA, bit 0
RS EQU 2 ;PORTA, bit 1
LCD_PNT EQU 0x34 ;RS232/LCD memory pointer
LCD_DAT EQU 0x42 ;RS232/LCD memory start (20 bytes)
LCD_POS EQU 0x32 ;position on the LCD
cblock 0x20
wacht1_1
wacht1_2
wacht1_3
wacht1_4
wacht2_1
wacht2_2
wacht2_3
aantalms
LCD_CHR
SR1
SR2
endc
org 0x00
goto start
start
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
clrf PORTA
clrf PORTB
bsf 03h, d'5' ;bank 1
bcf 81h, d'7' ;portb pull-ups on
clrf TRISA
clrf TRISB
bcf 83h, d'5' ;bank 0
;-------------------------------------------------------
main
movlw d'5'
call delay100ms
call LCDInit ;initialize LCD
movlw d'5'
call delay100ms
goto einde
;-------------------------------------------------------
;-------------------------------------------------------
;-------------------------------------------------------
LCDInit:
call longwt ;wait for the LCD to become settled
movlw b'00100000' ;goto 4 bit mode
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00100000' ;lcd data setup: font etc (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'10000000' ;lcd data setup: font etc (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;lcd display on (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'11110000' ;lcd display on (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;clear display (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00010000' ;clear lcd display (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'00000000' ;autoincrement display (only upper nibble is significant) : 1st part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
movlw b'01100000' ;autoincrement display (only upper nibble is significant) : 2nd part
movwf LCD_CHR ;put in RAM
call LCD_SendCMD ;perform the command
return
;-------------------------------------------------------
LCD_SendCMD:
;THIS ROUTINE DOES HALF A COMMAND! so it has to be run twice for each command (except goto 4 bit that is)
bcf PORTA,RS ; Set RS in command mode
movlw b'00001111' ;set mask
andwf PORTA,SAME ; Clear the upper nibble on the port
movf LCD_CHR,W ; load the char to send in W (upper nibble)
andlw b'11110000' ; Get upper nibble of char
iorwf PORTA,SAME ; Send data to LCD
call ToggleE ;issue the command
call lcdwt ;wait some
return
;-------------------------------------------------------
LCD_SendCHR:
bsf PORTA,RS ; Set RS in char mode
movlw b'00001111' ; set mask
andwf PORTA,SAME ; Clear the upper nibble on the port
movf LCD_CHR,W ; load the char to send in W (upper nibble)
andlw b'11110000' ; Get upper nibble of char in W only
iorwf PORTA,SAME ; Send data to LCD
call ToggleE ; issue the command
call lcdwt ; wait some
movlw b'00001111' ; set mask
andwf PORTA,SAME ; Clear the upper nibble on the port
swapf LCD_CHR,W ; load the char to send in W (lower nibble)
andlw b'11110000' ; Get upper nibble of char in W only
iorwf PORTA,SAME ; Send data to LCD
call ToggleE ; issue the command
call lcdwt ; wait some
return
;-------------------------------------------------------
ToggleE:
bsf PORTA,E ;put E high
call shrtwt ;wait some
bcf PORTA,E ;Put E low
return
;-------------------------------------------------------
delay100ms
movwf wacht1_1 ;1 stap
movlw d'100' ;1 stap
movwf aantalms
delayms movf aantalms,0 ;1 stap
movwf wacht1_2 ;1 stap
delayms1
movlw d'2' ;1 stap
movwf wacht1_3 ;1 stap
delayms2
movlw d'166' ;1 stap ]
movwf wacht1_4 ;1 stap ]
delayms3 ; ]500 stappen
DECFSZ wacht1_4, f ;1 stap ]
goto delayms3 ;2 stappen ]
decfsz wacht1_3, f ;1 stap
goto delayms2 ;2 stappen
decfsz wacht1_2, f ;1 stap
goto delayms1 ;2 stappen
decfsz wacht1_1, f ;1 stap
goto delayms ;2 stappen
return ;2 stappen
;---------------------------------------------------------------------------------------------------------------------------------------------------------------
delayus ;wachtijd -4 delen door 3 en antwoord invullen
movwf wacht2_1 ;1 stap
delayus1
decfsz wacht2_1, f ;1 stap
goto delayus1 ;2 stappen
return
;-----------------------------------------------------------------------------------------------
;short wait loop
shrtwt movlw 0x3
movwf SR1
lusje decfsz SR1,SAME
goto lusje
return
;long wait loop
longwt movlw 0x20
movwf SR1
outer movlw 0xFF
movwf SR2
inner decfsz SR2,SAME
goto inner
decfsz SR1,SAME
goto outer
return
;lcd wait loop:
lcdwt movlw 0x05
movwf SR1
lusje2 decfsz SR1,SAME
goto lusje2
return
;-------------------------------------------------------------------------------------------
einde sleep
goto einde
end
Misschien heb je net dezelfde fout gemaakt als ik 5 min geleden. Ik heb niet het hele topic gelezen maar poort a4 en a5 kunnen geen uitgang zijn 
uit datasheet :
RA4/T0CKI/CMP2 RA4 ST OD Bi-directional I/O port. Output is open drain type.
RA5/MCLR/VPP RA5 ST — Input port
ik heb een ledje aan poort a.5 gehangen met een knipper programma maar hij brandt de hele tijd
is dit nu een poort die je als in en uitgang kan gebruiken want volgens mij heb ik deze poort al heel vaak als uitgang gebruikt
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
jammer dan, ik heb op poorten ledjes hangen die niet persee nodig zijn dus als ik die 2 poorten doorverbind met die lcd poorten. dus een printje maken die die poorten doorverbinden. hoe kan ik er voor zorgen dat 1 van die 2 poorten hoog (zou moeten) gaan dat dan die andere poort hoog gaat.
edit:
ooooooooo
/---/|
//----/
ooooooooo
dus zo'n printje
[Bericht gewijzigd door robojan op (14%)]
hij werkt nu maar ik krijg de 2e regel niet aangestuurt. als ik volgens de datasheet 0x40 stuur naar lcd zou ik op de 2e regel moeten komen. maar dan stuur ik tekst en op de lcd komt $WG6 en dan is het het einde van de lcd regel. wat zou het kunnen zijn