Hallo ik wil 2 HD44780 displays aansturen met 1 16F877 pic.
Op de site van meneer Krieftenbelt (picbasic.nl) zie ik dit staan:

EN = Enable.
Als deze pin laag is dan kan er data naar en van het display worden geschreven/gelezen.
Is deze pin hoog, dan trekt het zich niets aan van wat er op de datalijnen gebeurt.
Hierdoor is het (onder andere) mogelijk om meerdere componenten op dezelfde poorten van de PIC (= databus) aan te sluiten.
Bijvoorbeeld 2 displays op 1 PIC, alle lijnen (RS en de datalijnen (databus)) staan dan parallel aan de beide displays, met de EN van elk display op een eigen poort wordt dan de keus gemaakt, welk display de data op de lijnen moet verwerken, terwijl de ander dus niet reageert.

Dus ik heb nu dit gemaakt in ISIS:
http://img195.imageshack.us/img195/3134/naamloosx.th.jpg

Ik heb zoals je ziet de enable lijn van de linker lcd (lcd_1) op PORTB.0 aangesloten en de enable lijn van de rechter lcd (lcd_2) op PORTB.1.

Ik moet dus met de software een van deze lijnen laag trekken om er gegevens naar te verzenden. wanneer ik dat doe met onder andere deze code:


Symbol LCD_1 = PORTB.0
Symbol LCD_2 = PORTB.1

Low LCD_1
High LCD_2
DelayMS 500
Cls
Print At 1, 1, "LCD 1 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "
DelayMS 500
Low LCD_2
High LCD_1
DelayMS 500
Cls
Print At 1, 1, "LCD 2 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "

Werkt het niet. Wat doe ik verkeerd?

Zijn je displays geinitialiseerd??

Een schrijf actie naar een lcd ziet er zo uit:


        RW = 0;                     // Set control signals for 
        RS = 1;
	TRIS_DATA_PORT &= 0xf0; 
        LATB &= 0xf0; //stel de datalijnen in
        LATB |= ((data>>4)&0x0f);
        Delay18TCY();
        EN = 1;                      // Clock command in
        Delay18TCY();
        EN = 0;

        LATB &= 0xf0; //stel de datalijnen in
        LATB |= (data&0x0f);
        Delay18TCY();
        EN = 1;                      // Clock command in
        Delay18TCY();
        EN = 0;
        TRIS_DATA_PORT |= 0x0f;

Dus eerste 4 bits klaarzetten. Een puls op de EN en dan de 2e 4 bits klaar zetten.

Wat jij hebt gaat dus niet werken.

Wat ik zou doen is iets met 2 en poorten maken zodat je de EN kan wisselen.



      _____ 
1 ----|    |
      | &  |---- LCD EN
2-----|____|

Dit bouw je 2x op Elk LCD 1 keer. Op 1 komt de echte EN van de pic, die door picbasic gebruikt wordt. Op 2 komt de EN select, dus portB0 in jou geval. Als die hoog is komen de klokpulsen van de EN door bij het lcd. Als die laag is niet. Door dit 2x te bouwen kan je dus je tussen lcd's wisselen.

Zijn je displays geinitialiseerd??

Hoe zie of weet ik dat? Begrijp het niet.

Een schrijf actie naar een lcd ziet er zo uit:

Hmmmz? assembler? ik programmeer in picbasic. Van dat voorbeeld begrijp ik dus (nog) niets.

Dat met die en poorten begrijp ik wel. maar daar heb ik weer 2 extra picjes voor nodig. Het moet toch ook kunnen zonder 2 extra pics of niet?

EN port != pic.

2 en poortjes heb je in 1 ictje.

Het kan idd zonder extra logica, maar dan moet je de schrijf routines zelf gaan maken. Of de makers van picbasic moeten er iets op verzonnen hebben, maar dat weet ik niet.

Dat voorbeeld is gewoon in C.
RS/RW instellen
TRIS instellen
Hoogste 4bits op de poort zetten
Inklokken met de EN
Laagste 4ibts op de poort zeten
En weer inklokken.

Je contrast klopt trouwens ook niet. De instelling verschilt per LCD en je moet dus ook een pot per lcd hebben.

Zoiets ongeveer moet toch ook werken?
http://img34.imageshack.us/img34/1701/naamloosbyv.th.jpg
Maar dat doet het dus net niet. Mischien begrijp je aan de hand van het schema wat ik wil doen.

Als het helemaal niet zo kan werken denk ik dat ik maar voor de EN poort moet gaan. Verkoopt conrad die? Ik heb daar gezocht maar kon het niet echt vinden. Onder welke namen moet ik kijken?

EN poort = AND port -> http://en.wikipedia.org/wiki/List_of_7400_series_integrated_circuits

De 7408 bijv.

Wat doen die 2 10K weerstanden in je schema? Die houden de EN lijnen hoog.

Als je geen and poortjes hebt liggen kan je eens kijken naar een diode and.

Op 21 mei 2009 14:43:33 schreef Bas Smit:
Of de makers van picbasic moeten er iets op verzonnen hebben

Volgens mij hebben ze dat ook. Geen idee wat, maar twee LCD's op 1 PIC is zeker al vaker voorbij gekomen. Even de zoekfunctie gebruiken.

Heb nu dit:
http://img40.imageshack.us/img40/6667/naamloosrpo.th.jpg
Er werkt nog steeds maar 1 LCD.

Ik gebruik o.a. deze code:


Symbol LCD_1 = PORTB.0
Symbol LCD_2 = PORTB.1

High LCD_1
Low LCD_2
DelayMS 150
Print At 1, 1, "LCD 1 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "
High LCD_2
Low LCD_1
DelayMS 150
Print At 1, 1, "LCD 2 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "

dit is het hele programma:


Device 16F877                ;Gebruik een 16F877 type
Config HS_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , WRTE_ON , CP_OFF , DEBUG_OFF

ALL_DIGITAL True

DelayMS 500                   ;LCD stabilisering

Clear

Dim X         As Byte
Dim RetKey    As Byte
Dim key       As Byte
Dim Val1      As Byte
Dim Val2      As Byte
Dim Val3      As Byte
Dim Val4      As Byte
Dim Check     As Bit
Dim Check1    As Bit
Dim Check2    As Bit
Dim Check3    As Bit
Dim Check4    As Bit

Symbol True = 1
Symbol False = 0
Symbol Nil = 255
RetKey = Nil

Symbol ToetsR1 = PORTA.0
Symbol ToetsR2 = PORTA.1
Symbol ToetsR3 = PORTA.2
Symbol ToetsR4 = PORTA.3

Symbol ToetsK1 = PORTA.5
Symbol ToetsK2 = PORTA.6
Symbol ToetsK3 = PORTA.7

Symbol LCD_1 = PORTB.0
Symbol LCD_2 = PORTB.1

GoTo Hoofdmenu

NaarHoofdmenu:
;Scan of * toets werd ingedrukt. Zo ja. terug naar hoofdmenu
High ToetsR4
    If ToetsK1 = 1 Then
       RetKey = 10
       GoSub ToetsLos
    EndIf
;Scan of * toets werd ingedrukt Zo ja. terug naar Hoofdmenu end
Return

Toets:
RetKey = Nil 
    While RetKey == Nil
        ;scan rij 1
        High ToetsR1
            If ToetsK1 = 1 Then
                RetKey = 1
            ElseIf ToetsK2 = 1 Then
                RetKey = 2
            ElseIf ToetsK3 = 1 Then
                RetKey = 3        
            EndIf
        Low ToetsR1
        ;scan rij 1 end
        
        ;scan rij 2
        High ToetsR2
            If ToetsK1 = 1 Then
                RetKey = 4
            ElseIf ToetsK2 = 1 Then
                RetKey = 5
            ElseIf ToetsK3 = 1 Then
                RetKey = 6        
            EndIf
        Low ToetsR2
        ;scan rij 2 end

        ;scan rij 3
        High ToetsR3
            If ToetsK1 = 1 Then
                RetKey = 7
            ElseIf ToetsK2 = 1 Then
                RetKey = 8
            ElseIf ToetsK3 = 1 Then
                RetKey = 9        
            EndIf
        Low ToetsR3
        ;scan rij 3 end

        ;scan rij 4
        High ToetsR4
            If ToetsK1 = 1 Then
                RetKey = 10 ; = *
            ElseIf ToetsK2 = 1 Then
                RetKey = 0
            ElseIf ToetsK3 = 1 Then
                RetKey = 11 ; = #       
            EndIf
        Low ToetsR4
        ;scan rij 4 end                
    Wend
Return

ToetsLos:
Check = False
    While Check = False
        ;Kijk of er in rij 1 toetsen zijn ingedrukt
        High ToetsR1
            If ToetsK1 = 1 Or ToetsK2 = 1 Or ToetsK3 = 1 Then
                Check1 = False
            ElseIf ToetsK1 = 0 And ToetsK2 = 0 And ToetsK3 = 0 Then
                Check1 = True           
            EndIf 
        Low ToetsR1
        ;Kijk of er in rij 1 toetsen zijn ingedrukt end
        
        ;Kijk of er in rij 2 toetsen zijn ingedrukt
        High ToetsR2
            If ToetsK1 = 1 Or ToetsK2 = 1 Or ToetsK3 = 1 Then
                Check2 = False
            ElseIf ToetsK1 = 0 And ToetsK2 = 0 And ToetsK3 = 0 Then
                Check2 = True           
            EndIf 
        Low ToetsR2
        ;Kijk of er in rij 2 toetsen zijn ingedrukt end
        
        ;Kijk of er in rij 3 toetsen zijn ingedrukt
        High ToetsR3
            If ToetsK1 = 1 Or ToetsK2 = 1 Or ToetsK3 = 1 Then
                Check3 = False
            ElseIf ToetsK1 = 0 And ToetsK2 = 0 And ToetsK3 = 0 Then
                Check3 = True           
            EndIf 
        Low ToetsR3
        ;Kijk of er in rij 3 toetsen zijn ingedrukt end
        
        ;Kijk of er in rij 4 toetsen zijn ingedrukt
        High ToetsR4
            If ToetsK1 = 1 Or ToetsK2 = 1 Or ToetsK3 = 1 Then
                Check4 = False
            ElseIf ToetsK1 = 0 And ToetsK2 = 0 And ToetsK3 = 0 Then
                Check4 = True           
            EndIf 
        Low ToetsR4
        ;Kijk of er in rij 4 toetsen zijn ingedrukt end
        
        ;Als 1 of meer van de controles op ingedrukte toetsen falen. 
        ;faalt de controle en dient deze opnieuw herhaalt te worden. anders niet
        If Check1 = False Or Check2 = False Or Check3 = False Or Check4 = False Then
        Check = False
        ElseIf Check1 = True And Check2 = True And Check3 = True And Check4 = True Then
        Check = True
        EndIf
        ;Als 1 of meer van de controles op ingedrukte toetsen falen. 
        ;faalt de controle en dient deze opnieuw herhaalt te worden. anders niet
    Wend
Return

;Hoofdmenu
Hoofdmenu:
High LCD_1
Low LCD_2
DelayMS 150
Print At 1, 1, "LCD 1 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "
High LCD_2
Low LCD_1
DelayMS 150
Print At 1, 1, "LCD 2 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "

While 1 = 1
GoSub Toets
GoSub ToetsLos
    If RetKey = 11 Then ; 11 = #

    ElseIf RetKey = 10 Then ; 10 = *

    EndIf
Wend
;hoofdmenu end

End

[Bericht gewijzigd door Henry S. op (0%)]

Dit kan prima, je moet even op PORTB.2 letten, standaard is dat de EN lijn.

DECLARE LCD_ENPIN PORT.x wijzigen mocht je PORTB.2 voor iets nodig hebben.

Of je gebruikt bij 2 displays PORTB.1 en PORTB.2, je hebt daar geen extern poortje of bitbangpraktijken voor nodig.

Maar... zorg eerst dat beide displays werken met de standaardinstellingen om onnodige problemen te voorkomen.

Werk ook niet te veel met HIGH/LOW, dat kost zoveel tijd.
Zie www.picbasic.nl Deel3.

@code: Geen belachelijk lange comment regels maken!

En test met een klein programma.

Of je gebruikt bij 2 displays PORTB.1 en PORTB.2, je hebt daar geen extern poortje of bitbangpraktijken voor nodig.

Hoe bedoel je dat? 2x DECLARE LCD_ENPIN gebruiken? voorbeeld:


Declare LCD_ENPIN LCD_1
Print At 1, 1, "LCD 1 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "
Declare LCD_ENPIN LCD_2
Print At 1, 1, "LCD 2 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "

Ik heb dit geprobeerd maar het werkt jammer genoeg niet. de 2de Declare LCD_ENPIN negeert de compiler dan.

De LCD's werken allebei gewoon. dat had ik gecontroleerd.

Werk ook niet te veel met HIGH/LOW, dat kost zoveel tijd.
Zie www.picbasic.nl Deel3.

@code: Geen belachelijk lange comment regels maken!

Zal het (proberen) niet meer (te) doen.

Trouwens heb voor het posten van dit topic gezocht naar een dergelijk topic hier op het forum maar kon niet echt iets bruikbaars vinden van wat ik snapte.

Ik zit dit topic ook even te volgen. Ik vraag me zeer af of het met 'standaard' PICBasic is op te lossen: je kunt de Enable lijn maar 1 keer declaren, dus je kunt daarmee ook maar één display aansturen!

Die hardware oplossing van Bas Smit vind ik overigens wel goed gevonden.

Ja als die oplossing nu ook nog eens werkte.

Ik zie niet in waarom dat niet zou werken.

Een andere oplossing: sluit de afzonderlijke EN-ingangen van de LCD's beide via een eigen 1K weerstand aan op de EN-pin van de PIC.
En sluit dan op iedere EN-ingang van de LCD's weer een pin van de PIC aan. Die laatste twee pinnen gebruik je dan om de LCD's te blokkeren.
Zie plaatje dat het toch echt werkt (met een 16F628).
Midden boven zie je in het donker de 2 1K weerstanden.

http://www.uploadarchief.net/files/download/lcdx2.jpg

Let op: de compiler ondersteunt geen 2 LCD's; die moet je voor de gek houden.
Dus de allereerste keer dat je iets met de LCD's doet, bijvoorbeeld CLS, moeten ze beide geactiveerd zijn.
Dat om ervoor te zorgen dat ze beide juist geïnitialiseerd worden.

Ahhhh. heerlijk. dat laatste werkte wel. Heb je dat speciaal voor mij even opgebouwd?

Ik denk dat je dit principe zelf nog kunt uitbreiden tot meerdere LCD's

Hier is een programma voorbeeldje dat ik gebruikt heb voor de mensen die dit ook willen:


Device 16F876A                ;Gebruik een 16F876A type
Config HS_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF , DEBUG_OFF

ALL_DIGITAL True

DelayMS 500                   ;LCD stabilisering

Clear

Declare LCD_DTPIN PORTB.0  ;data pinnen
Declare LCD_RSPIN PORTB.4  ;Register select pinnen
Declare LCD_ENPIN PORTB.7  ;Enable pinnen
Declare LCD_LINES 4        ;LCD's met 4 regels

Symbol LCD1_Disable = PORTC.0
Symbol LCD2_Disable = PORTC.1
Cls

GoTo Hoofdmenu

Gebruik_LCD1:
    Low LCD2_Disable
    Input LCD1_Disable    
Return

Gebruik_LCD2:
    Low LCD1_Disable
    Input LCD2_Disable    
Return

Gebruik_BeideLCD:
    Input LCD1_Disable
    Input LCD2_Disable
Return

;Hoofdmenu
Hoofdmenu:

GoSub Gebruik_LCD1
Print At 1, 1, "LCD 1 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "

GoSub Gebruik_LCD2
Print At 1, 1, "LCD 2 TEST          "
Print At 2, 1, "                    "
Print At 3, 1, "                    "
Print At 4, 1, "                    "


;hoofdmenu end

End

En een schema:
http://img193.imageshack.us/img193/3965/schemau.jpg

Ach, heb het zelf binnenkort waarschijnlijk ook nodig :-)

Je zou ook de LCDx_Disables' nog op B5 en B6 kunnen zetten.
Dan gebruik je PORTB exclusief voor de LCD's en heb je de overige poorten vrij.

Bedankt voor de hulp. Echt te gek.

Je zou ook de LCDx_Disables' nog op B5 en B6 kunnen zetten.
Dan gebruik je PORTB exclusief voor de LCD's en heb je de overige poorten vrij.

Dat probeerde ik eerst ook maar om de een of andere manier werkte dat niet. Volgens mij werkte dan maar 1 LCD. Heb je mischien zin om nog mee te denken en dit laatste puzzelstukje op te lossen? Ik zal er morgen nog eens goed over na denken. Tis nu erg laat en nu kan ik denk ik wel slapen. Ze hebben gisteren 2 verstandskiezen getrokken in het ziekenhuis en daar kan ik maar slecht van slapen nu.

Edit:
Wanneer ik de disables op port b5 en/of b6 zet doet een van de schermen het wel en de andere niet. en nog wat andere rare dingen met de schermpjes. Als ik in de datasheet van de Pic kijk dan zie ik:

RB5 bit 5 TTL Input/output pin (with interrupt-on-change). Internal software programmable
weak pull-up.
RB6/PGC bit 6 TTL/ST(2)
Input/output pin (with interrupt-on-change) or in-circuit debugger pin.
Internal software programmable weak pull-up. Serial programming clock.

Mischien komt mn probleem door dat de poorten werken met interupt on change?

[Bericht gewijzigd door Elektron54 op (11%)]

Op 21 mei 2009 18:35:00 schreef Elektron54:
Hoe bedoel je dat? 2x DECLARE LCD_ENPIN gebruiken? voorbeeld:
[...]
Ik heb dit geprobeerd maar het werkt jammer genoeg niet. de 2de Declare LCD_ENPIN negeert de compiler dan.

Nee, en dat staat ook niet in mijn post:

Op 21 mei 2009 18:02:40 schreef Henry S.:
DECLARE LCD_ENPIN PORT.x wijzigen mocht je PORTB.2 voor iets nodig hebben.

Op 21 mei 2009 18:53:35 schreef picsels:
Ik zit dit topic ook even te volgen. Ik vraag me zeer af of het met 'standaard' PICBasic is op te lossen: je kunt de Enable lijn maar 1 keer declaren, dus je kunt daarmee ook maar één display aansturen!

Daarmee wel, maar als je zelf de EN lijn aanstuurt kan je meerdere displays aansturen.
EN is niet meer dan een flag, dus als jij dat overneemt met eigen flags en zo de EN van de displays zelf aanstuurt dan is dat geen probleem.

Gedoe met weerstanden of poortjes is niet nodig.

Natuurlijk moet je elk display als zodanig behandelen en initialiseren. Dat hoeft niet tegelijk.

Op 21 mei 2009 23:03:35 schreef Elektron54:
Hier is een programma voorbeeldje dat ik gebruikt heb voor de mensen die dit ook willen:

Ik vraag me af waarom dat werkt want je gebruikt INPUT...
Het is niet de bedoeling om van je EN poorten ingangen te maken.

@Henry: ik denk dat je je wat beter moet verdiepen in de oplossing. Je aanvullingen kloppen niet met de rest van wat al besproken is.

Als je gebruik wilt maken van de mogelijkheden die PICBasic biedt om met LCD's om te gaan, kun je maar één LCD aansturen. Het is onmogelijk om 'on the fly' de EN-pin aan te passen, omdat die onder controle staat van de compiler. Eenmaal toegewezen (via een DECLARE) kun je die niet meer aanpassen voor een 2e LCD. Dus de opmerking over het gebruik van PORTB.2 klopt in zoverre dat je inderdaad een andere EN kunt kiezen. Maar voor maar één LCD!

'Gedoe' met weerstanden of poortjes zoals jij het noemt, is de oplossing om gebruik te blijven maken van wat PICBasic standaard biedt en toch 2 LCD's aan te sturen.

De reden waarom Elektron54 INPUT gebruikt, is om een specifieke EN-pin vrij te geven. Dan reageert de betreffende LCD weer op het centrale EN-signaal.
Door de pin als LOW te initialiseren, wordt de EN-pin van het betreffende LCD geblokkeerd.
Het is dus zeer wel de bedoeling om van een EN-poort een ingang te maken. Alleen hebben we het hier niet over de EN die de LCD's aanstuurt, maar over de LCD-specifieke 'EN'-pin, die bepaald of het mag reageren op het EN-signaal.

Initialiseren van de LCD's moet dus tegelijkertijd, wederom, als je van PICBasic gebruik wilt maken zoals het bedoeld is: niet nogmaals zelf een complete LCD-aansturing uitvogelen.

@Elektron54: misschien dat het in jouw geval op PORTB niet werkt omdat je last hebt van het Read-Modify-Write probleem.

Op 22 mei 2009 14:45:02 schreef picsels:
@Henry: ik denk dat je je wat beter moet verdiepen in de oplossing. Je aanvullingen kloppen niet met de rest van wat al besproken is.

Als je gebruik wilt maken van de mogelijkheden die PICBasic biedt om met LCD's om te gaan, kun je maar één LCD aansturen. Het is onmogelijk om 'on the fly' de EN-pin aan te passen, omdat die onder controle staat van de compiler. Eenmaal toegewezen (via een DECLARE) kun je die niet meer aanpassen voor een 2e LCD. Dus de opmerking over het gebruik van PORTB.2 klopt in zoverre dat je inderdaad een andere EN kunt kiezen. Maar voor maar één LCD!

Voor mij is een enable pin niet meer dan een flag, maar blijkbaar denkt Toschiba daar anders over, EN wisselt constant. Helaas gaat mijn suggestie dan niet meer op en moet je gaan bitbangen.

'Gedoe' met weerstanden of poortjes zoals jij het noemt, is de oplossing om gebruik te blijven maken van wat PICBasic standaard biedt en toch 2 LCD's aan te sturen.

Klopt, en heb ik ook wel vaker gezien, dacht dat het simpeler kon...

De reden waarom Elektron54 INPUT gebruikt, is om een specifieke EN-pin vrij te geven. Dan reageert de betreffende LCD weer op het centrale EN-signaal.
Door de pin als LOW te initialiseren, wordt de EN-pin van het betreffende LCD geblokkeerd.
Het is dus zeer wel de bedoeling om van een EN-poort een ingang te maken. Alleen hebben we het hier niet over de EN die de LCD's aanstuurt, maar over de LCD-specifieke 'EN'-pin, die bepaald of het mag reageren op het EN-signaal.

Waarom dan niet gewoon High/Low gebruiken (als het toch moet, Input/Output zijn net zo traag)?

@Elektron54: misschien dat het in jouw geval op PORTB niet werkt omdat je last hebt van het Read-Modify-Write probleem.

Dat lijkt me heel stug alle B poorten zijn nagenoeg gelijk. Wat zou daar de reden van moeten zijn?

Op 22 mei 2009 15:34:48 schreef Henry S.:
Helaas gaat mijn suggestie dan niet meer op en moet je gaan bitbangen.

Mee eens.
Dat was voor mij de reden om PICBasic te gaan gebruiken.
Ben ik daar tenminste van af. Helaas levert dat bepaalde beperkingen op.

Waarom dan niet gewoon High/Low gebruiken (als het toch moet, Input/Output zijn net zo traag)?

De truuk hier is dat je de 'EN-control-pin' als input schakelt. Daardoor heeft die geen invloed meer op de EN-pin van de LCD waar het om gaat en gaat 'ie reageren op print statements. Als je de pin als output schakelt en laag maakt, wordt de LCD geblokkeerd. Dat is de essentie van deze truuk.
Dat dit 'trage' statements zijn klopt wel. Waarschijnlijk handiger om hier rechtstreeks de TRISx aan te sturen.

Dat lijkt me heel stug alle B poorten zijn nagenoeg gelijk. Wat zou daar de reden van moeten zijn?

Geen idee. Ik heb wel eens de vraag gesteld wat er precies te doen is aan het RMW-probleem zonder al te veel extra code, maar daar is nooit een bevredigend antwoord op gekomen (gebruik van schaduwregisters is me te omslachtig).

Wat in dit geval wél gebeurt is dat er individuele pinnen van een port van input naar output gaan. En in dat soort gevallen treden nog wel eens RMW problemen op. Zelf probeer ik dat te voorkomen door pinnen tijdens het runnen van een programma niet te veel te wisselen van input naar output of omgekeerd.

Bottom line: met een relatief eenvoudige truuk is het toch mogelijk om meerdere LCD's via PICBasic aan te sturen. En dat vond ik zelf wel een interessante 'ontdekking'. Zeker omdat het met een relatief eenvoudige oplossing (welgeteld twee R-tjes) blijk te werken :-)

Ik laat het nu gewoon zoals het is behalve dan dat ik de input en low commando's nog ga veranderen. dat lukt wel.
Ik ga me nog eens verdiepen op het Read-Modify-Write probleem (Hier een interesante website voor iemand die er interesse in mag hebben) als dat het probleem mocht zijn. Bedankt voor jullie interesante antwoorden, oplossingen en tips.

Hmm ik heb nu alles op PortD en ik gebruik de gegeven code (met andere pinnen) maar 1 display reageert in ISIS :(
Er moeten 3 displays op komen waarvan 4x20 x2 en 2x20 x1

Iemand al uitgevonden waarom het niet op andere poorten werkt ?
bvd

Tijd voor een grafisch LCD misschien, op een 128x64 heb je 8 regels met 20 karakters en natuurlijk de grafische mogelijkheden.

Ik heb ook gehad dat maar 1 schermpje het deed. Dat is dus waarschijnlijk het read write modify probleem.
Probeer je disable pinnen te veranderen. gewoon op andere pinnetjes dus.