Displej LED

Z MAM wiki

Verze z 7. 3. 2014, 11:28; Horcik (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

Displej na vývojové destičce je dvoumístný, se společnou anodou, tj. pro levou i pravou číslici na displeji jsou vždy anody všech LED tvořících segmenty jedné poloviny displeje spojeny dohromady a přes tranzistory Q2 a Q3 připojené na bity PC4 a PC5 brány C (log. 0 = svítí) je lze připojit k napájecímu napětí +Ucc destičky. Katody stejnojmenných segmentů obou polovin displeje jsou spojeny a jejich uzemněním (=log. 0) přes rezistory 330 Ohmů je lze rozsvítit, proud protékající rezistorem je cca 7 mA. Při aktivování obou společných anod současně se proud rozdělí mezi obě poloviny displeje a oba displeje zobrazují stejný symbol, obvykle aktivujeme v daném okamžiku jen jednu polovinu displeje a potom proud teče jedním segmentem. Pro zobrazení dvoumístného čísla potom využíváme dynamické řízení, tj. multiplexování obou polovin displeje, střídavé zapínání levé a pravé společné anody se současným přepínáním odpovídající kombinace na katodách pro rozsvícení znaku na levé nebo pravé polovině displeje.

Staticky lze ovládat a zobrazit jen jednu číslici (příp. stejnou na obou pozicích displeje), tvar symbolu je určen kombinací log. 0 a 1, pro elegantní a univerzálně použitelné řešení by měly být tvary zobrazitelných symbolů uloženy v tabulce, ze které je lze adresováním vybrat. Displej na destičce nevyužíva desetinnou tečku, segmenty a - g jsou připojeny k výstupům PB1 - PB7 brány B, bit PB0 má jiné využití. Rozsvícený stav je log. 0. Jistě lze vytvořit matici pro zobrazení segmentů přípo pro tyto parametry, je však špatně přehledná, přehlednější je spíš "univerzální" matice umístěná do bitů 0 - 6 a svícení indikovat log. 1, tedy např. pro zobrazení číslice 1 (svítí pouze segmenty b a c, tj. 2. a 3. segment displeje, ostatní zhasnuty) nepsat 0b11110010 = 0xF2, ale raději 0b00000110 = 0x06. Bezprostředně před odesláním matice k zobrazení na displej potom lze provést bitovou inverzi a posun na správnou pozici podle konkrétního hardware, tj. pro náš případ o jednu pozici vlevo.

K adresování tabulky a výběru znaků je určena instrukce LPM. LPM nahraje jeden byte programové paměti, na který ukazuje registrový pár Z, do cílového registru Rd. Instrukce má 3 varianty, s defaultním registrem R0, s určeným registrem Rd, případně s post inkrementací Z:

Mnemonics Operands Description Operation Flags #Clocks
LPM Load Program Memory R0 <-- (Z) None 3
LPM Rd, Z Load Program Memory Rd <-- (Z) None 3
LPM Rd, Z+ Load Program Memory and Post-Inc Rd <-- (Z), Z <-- Z+1 None 3

Registrový pár Z je 16bitový registr složený z R30 a R31, je schopen adresovat prvních 64Kbytů programové paměti. Ta je ale organizována po 16bitových slovech, 64 Kbytů je 32Kslov, nejnižší byte reg. Z potom rozlišuje dolní nebo horní byte 16bitového slova.

Příklad použití podle manuálu 8-bit AVR Instruction Set:

Example:
	ldi ZH, high(Table_1<<1)	; Initialize Z-pointer
	ldi ZL, low(Table_1<<1)
	lpm r16, Z 			; Load constant from Program Memory pointed to by Z (r31:r30)
...
Table_1:
	.dw 0x5876 	; 0x76 is addresses when ZLSB = 0
			; 0x58 is addresses when ZLSB = 1
...

kde high(Table_1<<1) je horní byte adresy tabulky Table_1 vynásobený 2 (posun o jedno místo doleva) pro převod adresy tabulky z rozsahu 64Kbytů na 32Kslova, totéž u low(Table_1<<1).

Pokud chceme adresu tabulky modifikovat, např. v našem případě podle zobrazované číslice 0-9, příp. hexadecimálně 0-F, použijeme kód číslice jako offset k Z, tedy 16bitově sečteme, např. podle tohoto postupu:

	clr R1		; Clear R1
	add ZL, znak	; Add offset (=number to display) to ZL (=R30)
	adc ZH, R1	; Why to add zero from R1??? - adc is add with the carry (from previous add)
	lpm R16, Z

Do tabulky potom umístíme matice znaků pro jednotlivé číslice vykreslené na sedmi segmentech:

Disp_table:
	.dw 0x063F 	; 0x3F is segment matrix for 0, 0b00111111 (segments Xgfedcba)
			; 0x06 is segment matrix for 1, 0b00000110
	.dw .... 	; Segment matrix for 3, 2

Na MAM wiki najdete další inspiraci, např. u Uživatel:Tulacjir.

Osobní nástroje