Upravil som tvoj program do "kultivovanejsej podoby", nehnevaj sa, ale bolo tam vela chybco sa tyka dodrziavania urcitych pravidiel pri pisani programov pre 8051 (zrejme pre AT89C2051, AT89C51, AT89S51 atd)
prikladam upraveny program: podstata je v tom, ze v obsluhe prerusenia od INT0 (zostupa hrana) sa zvysuje hodnota registra r4, pricom sa este porovnava s konstantou #4 (maximum), ak ju dosiahne, tak znova nastavi register na hodnotu #1. V hlavnom slucke sa testuje obsah registra r4 a na zaklade zistenej hodnoty sa vola prislusny podprogram (v tvojom pripade konkretny efekt), po vykonani podprogramu sa dokonci testovanie cely cyklus sa opakuje odznova...
Predpokladam, ze budes pripajat na vyvod INT0 tlacidlo, pricom program nie je osetreny voci zakmitom (pri stlacani tlacidla),
Kód: Vybrat vše
; program pre 8051 "Efekt"
;
$MOD51 ; mod prekladaca
;
cseg ; programovy segment
ORG 0h ;adresa po resete
sjmp start
ORG 003H ; prerusenie od int0
ajmp ext_prerus_0
;
;-----------------------------
org 30h ;
start: SETB IT0
SETB EX0 ; povolenie prerusenia od int0
SETB EA ; povolenie global. prerusenia
MOV R4,#1 ; zacneme prvym efektom
;JMP EFEKT1
;---------------------
; hlavna slucka
main: CJNE R4,#1, VYBER2
acall EFEKT1
VYBER2: CJNE R4,#2, VYBER3
acall EFEKT2
VYBER3: CJNE R4,#3, VYBER4
acall EFEKT3
VYBER4: sjmp main ; a znova na zaciatok
;------------------------
; ---------------------------------
; podprogramy pre jednotlive efekty
;----------------------------------
;efekt 1
EFEKT1: CLR P1.1
CLR P1.0
acall CAKAJ
SETB P1.1
SETB P1.0
acall CAKAJ
ret ; a naspat z podprogramu
;---------------------------
; efekt 2
EFEKT2: CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
ret
;---------------------------
; efekt 3
EFEKT3: CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
CLR P1.1
acall CAKAJ
SETB P1.1
acall CAKAJ
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
CLR P1.0
acall CAKAJ
SETB P1.0
acall CAKAJ
acall CAKAJ
ret
;-------------------------------------
;podprogramy oneskorenia
CAKAJ: DJNZ R1,$
DJNZ R2,$
RET
;-------------------------------------
; (tak sa zda, ze ho ani nepouzivas!)
CAKAJ2: MOV R3,#15
DJNZ R1,$
DJNZ R2,$-2
DJNZ R3,$-4
ret
;-------------------------------------
; obsluha prerusenia od int0
;-------------------------------------
;- pri kazdom preruseni sa zvysi hodnota v r4 a ak dosiahne hodnotu #4, tak nastavi prvy efekt r4=1
ext_prerus_0: inc r4 ; dalsi efekt
cjne r4, #4, ext_prerus_0_end
mov r4,#1 ; prvy efekt
ext_prerus_0_end: reti ; a von z obsluhy prerusenia
;------------------------------------
END