.NOLIST .INCLUDE "tn13def.inc" .LIST .CSEG ;kódový segment .DEF REG=R16 ;pracovní registr .EQU DDR=DDRB ;řízení směru .EQU PORT=PORTB ;port LDI REG,0b11111111 OUT DDR,REG ;aktivuj výstupy LDI REG,LOW(RAMEND) OUT SPL,REG ;nastav SP na konec SRAM LDI REG,HIGH(RAMEND) CLC ;0 do C LDI REG,0b00000001 LDI R21,0 LDI R22, 200 ;ZDE SE NASTAVÍ RYCHLOST (max.255) ;větší číslo = pomalejší MOV R20,R22 SMYCKA: SMYCKA1: LDI REG,0b00010000 OUT PORT,REG MOV R21,R20 RCALL CEKEJ ;počkej LDI REG,0b00001000 OUT PORT,REG MOV R21,R22 SUB R21,R20 RCALL CEKEJ ;počkej DEC R20 BRNE SMYCKA1 MOV R20,R22 SMYCKA2: LDI REG,0b00001000 OUT PORT,REG MOV R21,R20 RCALL CEKEJ ;počkej LDI REG,0b00000100 OUT PORT,REG MOV R21,R22 SUB R21,R20 RCALL CEKEJ ;počkej DEC R20 BRNE SMYCKA2 MOV R20,R22 SMYCKA3: LDI REG,0b00000100 OUT PORT,REG MOV R21,R20 RCALL CEKEJ ;počkej LDI REG,0b00010000 OUT PORT,REG MOV R21,R22 SUB R21,R20 RCALL CEKEJ ;počkej DEC R20 BRNE SMYCKA3 MOV R20,R22 RJMP SMYCKA ;a znovu ;čekací rutina (čeká asi 0,5 s) CEKEJ: MOV R17,R21 ;R21 zde určuje čekací dobu. ;nahrává se do R17 i 18 a tím ;vytváří kvadratickou závislost, ;která vypadá lépe než lineární INC R17 ;zvýší o 1 (nutné, aby se tam nedostala nula) MOV R18,R21 ;...R21 je zde určuje čekací dobu INC R18 ;zvýší o 1 (nutné, aby se tam nedostala nula) CEKEJA: DEC R18 ;sníží o 1 BRNE CEKEJA ;smyčka #1 (pokud Carry není nula, ;znamená to, že R18 je nulový, a ;skočí na CEKEJA:) MOV R18,R21 ;...R21 zde určuje čekací dobu DEC R17 ;sníží o 1 BRNE CEKEJA ;smyčka #2 ... RET ;návrat