PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Testprogramm für 4-pin 4x27 Matrixdisplay WDC2704M



PICture
24.05.2006, 10:20
Hallo!

Hier ist geprüfte Hardware und Code zum Testen des WINTEK WDC2704M-1HNN LCD Displays vom Pollin. Ich habe es auf den PIC18F252 mit 40MHz PLL (10MHz Quartz) und PIC16F84A mit 20MHz Quartz getestet.

Auf der Displayplatine ist der SMD Widerstand R12 (Kontrastregelung) schon vorgesehen und man braucht ihn nur anlöten.

Der Code ist lauffähig auf den PICs 12FXXX, 16FXXX und 18FXXX. Es gibt nur zwei Unterschiede für die 12F & 16F und 18F PICs in den Unterprogrammen "Ser" und "Init".

Ich schreibe normaleweise keine Kommentare, aber diesmal habe ich mich sehr bemüht. :)

Man kann das Display mit:

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

an nur 2 Pins anschliessen. Die Hardware ist aber leider bischen komplizierter.

Falls irgendwas nicht ganz klar seien sollte, bitte fragen!

MfG


.-------------------------------.
| |
| Matrixdisplay 4x27 Zeichen |
| |
| WINTEK WDC2704M-1HNN |
| |
| 1 1 1 1 1 1 |
VCC | 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 |
+ '-------------------------------'
| | | | | | | | | | | | | | | |
+----|-+.-.| | | | | | | | | | | |
| | || | | | | | | | | | | |
+----+ | || | | | | | | | | | | |
| |1k5-'| | | | | | | | | | | +---+
=== |R12| | | | | | | | | | | +---+ |
GND +---+-|-+ | | | | | | | +---+ | |
_E1 >-------------|---+ | | | | | +---+ | | |
_E2 >-------------|-----/ | | | |GND | | | |
_DT >-------------+---+-+ | | | |=== | | | |
_CK >-----------+ | | | | | | | | | | |
| .---------------. | | | |
vom | | 1 2 3 4 5 6 7 | | | | |
PIC | | | | | | |
| |) IC 74HC164 | | | | |
| | 1 1 1 1 1 | | | | |
|VCC| 4 3 2 1 0 9 8 | | | | |
| + '-----------o---' | | | |
| | | | | | | | | | | | |
| +---+-|-|-|-|-+ | | | | |
+-------|-|-|-|---+ | | | |
| | | +-------+ | | |
| | +-----------+ | |
| +---------------+ |
+-------------------+
; Testprogramm für 4x27 Matrixdisplay WINTEK WDC2704M-1HNN mit 4-pin Anschluss
; LIST P=18F252
; include "P18F252.inc"
; __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
; __CONFIG _CONFIG2L, _BOR_OFF_2L & _BORV_20_2L & _PWRT_ON_2L
; __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
; __CONFIG _CONFIG3H, _CCP2MX_ON_3H
; __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
; __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
; __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
; __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
; __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
; __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
; __CONFIG _CONFIG7H, _EBTRB_OFF_7H
LIST P=16F84A
include "P16F84a.inc"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
#define _CK PORTB,0 ; Display clock
#define _DT PORTB,1 ; Display data
#define _E1 PORTB,2 ; Enable der oberen Displayhälfte
#define _E2 PORTB,3 ; Enable der unteren Displayhälfte
#define _C STATUS,C
#define _Z STATUS,Z
#define _Fdh Flags,0 ; Displayhälfte: 0-obere,1-untere
#define _Fao Flags,1 ; Display A0: 0-command, 1-data
Flags EQU 0x20
Tmp EQU 0x21
Tmp1 EQU 0x22
Tmp2 EQU 0x23
Tmp3 EQU 0x24
ORG 0x0000
call Init
Main bcf _Fdh ; obere Displayhälfte
call _1st ; erste Zeile
movlw "D"
call Char
movlw "I"
call Char
movlw "S"
call Char
movlw "P"
call Char
movlw "L"
call Char
movlw "A"
call Char
movlw "Y"
call Char
movlw " "
call Char
movlw "T"
call Char
movlw "E"
call Char
movlw "S"
call Char
movlw "T"
call Char

movlw 0x20 ; erstes ASCII Zeichen (20h= Leerzeichen) festlegen
movwf Tmp3
CharOut1 movf Tmp3,0
call Char ; das Zeichen an Display schicken
incf Tmp3,1 ; Zeichen erhöhen
movf Tmp3,0 ; prüfen ob schon 2Fh
sublw 0x2F
btfss _Z
goto CharOut1 ; wenn nicht, noch mal

call _2nd ; zweite Zeile, u.s.w
CharOut2 movf Tmp3,0
call Char
incf Tmp3,1
movf Tmp3,0
sublw 0x4A
btfss _Z
goto CharOut2

bsf _Fdh ; untere Displayhälfte
call _1st ; erste Zeile, u.s.w.
CharOut3 movf Tmp3,0
call Char
incf Tmp3,1
movf Tmp3,0
sublw 0x65
btfss _Z
goto CharOut3

call _2nd ; zweite Zeile, u.s.w.
CharOut4 movf Tmp3,0
call Char
incf Tmp3,1
movf Tmp3,0
sublw 0x80
btfss _Z
goto CharOut4
goto Main ; und noch mal vom Anfang (endlos)

_1st movlw 0x80 ; Startadresse der oberen Zeile
goto Cmd
_2nd movlw 0xC0 ; Startadresse der unteren Zeile
Cmd bcf _Fao ; schickt ein Befehl zum Display
movwf Tmp2
goto Send
Char movwf Tmp2 ; schickt ein Zeichen zum Display
bsf _Fao
Send movlw 8 ; schickt seriell bitweise ein Byte in den Schieberegister
movwf Tmp
Ser bcf _CK
bcf _DT
btfsc Tmp2,7
bsf _DT
bsf _CK
rlf Tmp2,1 ; nur für PIC12FXXX und PIC16FXXX
; rlcf Tmp2,1 ; nur für PIC18FXXX
decfsz Tmp,1
goto Ser
bcf _DT
btfsc _Fao
bsf _DT
btfss _Fdh ; Enable wählen
goto DEn1
call DDelay ; abwarten
bsf _E2 ; Enable der unteren Hälfte setzen
call DDelay ; abwarten
bcf _E2 ; und löschen
return
DEn1 call DDelay ; abwarten
bsf _E1 ; Enable der oberen Hälfte setzen
call DDelay ; abwarten
bcf _E1 ; und löschen
return
DDelay movlw 0x30 ; Verzögerungschleife, kann bis ca. 8MHz Quartz weg gelassen werden
movwf Tmp1
DDelayL decfsz Tmp1,1
goto DDelayL
return
Init bsf STATUS,RP0 ; nur für PIC12FXXX und PIC16FXXX
clrf TRISB ; RB0-7 als Ausgänge definieren
bcf STATUS,RP0 ; nur für PIC12FXXX und PIC16FXXX
clrf PORTB
clrf Flags
call DInit ; Initialisierung der oberen Hälfte des Displays (_Fdh=0)
bsf _Fdh ; Initialisierung der unteren Hälfte des Displays
call DInit
return
DInit movlw 0x38 ; 8 bit, 2 lines, 5x7 dots
call Cmd
movlw 0x0C ; display on, cursor off, no blink
call Cmd
movlw 6 ; increment, no schift
call Cmd
return
END