lcd -> 7 segment

is het mogelijk om de data (bv temperatuur) op n lcd over te zetten naar n 4voudig 7segments display?

Arco

Special Member

Kan altijd. Hoe eenvoudig of gecompliceerd het is hangt van het type lcd display af...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

LCD met een HD44780 chip, dus eigenlijk een van de meest gebruikte LCD's

de 4voudige 7segments display is de 5643a6-1

Arco

Special Member

Je zult dan wel een keuze moeten maken welke 4 digits van het 16x2 lcd je op dat display wilt hebben. Heel erg simpel wordt het niet...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

ik ben n beginner, dus niet veel ervaring, maar van het lcd gebruik ik meestal de hoogste 4 datapoorten d4 tm d7

verder gaat het dus om normale cijfers, 0 tm 9 plus het -teken

Het lijkt me voor b.v. getallen met met een microcontroller goed te doen, maar als je toegang hebt tot de software die het LCD aanstuurt is het eenvoudiger van daar uit te werken.

Arco

Special Member

Nee, het gaat om welke posities je wilt zien. (dat display heeft er 32; je kunt er maar 4 tonen uiteraard...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

sorry dat ik het verkeerd begreep, ik kan elke positie nemen die ik wil, kan die zelf aanpassen
bv regel 1 en eerste 4 posities

lcd is trouwens een 2004

Arco

Special Member

Als je dat lcd zelf aanstuurt, kun je toch beter de led displays ook direct uit de µC aansturen zoals @Aart al aangeeft?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 8 maart 2018 13:28:56 schreef Aart:
Het lijkt me voor b.v. getallen met met een microcontroller goed te doen, maar als je toegang hebt tot de software die het LCD aanstuurt is het eenvoudiger van daar uit te werken.

ik gebruik de software, die Frits Kiefs hier ooit eens heeft geplaatst voor n lcd

Arco

Special Member

Die kun je toch veranderen voor led displays? (link naar de betreffende firmware zou handig zijn)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

https://www.circuitsonline.net/forum/view/101527#highlight=ds1820

DEVICE 16F628A ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal

;Normale constanten
SYMBOL Convert = $44 ;DS1820 commando, de DS1820 moet de temperatuur gaan meten
SYMBOL Graad = 223 ;223 is de ASCII code voor het 'graad' karakter
SYMBOL RdScratchPad = $BE ;DS1820 commando, temperatuur van de DS1820 uitlezen
SYMBOL SkipROM = $CC ;DS1820 commando, geen gebruik maken van het unieke adres

;Logische constanten
SYMBOL FALSE = 0
SYMBOL TRUE = 1

;Poortnamen
SYMBOL DS1820 = PORTA.0 ;Sluit de DS1820 temperatuur sensor aan op deze poort

;Variabelen declareren
;WORD
DIM Temp AS WORD ;Bevat de temperatuur Celsius
;BYTE
DIM Remain AS BYTE ;De remain waarde voor berekening temperatuur achter de komma
DIM Slope AS BYTE ;Bevat de 'counts per graad Celsius' waarde
DIM TempDeci AS BYTE ;Bevat de temperatuur waarde "achter de komma"
DIM BD1 AS BYTE ;Byte Dummy 1
;BIT
DIM NegTemp AS BIT ;TRUE als temperatuur Celsius onder 0 oC komt

CLEAR ;Wis RAM geheugen

DELAYMS 500 ;LCD stabilisatie

;Hoofdprogramma
CLS ;Wis LCD scherm
PRINT "Temp:" ;Plaats eerst deze tekst op het display
WHILE 1 = 1
OWRITE DS1820, 1, [SkipROM, Convert] ;Zend 'Calculate Temperature' opdracht
OWRITE DS1820, 1, [SkipROM, RdScratchPad] ;Zend 'Read ScratchPad' opdracht
OREAD DS1820, 2, [Temp.LOWBYTE, Temp.HIGHBYTE, BD1, BD1, BD1, BD1, Remain, Slope] ',CRC]

NegTemp = Temp.8 ;Als bit 8 (het 9e bit) geset is, dan is temperatuur negatief
TempDeci = ((Slope - Remain) * 100) / Slope
Temp = Temp * 5

IF NegTemp = TRUE THEN ;Als de temperatuur negatief is, dan...
Temp = 65530 - Temp ;De gemeten waarde Inverteren
TempDeci = 100 - TempDeci ;Ook de waarde achter de komma inverteren
IF TempDeci < 51 THEN TempDeci = TempDeci + 100
ENDIF

Temp = (((Temp + 550) / 10) * 100) + TempDeci - 5500 ;
PRINT AT 1, 7, REP "-"\NegTemp, DEC Temp / 100, ".", DEC2 Temp, Graad, "C "
WEND

Arco

Special Member

Zo simpel als met een LCD gaat 't niet worden... (of er moet voor picbasic iets van een library voor gemultiplexte 7 segments displays zijn)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

oke, bedankt, ik zie het al, dit gaat me te ver

Deze regel

code:

PRINT AT 1, 7, REP "-"\NegTemp, DEC Temp / 100, ".", DEC2 Temp, Graad, "C "

zal je moeten vervangen.

Ik kan picbasic niet, de PIC heb ik ook voor het laatst een jaar of 10 geleden mee gewerkt. Maar het idee blijft hetzelfde.
Ik kan geen displays vinden op het door jou genoemde nummer, maar ik gok dat het een common cathodeLED display is, zonder actieve driver.

Omdat ik picbasic niet ken schrijf ik hier wat pseudo code, die zal je op de een of andere manier moeten kunnen vertalen naar picbasic.

Stel dat je een poort B hebt waar op B0-B3 de anodes (via transistors) gekoppeld zijn. Op poort A zitten de segmenten gekoppeld (gewoon DP,G,F,E,D,C,B,A).

Je eerste taak is om te bepalen hoe je cijfers weergegeven moeten worden.

code:

 ---A---
|       |
|       |
F       B
|       |
|       |
 ---G---
|       |
|       |
E       C
|       |
|       |
 ---D---  [DP]

Het cijfer 1 bevat bijvoorbeeld alleen segmenten B en C, binair wordt dat dus 00000110, of hexadecimaal 0x06.
Doe dit voor alle cijfers en zet het in een array

code:

digits = [0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F]
minus = 0x80

Vervolgens moet je een voor een de digits aansturen, om ze allemaal even lang te laten branden kan je het beste een snelle main loop hebben en iedere iteratie één diigt aan sturen.

code:

digit = 3 ; voor de loop
if digit = 0 then
digit = 3
else
digit = digit - 1
endif

Nu zal digit telkens van 3 naar 2 naar 1 naar 0 naar 3 lopen.

Ten slotte zal je de waarde van je huidige digit moeten berekenen

code:

OUT A, 0 ; maak output leeg, ter voorkoming van "ghosting"
OUT B, 1 << digit ; zet het bit overeenkomend met deze digit aan
if digit = 3 then
if Temp < 0 then
OUT A, minus
endif
endif
if digit = 2 then
OUT A, digits[Temp/100 mod 10] ; mod voor modulo
endif
if digit = 1 then
OUT A, digits[Temp/10 mod 10]
endif
if diigt = 0 then
OUT A, digits[Temp mod 10]
endif

Hopelijk kan je hier iets mee.

Meep! Meep!

[Ik kan picbasic niet, de PIC heb ik ook voor het laatst een jaar of 10 geleden mee gewerkt. Maar het idee blijft hetzelfde.
Ik kan geen displays vinden op het door jou genoemde nummer, maar ik gok dat het een common cathodeLED display is, zonder actieve driver.

Omdat ik picbasic niet ken schrijf ik hier wat pseudo code, die zal je op de een of andere manier moeten kunnen vertalen naar picbasic.

dank je roadrunner84,
ik ben hier echt heel veel mee geholpen

Op 9 maart 2018 12:40:57 schreef Hedalen:
[...]

tis idd een common anode

dank je roadrunner84,
ik ben hier echt heel veel mee geholpen

Arco

Special Member

Voor fatsoenlijk multiplexen moet je een interrupt gebruiken, anders krijg je dat de leds onregelmatig branden...
Voorbeeld in assembly: https://www.circuitsonline.net/forum/view/message/1050109#1050109

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 9 maart 2018 12:46:39 schreef Arco:
Voor fatsoenlijk multiplexen moet je een interrupt gebruiken, anders krijg je dat de leds onregelmatig branden...
Voorbeeld in assembly: https://www.circuitsonline.net/forum/view/message/1050109#1050109

In de regel werkt dat wel het beste.
Alternatief kan je het prima opnemen in je hoofd programma als deze een (min of meer) constante looptijd per iteratie heeft. Daar maak ik in mijn oplossing gebruik van door iedere iteratie één digit weer te geven. Als er ten minste 200 iteraties per seconde zijn (wat erg realistisch is) dan zal je niet of nauwelijks merken dat er telkens maar één digit aangestuurd wordt.
Een tussenoplossing zou zijn om je hoofdlus telkens te laten wachten tot er een timer interrupt voorbij komt, dan zal de hoofdlus dus telkens even wachten als deze sneller loopt dan de interrupt. Nadeel is dat als de hoofdlus trager is dan de interrupt je het onregelmatige gedrag juist kan verargeren omdat je interrupts mist (net zoals je een half uur moet wachten als je net te laat bent voor de trein).

Meep! Meep!
Arco

Special Member

Dat gaat goed, totdat je toetsafhandeling moet gaan doen in main()
Dat resulteert op zijn gunstigst in onregelmatig branden tot stoppen van het multiplexen...
(of je moet een state machine gebruiken, maar da's meer werk als een interrupt...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com