[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]