.NOLIST .INCLUDE "m8def.inc" ; typ procesoru .LIST .CSEG ;kódový segment .DEF REG=R16 ;pracovní registr R16 pojmenuje "REG" .EQU DDR=DDRD ;řízení směru .EQU PORT=PORTD ;port D pojmenuje "PORT" LDI REG,$FF OUT DDR,REG ;aktivuj výstupy LDI REG,LOW(RAMEND) OUT SPL,REG ;nastav SP na konec SRAM LDI REG,HIGH(RAMEND) OUT SPH,REG ;nastav SP na konec SRAM CLC ;0 do D LDI REG,0b00000000 ; pracovní registr LDI R21,0b00000000 ;šířka pulzu LDI R22,0b00000111 ;POČET JEDNIČEK=DÉLKA HADA !!! LDI R23,0b00000000 ;trvale 0 LDI R24,150 ; NASTAVUJE RYCHLOST !!! MOV R20,R24 ;počítadlo SMYCKA: SMYCKA1: OUT PORT,R22 ;zobrazí MOV R21,R20 ;kopíruje RCALL CEKEJ ;čeká dobu přímo úměrnou R21 MOV REG,R22 ;kopíruje R22 do REG ROL REG ;rotuje REG ADC REG,R23 ;.... OUT PORT,REG ;zobrazí MOV R21,R24 ;kopíruje SUB R21,R20 ;odčítání RCALL CEKEJ ;počkej DEC R20 ;změnší šířku pulzu o 1 krok BRNE SMYCKA1 ;vrací do smyčky, dokud nen R20=0 ROL R22 ;posune o1 led(bity R22 se posnou doleva) ADC R22,R23 ;přičte R23 do R22 MOV R20,R24 ;kopíruje R24 do R20 RJMP SMYCKA ;nekonečná smyčka (přeskočí na SMYCKA:) ;č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