PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] 2-pin Matrixdisplay für µC



PICture
21.10.2005, 12:37
Hallo!

Hier möchte ich meine geprüfte Idee zeigen. Weil ich mit den kleinsten PIC12F629 angefangen habe, und auch etwas auf dem Display sehen wollte, habe ich mir als Ziel gesetzt (und glücklicheweise erreicht), eine Schnittstelle für Display, die nur 2 pins zum Betreiben braucht, zu enwickeln. Um die zwei pins maximal auszunutzen, habe ich auf denen noch 3 Taster gehängt. Und es funktioniert!

Ich habe eben bemerkt, dass beim Beschreiben des 9-bittigen Schieberegisters (74HC164 + linke Hälfte von 74HC74) die steigende Flanke von _DT immer ein Prozessortakt vor der steigender Flanke von _CK kommt und habe es durch Vertauschen der Funktionen von _CK und _DT zum Erzeugen vom Enable (E) ausgenutzt (siehe das Zeitdiagramm im Code).

Bei der Tastenabfrage gibt es folgende Kombinationen der _CK und _DT:

_CK=1 und _DT=1 -> keine Taste gedrückt
_CK=1 und _DT=0 -> Taste T1 gedrückt
_CK=0 und _DT=1 -> Taste T2 gedrückt
_CK=0 und _DT=0 -> Taste T3 gedrückt

Vielleicht braucht jemand von euch so was. Wer keine Taster braucht, kann sie, alle Resistoren und beide Transistoren weg lassen (untere Skizze). In dem Fall könnte man die beiden IC's in SMD auf der Displayplatine mit doppelseitigen Klebeband befestigen und mit dünnem Kupferlackdraht verbinden. Vorteil: man kann das Display vielseitig mit diversen µC's verwenden.

Zur Skizze. Um es durchschaulicher zu gestalten sind folgende Verbindungen noch zu machen, die auf der Skizze nicht berücksichtigt sind:

An GND (Masse): IC1 pin7, IC2 pin7
An VCC: IC1 pin 14, IC2 pin 14 und IC1 pins 1,4,10,13.

IC1 ist 74HC74 und IC2 ist 74HC164. Die Transistoren sind beliebig.

Sollte ich was übersehen haben, bitte fragen. Weil es nur eine Idee ist, habe ich kein Layout (Platine) dafür.

Das Testprogram ist für übliches 2x16 Zeichendisplay geschrieben. Auf dem Display soll in der ersten Zeile "0123456789ABCDEF" und in der zweiten "FEDCBA9876543210" erscheinen.

Übrigens, es funktioniert auch mit anderen Zeichendisplays (z.B. 4x16 Zeichen) mit gleichen Anschlüssen: R/W, RS, E und D0 bis D7 (ausprobiert). ;)

MfG

_ _ _ _ _ _ _ _ _____________
_CK ___| |_| |_| |_| |_| |_| |_| |_| |_| |_____

| | | | | | | | |
V V V V V V V V V

D7 D6 D5 D4 D3 D2 D1 D0 RS
___ ___ ___ ___ ___ _ _
_DT __| |___| |___| |___| |___| |__| |______| |__

| | | | | | |
V V V V V V V
________
E _________________________________________| |____



vom PIC

_CK V V _DT
GND | | VCC
=== T1 R1 1k | | R3 10k +
| --- ___ | | ___ |
+--+---o o---+-|___|---------+-----+-----|___|-+
| | T2 | R2 1k | | | R4 10k |
.-. | --- | ___ | | | ___ |
R7| | +---o o-+---|___|-+---+-------------+-|___|-+
10k | | | VCC | | | | | |
'-' T3 | | + | .-------. .-------. | .------.
| --- | | | | | 3 2 | |11 12| +----|2 |
+--+--+o o-------+ | | 5 | | 9 | +--|1,3,5 |
| | | | | '-------' '-------' | | |
.-..-. | | | | IC1 | === | |
R5| || |R6 | | +---+ | 74HC74 | GND | |
10k || |10k| | | | +------------|6 E |
'-''-' | | | +----------------------|4 RS |
| | |/ | | | | |
| +--| | .-------. | |
| |> | | 8 1,2| | |
| TS1 | | VCC| 3|--------------------|7 D0 |
| ===| + | 4|--------------------|8 D1 |
| GND| | | 5|--------------------|9 D2 |
| | +-|9 6|--------------------|10 D3 |
| |/ | 10|--------------------|11 D4 |
+-------| | 11|--------------------|12 D5 |
|> | 12|--------------------|13 D6 |
TS2 | | 13|--------------------|14 D7 |
=== '-------' '------'
GND IC2 74HC164 DISPLAY

PIC Miniterminal

vom PIC

_CK V V _DT
| |
| +-----+
| | |
| | |
+----+-------------+ VCC
| | | | | + .--------.
| .-------. .-------. | | |
| | 3 2 | |11 12| +--|2 |
| | 5 | | 9 | +--|1,3,5 |
| '-------' '-------' | | |
| | IC1 | === | |
+----+ | 74HC74 | GND | |
| | +---------------|6 E |
| +-------------------------|4 RS |
| | | |
.-------. | |
| 8 1,2| | |
VCC | 3|-----------------------|7 D0 |
+ | 4|-----------------------|8 D1 |
| | 5|-----------------------|9 D2 |
+--|9 6|-----------------------|10 D3 |
| 10|-----------------------|11 D4 |
| 11|-----------------------|12 D5 |
| 12|-----------------------|13 D6 |
| 13|-----------------------|14 D7 |
'-------' '--------'
IC2 74HC164 DISPLAY


; Test programm for display with 2-pin serially connection
LIST P=12F629
include "P12F629.inc" ; 4.000 MHz internal clock
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
#define _DT GPIO,0 ; display data line
#define _CK GPIO,1 ; display clock line
#define _C STATUS,C
DTemp EQU 0x20
DTemp1 EQU 0x21
DTemp2 EQU 0x22
DTemp3 EQU 0x23
ORG 0x0000
call Init
Main call FstLine
movlw 0x01
call ValLCD
movlw 0x23
call ValLCD
movlw 0x45
call ValLCD
movlw 0x67
call ValLCD
movlw 0x89
call ValLCD
movlw 0xAB
call ValLCD
movlw 0xCD
call ValLCD
movlw 0xEF
call ValLCD
call SndLine
movlw 0xFE
call ValLCD
movlw 0xDC
call ValLCD
movlw 0xBA
call ValLCD
movlw 0x98
call ValLCD
movlw 0x76
call ValLCD
movlw 0x54
call ValLCD
movlw 0x32
call ValLCD
movlw 0x10
call ValLCD
goto Main
FstLine movlw 0x80
goto CmdLCD
SndLine movlw 0xC0
CmdLCD movwf DTemp2
bcf _C ; clear RS
goto SendLCD
ValLCD movwf DTemp1 ; display value (00-FF)
swapf DTemp1,0
call NumLCD
movf DTemp1,0
NumLCD andlw 0x0F ; display number (0-F)
movwf DTemp
movlw 0x0A
subwf DTemp,0
btfsc _C
addlw 7
addlw 0x3A
CharLCD movwf DTemp2 ; display ASCII character
bsf _C ; set RS
SendLCD bcf _CK ; clear display enable
bcf _DT
bsf _DT
movlw 9
movwf DTemp
SerSend bcf _CK ; send a byte+RS
bcf _DT
btfsc DTemp2,7
bsf _DT
bsf _CK
rlf DTemp2,1
decfsz DTemp,1
goto SerSend
bcf _DT ; set display enable
bsf _DT
return
Init movlw 7 ; set comparator off
movwf CMCON ; and RA0-3 to digital I/O
bsf STATUS, RP0 ; bank1
bcf OPTION_REG,7 ; enable pull-ups
movlw 0xFC ; set GP5 to GP2 as inputs
movwf TRISIO ; and set GP0 and GP1 as outputs
call 0x3FF ; call calibration value
movwf OSCCAL ; calibrate internal RC oscillator
bcf STATUS, RP0 ; bank 0
movlw 0x38 ; 8 bit, 2 lines , 5x7 dots
call CmdLCD
movlw 0x0C ; display on, cursor off, no blink
call CmdLCD
movlw 6 ; increment, no shift
goto CmdLCD
END

ASUR0
31.07.2011, 16:55
Hi, nette und praktische Idee, aber
wäre die ganze Sache mit einem 8-bit - I2C-Portexpander (PCF8574) nicht einfacher?
Dazu müsste zwar das Display im 4-bit-Modus ansteuerbar sein, aber das sind die meisten. (zumindest HD44780)
Man müsste im Prozessor nur einen Software-I2C-Master implementieren (es gibt vorgefertigte Libs), und kann dann auch beliebige zwei Prozessorpins benutzen.
Insgesamt wäre der Hardwareaufwand deutlich geringer, von den 8 Ports können 6 direkt mit dem Display verbunden werden (4*Daten , EN und RS) und 2 blieben für die Tasten, die man beim PCF8574 auch direkt anschließen kann. Man benötigt eigentlich nur den Stromanschluss und Pull-Ups für I2C, was aber schnell gemacht ist.
Gruß
ASUR0

Kampi
31.07.2011, 17:22
Hi, nette und praktische Idee, aber
wäre die ganze Sache mit einem 8-bit - I2C-Portexpander (PCF8574) nicht einfacher?
Dazu müsste zwar das Display im 4-bit-Modus ansteuerbar sein, aber das sind die meisten. (zumindest HD44780)
Man müsste im Prozessor nur einen Software-I2C-Master implementieren (es gibt vorgefertigte Libs), und kann dann auch beliebige zwei Prozessorpins benutzen.
Insgesamt wäre der Hardwareaufwand deutlich geringer, von den 8 Ports können 6 direkt mit dem Display verbunden werden (4*Daten , EN und RS) und 2 blieben für die Tasten, die man beim PCF8574 auch direkt anschließen kann. Man benötigt eigentlich nur den Stromanschluss und Pull-Ups für I2C, was aber schnell gemacht ist.
Gruß
ASUR0

Beim I²C wird es dann aber mit den 3 Tastern schwer :)
Aber ansonsten ist das eine super Idee :)

Richard
01.08.2011, 10:29
Beim I²C wird es dann aber mit den 3 Tastern schwer :)
Aber ansonsten ist das eine super Idee :)

Nicht wenn man die mittels verdrahtetem OR an die 2 übrigen PIN's anschließt, dann können es auch 3 Taster sein.

Gruß Richard

ASUR0
02.08.2011, 06:36
Nicht wenn man die mittels verdrahtetem OR an die 2 übrigen PIN's anschließt, dann können es auch 3 Taster sein.


So ist es natürlich auch möglich...

Die Idee ist übrigens schon an meinem ASURO real erprobt:
https://www.roboternetz.de/community/showthread.php?52272-I2C-ohne-Verzicht-auf-Liniensensoren-Minimallösung

Außerdem habe ich mir aus einem Kinderlerncomputer von Ravensburg die Tastatur "geklaut" und habe mit 2 Expandern das 10x6 Matrix ansteuern können. Alles klappt bis auf Phantom Keys (http://de.wikipedia.org/wiki/Tastatur#Key_Rollover) :)

Wenn Ihr daran interessiert seid könnt ich ein paar Bilder hochladen

Gruß ASUR0