Program pro ovládání 7-segmentového LCD pomocí 74HC595 v ASM

Zdravím.
Má někdo prográmek pro ovládání 7-segmentového displeje pomocí 74HC595 v assembleru?
Potřeboval bych zobrazit trojmístné číslo a dvojmístné číslo.
Jestli takový prográmek nikdo nemá, je někdo, kdo by mi ozřejmil algoritmus?

:arrow_right: administrator: přejmenováno z "Atmel - program pro 74HC595 v assembleru (ATmega16,…)"

To je trošku málo informací. Máš jednu trojmístnou a jednu dvoumístnou segmentovku. Nebo máš jednu trojmístnou a zobrazený údaj střídáš. Máš jednu 74595-ku pro všechny číslice nebo má každá číslice svojí, atd. Optimální by asi bylo přiložit zapojení displeje/displejů.

Já nevím, ale když to v asembleru neumíš naprogramovat, tak proč to v tom asembleru chceš.
C-čko udělá podobnou práci jen o trošku pomaleji, ale za to se v kodu vyznáš téměř vždycky, pokud to nenaprogramuješ opravdu prasecky.

Nebylo by lepší použít c?

Že by nejaké školské zadanie? :slight_smile:

Viděl bych to taky tak…

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Začal jsem používat 74HC595 pro ovládání maticového displeje…
(pro zájemce mám kód v C)

…teď jsem všechno zapojil (na předvrtané vývojové desce) a blikají mi všechny ledky současně.
otázka zní: Je chyba jinde a nebo se můžou 4 za sebou spojené 595 nějak rušit?

…obecně nevím, jak moc jsou rušením ovlivněny drátové propojky (průřez asi 0,5mm2, barevná izolace)…

Díky za tipy :wink:

Trochu málo informací. Z takovýho schématu zapojení by se dalo vyčíst mnohem víc. A v kombinaci s kódem by se asi i chyba dala najít …

Díky
Už mi to funguje :wink:
Možná sem v nejbližších dnech hodím DPS…nikdy jsem to pořádně nedělal, zajímaly by mě názory někoho zkušenějšího

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

[code];Zobrazí na třímístném 595 displeji čísla 1,2 a 3
;DATA (14) - Px.0
;SCLK (11)- Px.7
;RCLK (12)- Px.6
;ENABLE (13)- Px.3
;SCLR (10) - Px.4

	.DEVICE	ATMEGA162		;volba mikroprocesoru

	.LOFUSE	0B01100010		;nastaveni propojek a zamku
	.HIFUSE	0B11010001		;nastaveni propojek a zamku

;deklarace proměnných

	.DSEG				;datová část

;datový segment

	.EQU	PORT595	= PORTB		;port displeje 595
	.EQU	DDR595 = DDRB
	.EQU	PIN595 = PINB

	.ORG	SRAM_START		;deklarace od adresy 256

;proměnné vyhradíme 1 byt ( byt 256)

SEG0: .BYTE 1 ;promena pro segment 0 (JEDNOTKY)
SEG1: .BYTE 1 ;promena pro segment 1 (DESITKY)
SEG2: .BYTE 1 ;promena pro segment 2 (STOVKY)

;inicializace - zapnuti procesoru

	.CSEG				;programová část

INIT: LDI R16, LO(RAMEND) ;nastaví ukazatel zásobníku na nejvyšší adresu
OUT SPL, R16 ;paměti RAM. Při ukládání se SP dekrementuje
LDI R16, HI(RAMEND) ;SP je 16bitový registr
OUT SPH, R16
LDI R16, $FF ;do registru R16 data 255 (FF v HEX)
OUT DDR595, R16 ;nastaví celý port displeje jako výstupní
OUT PORT595, R16
LDI R20, 15 ;do R20 číslo 15 - zhasnutý displej
STS SEG0, R20 ;R20 do seg0
LDI R20, 15 ;do R20 číslo 15 - zhasnutý displej
STS SEG1, R20 ;R20 do seg1
LDI R20, 15 ;do R20 číslo 15 - zhasnutý displej
STS SEG2, R20 ;R20 do seg2
RCALL DISP595 ;volání podprogramu DISP595
RCALL DELAY ;volani zpoždení (pro efekt)

;***************** HLAVNI PROGRAM *********************************************

LOOP: LDI R20, 1 ;do R20 číslo 1
STS SEG0, R20 ;R20 do seg0
LDI R20, 2 ;do R20 číslo 2
STS SEG1, R20 ;R20 do seg1
LDI R20, 3 ;do R20 číslo 3
STS SEG2, R20 ;R20 do seg2
RCALL DISP595 ;volání podprogramu DISP595
RJMP PC ;zastaví program (nekonečná smyčka)

;*********** PODPROGRAMY ******************************************************

DISP595: LDS R20, SEG0 ;jednotky do R20
RCALL VYSLI ;převede R20 z BCD na kod pro sedmiseg. a vyšle
LDS R20, SEG1 ;desitky do R20
RCALL VYSLI ;převede R20 z BCD na kod pro sedmiseg. a vyšle
LDS R20, SEG2 ;stovky do R20
RCALL VYSLI ;převede R20 z BCD na kod pro sedmiseg. a vyšle
CBI PORT595, 6 ;RCK do log0
SBI PORT595, 6 ;nástupná hrana na RCK
NOP ;bez prikazu - kratke zpozdeni
NOP ;bez prikazu - kratke zpozdeni
NOP ;bez prikazu - kratke zpozdeni
NOP ;bez prikazu - kratke zpozdeni
CBI PORT595, 6 ;sestupná RCK
CBI PORT595, 3 ;EN do log.0
RET

VYSLI: LDI ZL, LO(2 * TAB595) ;do registru Z (16 bitový reg.) začátek tabulky registr 30
LDI ZH, HI(2 * TAB595) ;horni část tabulky registr 31
CLR R21 ;nulování R21
ADD ZL, R20 ;sečtení Z (16bitů) a reg R20 (dolní byt - naše číslo)
ADC ZH, R21 ;a R21 (horní byt - 0)
LPM R16, Z ;čtení z paměti programu z adresy Z
LDI R21, 8 ;nastaví R21 ( počítadlo )
VYS01: SBI PORT595, 0 ;nastaví data do log1
SBRS R16, 0 ;přeskočí následující instrukci je-li bit0 v R16 v log1 ( data zůstanou v log1)
CBI PORT595, 0 ;data do log0
CBI PORT595, 7 ;CLK do log0
SBI PORT595, 7 ;CLK do log1 - nástupná
ROR R16 ;rotuje R16 doprava (právě zde protože musí čekat )
NOP ;bez prikazu - kratke zpozdeni 1 str cyklus
NOP ;bez prikazu - kratke zpozdeni 1 str cyklus
NOP ;bez prikazu - kratke zpozdeni 1 str cyklus
CBI PORT595, 7 ;CLK sestupná
DEC R21 ;dekrementuje počítadlo
BRNE VYS01 ;pkud není 0 tak skočí na VYS01
RET

;********************* TABULKA DISPLEJE ***************************************
;_________________________HABCDEFG____HABCDEFG ________________________________

TAB595: .DB 0B00000001, 0B11001111 ;0,1
.DB 0B10010010, 0B00000110 ;2,3
.DB 0B11001100, 0B00100100 ;4,5
.DB 0B00100000, 0B10001111 ;6,7
.DB 0B10000000, 0B10000100 ;8,9
.DB 0B11110000, 0B11111110 ;t ,- (10,11)
.DB 0B10110001, 0B10011100 ;C ,stupen (12,13)
.DB 0B00000000, 0B11111111 ;rozsviceno,zhasnuto (14,15)

;********************* ZPOZDENI ***********************************************

DELAY: LDI R17, 20 ;do R17 číslo 20
DL1: LDI R18, 0 ;do R18 číslo 0 (256)
DL2: LDI R19, 0 ;do R19 číslo 0 (256)
DL3: DEC R19 ;dekrementace R19
BRNE DL3 ;není-li výsledek 0 skočí na DL3
DEC R18 ;dekrementace R18
BRNE DL2 ;není-li výsledek 0 skočí na DL2
DEC R17 ;dekrementace R17
BRNE DL1 ;není-li výsledek 0 skočí na DL1
RET

	.EXIT[/code]