PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] 2-pin Schnittstelle für mehrere LC Displays



PICture
28.08.2006, 01:13
Hallo!

Hier möchte ich meine letzte geprüfte Idee vorstellen. Es ist eine ziemlich einfache Schnittstelle, die ermöglicht bei Nutzung nur 2 I/O Pins vom PIC, eine quasi gleichzeitige Ansteuerung mehreren verschiedenen LC Displays, die insgesamt bis zu 8 Enables haben dürfen. Änliche Hardware mit anderer Software kann auch für andere Zwecke benutzt werden.

Ich habe die Hardware mittels beiliegenden Testprograms mit einem PIC16F630 (mit 20 MHz Quartz), PIC18F252 (mit 10MHz Quartz und PLL also 40 MHz) und 2 Displays getestet.

Display1=Hyundai HP12542R-DYO, Grafik 128x64 Punkte, Enable verbunden mit E0
Display2=Varitronix MDLS20464BD-41, Punktmatrix 4x20 Zeichen, Enable verbunden mit E1

Eine Auswahl des Displays geschieht durch laden in Register Tmp6 entsprechender Hexzahl:

E0=1, E1=2, E2=4, E3=8, E4=10h, E5=20h, E6=40h, E7=80h.

Sie wird in den 74HC595 Register geschickt.

Danach wird eine Zahl aus dem W Register mit "Cmd" als Befehl oder mit "Char" als Data (Zeichen) in den 74HC164 Register geschickt und mit entsprechendem Enable (E0...E7) ins gewählte Display eingeschrieben.

Diese Hardware ist eine Erweiterung der früheren,

https://www.roboternetz.de/phpBB2/viewtopic.php?t=13685

die ich mit dem 74HC595 nachgerüstet habe.

Um ältere Software, die für einzelnes Display (nur mit 74HC164 und 74HC74) geschrieben wurde, nutzen zu können, habe ich den Umschalter S hinzugefügt. In der "A" Stellung kann man nur ein Display (ohne 74HC595) mit der alten Software und in der "N" Stellung (mit 74HC595) mehrere Displays steuern. Wer den Umschalter nicht braucht, kann einfach den Pin 15 des 74HC595 direkt als E0 anschliessen.

Es müssen noch die ensprechende Pins der ICs an VCC und GND angeschlossen werden:

An VCC IC1 Pin 14, IC2 Pin 14 und IC3 Pin 16.
An GND IC1 Pin7, IC2 Pin 7 und IC3 Pin 8.

Wenn etwas nicht klar seien sollte, bitte fragen ! :)

MfG



zu allen paralell eizeln zum gewähl-
geschalteten Displays ten Display
/-----------/\--------\ /------/\-------\
R D D D D D D D D E E E E E E E E
S 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
A A A A A A A A A A A A A A A A A
| | | | | | | | | +-oA | | | | | | | |
| | | | | | | | | S | --o-+ | | | | | | |
| | | | | | | | | | oN . | | | | | | |
| | | | | | | | | | | . | | | | | | |
| | | | | | | | | | +---+ | | | | | | |
VCC | | | | | | | | | | | | | | | | | |
+ | | | | | | | | +--+ | o-o-o-o-o-o-o-o---+
vom PIC 4| | | | | | | | | | | | | | | | | | | | |
2.-o-.5|1,2.-----------------.| | 14.-----------------.===
_DT >-+----|IC1|-+---| 3 4 5 6 1 1 1 1 |+-|---|15 1 2 3 4 5 6 7 |GND
| |/1 | | 0 1 2 3 | | | |
_CK >---+--| o-+---|IC2 74HC164 |+-|---|IC3 74HC595 |
| | 3'-o-'6| 8'--------o--------'| | 11'----o---o---o----'
| | 1| | 9| | | 12| 13| 10|
| | + | + | | | | +
| | VCC | VCC | | | | VCC
| +--------+----------------------+ | | |
| | VCC | | |
| | + IC1=74HC74 | | | | |
| | 10| | | | +-o => o-+
| |12.-o-.9 | | | | | | |
| +--|IC1|--------------------------+--------+ | .-. ===
| |/2 | | | | GND
+----| o---------------------------------------+ | |1k
11'-o-'8 '-'
13| |
+ ===
VCC GND


; Testprogramm für 2-pin Schnittstelle mit mehreren LC Displays
; LIST P=18F252
; include "P18F252.inc"
; CONFIG OSCS=OFF,OSC=HSPLL, PWRT=ON, BOR=OFF, WDT=OFF, CCP2MUX=OFF, STVR=OFF, LVP=OFF, DEBUG=OFF
; CONFIG CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF,CPD=OFF,WR T0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF
; CONFIG WRTB=OFF,WRTC=OFF,WRTD=OFF,EBTR0=OFF,EBTR1=OFF,EBT R2=OFF,EBTR3=OFF,EBTRB=OFF
LIST P=16F630
include "P16F630.inc"
__CONFIG _CP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _HS_OSC
#define @PORT PORTC ; Port und
#define @TRIS TRISC ; dazugehörigen TRIS Register festlegen
#define _CK PORTC,2 ; Pins für Displayleitungen
#define _DT PORTC,3 ; definieren
#define _C STATUS,C
#define _Finv Flags,0 ; 0-normal, 1-invers
Tmp EQU 0x20
Tmp1 EQU 0x21
Tmp2 EQU 0x22
Tmp3 EQU 0x23
Tmp4 EQU 0x24
Tmp5 EQU 0x25
Tmp6 EQU 0x26
Flags EQU 0x27
ORG 0x0000
call Init
Main movlw 1 ; Display1
movwf Tmp6 ; auswählen
call GDspOut ; und ausgeben
movlw 2 ; Display2
movwf Tmp6 ; auswählen
call DspOut ; und ausgeben
goto Main ; und noch mal vom Anfang (endlos)

GDspOut movlw 0xB0 ; Page 0 Adresse setzen (1. Zeile)
call Cmd
movlw 0x10 ; Column 0 Adresse setzen (2 Bytes)
call Cmd
movlw 0
call Cmd

movlw 0x80 ; Schleifenzähler festlegen (128d)
movwf Tmp5
movlw 0 ; erstes Byte festlegen
movwf Tmp4
MainL1 movf Tmp4,0
call Char ; das Byte an Display schicken
incf Tmp4,1 ; das Byte incrementieren
decfsz Tmp5,1 ; Schleifenzähler decrementieren
goto MainL1 ; wiederholen bis Schleifenzähler=0

movlw 0xB1 ; Page 1 Adresse setzen (2. Zeile), u.s.w
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

movlw 0x80
movwf Tmp5
MainL2 movf Tmp4,0
call Char
incf Tmp4,1
decfsz Tmp5,1
goto MainL2

movlw 0xB2 ; Page 2 Adresse setzen (3. Zeile), u.s w.
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

movlw 0x80
movwf Tmp5
movlw 0xFF ; erstes Byte festlegen
movwf Tmp4
MainL3 movf Tmp4,0
call Char
decf Tmp4,1 ; das Byte decrementieren
decfsz Tmp5,1
goto MainL3

movlw 0xB3 ; Page 3 Adresse setzen (4. Zeile), u.s.w.
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

movlw 0x80
movwf Tmp5
MainL4 movf Tmp4,0
call Char
decf Tmp4,1
decfsz Tmp5,1
goto MainL4

movlw 0xB4 ; Page 4 Adresse setzen (5. Zeile), u.s.w., wie Page 0
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

bsf _Finv ; invers
movlw 0x80
movwf Tmp5
movlw 0
movwf Tmp4
MainL5 movf Tmp4,0
call Char
incf Tmp4,1
decfsz Tmp5,1
goto MainL5
bcf _Finv ; normal

movlw 0xB5 ; Page 5 Adresse setzen (6. Zeile), u.s.w., wie Page 1
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

bsf _Finv ; invers
movlw 0x80
movwf Tmp5
MainL6 movf Tmp4,0
call Char
incf Tmp4,1
decfsz Tmp5,1
goto MainL6
bcf _Finv ; normal

movlw 0xB6 ; Page 6 Adresse setzen (7. Zeile), u.s.w., wie Page 2
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

bsf _Finv ; invers
movlw 0x80
movwf Tmp5
movlw 0xFF
movwf Tmp4
MainL7 movf Tmp4,0
call Char
decf Tmp4,1
decfsz Tmp5,1
goto MainL7
bcf _Finv ; normal

movlw 0xB7 ; Page 7 Adresse setzen (8. Zeile), u.s.w., wie Page 3
call Cmd
movlw 0x10
call Cmd
movlw 0
call Cmd

bsf _Finv ; invers
movlw 0x80
movwf Tmp5
MainL8 movf Tmp4,0
call Char
decf Tmp4,1
decfsz Tmp5,1
goto MainL8
bcf _Finv ; normal
return

DspOut call FstLine
movlw "T"
call Char
movlw "E"
call Char
movlw "S"
call Char
movlw "T"
call Char
movlw "0"
call Char
movlw "1"
call Char
movlw "2"
call Char
movlw "3"
call Char
movlw "4"
call Char
movlw "5"
call Char
movlw "6"
call Char
movlw "7"
call Char
movlw "8"
call Char
movlw "9"
call Char
movlw "A"
call Char
movlw "B"
call Char
movlw "C"
call Char
movlw "D"
call Char
movlw "E"
call Char
movlw "F"
call Char
call SndLine
movlw "G"
call Char
movlw "H"
call Char
movlw "I"
call Char
movlw "J"
call Char
movlw "K"
call Char
movlw "L"
call Char
movlw "M"
call Char
movlw "N"
call Char
movlw "O"
call Char
movlw "P"
call Char
movlw "Q"
call Char
movlw "R"
call Char
movlw "S"
call Char
movlw "T"
call Char
movlw "U"
call Char
movlw "V"
call Char
movlw "W"
call Char
movlw "X"
call Char
movlw "Y"
call Char
movlw "Z"
call Char
call TrdLine
movlw "t"
call Char
movlw "e"
call Char
movlw "s"
call Char
movlw "t"
call Char
movlw "0"
call Char
movlw "1"
call Char
movlw "2"
call Char
movlw "3"
call Char
movlw "4"
call Char
movlw "5"
call Char
movlw "6"
call Char
movlw "7"
call Char
movlw "8"
call Char
movlw "9"
call Char
movlw "a"
call Char
movlw "b"
call Char
movlw "c"
call Char
movlw "d"
call Char
movlw "e"
call Char
movlw "f"
call Char
call FthLine
movlw "g"
call Char
movlw "h"
call Char
movlw "i"
call Char
movlw "j"
call Char
movlw "k"
call Char
movlw "l"
call Char
movlw "m"
call Char
movlw "n"
call Char
movlw "o"
call Char
movlw "p"
call Char
movlw "q"
call Char
movlw "r"
call Char
movlw "s"
call Char
movlw "t"
call Char
movlw "u"
call Char
movlw "v"
call Char
movlw "w"
call Char
movlw "x"
call Char
movlw "y"
call Char
movlw "z"
call Char
return

FstLine movlw 0x80 ; Adresse der 1. Zeile
goto Cmd
SndLine movlw 0xC0 ; Adresse der 2. Zele
goto Cmd
TrdLine movlw 0x94 ; Adresse der 3. Zeile
goto Cmd
FthLine movlw 0xD4 ; Adresse der 4.Zeile

Cmd movwf Tmp2
call DDel
bcf _C ; Schicke Befehl
goto SendR
Val movwf Tmp1 ; Schicke Zahl (0-FF)
swapf Tmp1,0
movwf Tmp4
call Num
movf Tmp1,0
movwf Tmp4
Num call DDel
movf Tmp4,0
andlw 0x0F ; Schicke Ziffer (0-F)
movwf Tmp2
movlw 0x0A
subwf Tmp2,0
btfsc _C
addlw 7
addlw 0x3A
Char bsf _C ; Schicke ASCII Zeichen
btfsc _Finv ; prüfen, ob invertiert
comf Tmp2,1 ; wenn ja, alle Bits negieren
movwf Tmp2 ; Schicke ein Byte + RS (9 bits)
SendR movlw 8 ; Schicke Registerinhalt
movwf Tmp3

SerSendE bcf _CK ; Schicke seriell (bitweise) Enable (8bit) in 74HC595
bcf _DT
btfsc Tmp6,7
bsf _DT
bsf _CK
; rlcf Tmp6,1 ; nur für PIC18FXXX aktivieren
rlf Tmp6,1 ; nur für PIC16FXXX aktivieren
decfsz Tmp3,1
goto SerSendE
; rlcf Tmp6,1 ; nur für PIC18FXXX aktivieren
rlf Tmp6,1 ; nur für PIC16FXXX aktivieren

movlw 9
movwf Tmp3
SerSend bcf _CK ; Schicke seriell (bitweise) Data+RS (9bit) in 74HC164
bcf _DT
btfsc Tmp2,7
bsf _DT
bsf _CK
; rlcf Tmp2,1 ; nur für PIC18FXXX aktivieren
rlf Tmp2,1 ; nur für PIC16FXXX aktivieren
decfsz Tmp3,1
goto SerSend
call DDel
bcf _DT ; set
bsf _DT ; Display Enable
bcf _DT
call DDel
bcf _CK ; clear
bcf _DT ; Display
bsf _DT ; Enable
bcf _DT
call DDel
return

Del movlw 0x20
movwf Tmp
Del1 clrf Tmp1
Del2 clrf Tmp2
Del3 decfsz Tmp2,1
goto Del3
decfsz Tmp1,1
goto Del2
decfsz Tmp,1
goto Del1
return

DDel movlw 0x40
movwf Tmp3
DDelL decfsz Tmp3,1
goto DDelL
return

Init bsf STATUS,RP0 ; nur für PIC16FXXX aktivieren
clrf @TRIS ; Mache B0-B7 Ausgänge
bcf STATUS,RP0 ; nur für PIC16FXXX aktivieren
clrf @PORT
clrf Flags
bcf _DT ; Lösche Display Enable

movlw 1 ; Grafikdisplay initialisieren
movwf Tmp6
movlw 0xAE ; Display aus
call Cmd
call Del ; abwarten
movlw 0xA3 ; LCD Bias=1/7
call Cmd
movlw 0x2F ; LCD Spannungserzeugung einschalten
call Cmd
movlw 0x81 ; Kontrasteinstellung auswählen
call Cmd
movlw 0x20 ; Kontrast=mittel
call Cmd
movlw 0xAF ; Display ein
call Cmd

movlw 2 ; Matrixdisplay initialisieren
movwf Tmp6
movlw 0x38 ; 8 bit, 2 Zeilen , 5x7 Pixel
call Cmd
movlw 0x0C ; Display ein, Cursor aus, nicht blinken
call Cmd
movlw 6 ; Incrementieren, nicht schieben
call Cmd
return
END