Светодиоды
СхемаТекст программы микроконтроллера
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.cseg
.org 0
.def tmp = r16 ;временная
.def a1 = r17 ;номер алгоритма
.def tm = r18 ;временная
.def tmp2 = r20 ;сдвиговая последовательность
rjmp RESET
RESET: ldi tmp,HIGH(RAMEND) ;определение начала стека
out SPH,tmp ;в ОЗУ
ldi tmp,LOW(RAMEND)
out SPL,tmp
ser tmp ;установить tmp (= $ff)
out PORTD,tmp ;установить на всех линиях порта D ВЫСОКИЕ уровни
out DDRA,tmp ;линии порта A - выходы на светодиоды
out PIND,tmp ;эта операция только для отладчика AVR Studio
ldi tmp,15 ;инициализация сторожевого таймера:
out WDTCR,tmp ;при отсутствии команды сброса (wdr)
;в течение 2 с произойдет переход на прерывание RESET
clr tmp ;очистить регистр tmp (= 0)
out DDRD,tmp ;линии порта D - кнопки
out PORTA,tmp ;откл. светодиоды
;начальные значения регистров
ldi XL,low(900) ;загрузка в XH:XL константы 65000
ldi XH,high(900)
ldi tmp2,0b10000000 ;регистр tmp2 = 0b10000000
ldi a1,1
;=====================================================
;опрос кнопоки
;=====================================================
key: wdr ;cброс сторожевого таймера
sbis PIND,PD5 ;если кнопка Next нажата
rcall NextA ;вызвать NextA
rcall Alg ;вызвать Alg
rjmp key ;если нет на метку key
;=====================================================
;установка алгоритма управления
;=====================================================
NextA:
s1: cpi XL,0
brne next1 ;если XL<>0 на метку next1
ldi XL,low(900)
ldi XH,high(900)
inc a1
rcall StartSet ;начальные значения для алгоритмов
cpi a1,6 ;если t1<>10
brne next1 ;то перейти на метку next1
ldi a1,1 ;если нет, то a1=1
next1:
sbiw XL,1
breq s1 ;если XL=0 на метку s1
ret
StartSet:
cpi a1,1 ;сравнение a1 c 1
breq m1 ;если a1 = 1 то перейти на метку m1
cpi a1,2 ;сравнение a1 c 2
breq m2 ;если a1 = 2 то перейти на метку m2
cpi a1,3 ;сравнение a1 c 3
breq m3 ;если a1 = 3 то перейти на метку m3
cpi a1,4 ;сравнение a1 c 4
breq m4 ;если a1 = 4 то перейти на метку m4
cpi a1,5 ;сравнение a1 c 5
breq m5 ;если a1 = 5 то перейти на метку m5
m1: ldi tmp2,0b10000000
rjmp ex2
m2: ldi tmp2,0b00000001
rjmp ex2
m3: ldi tmp2,0b00011000
rjmp ex2
m4: ldi tmp2,0b10000000
ldi tm,1
rjmp ex2
m5: ldi tmp2,0b10000000
ex2:
ret
;=====================================================
;вывод на светодиоды
;=====================================================
Alg:
rcall ms ;задержка
rcall ms
rcall ms
rcall ms
rcall ms
;определение алгоритма вывода
cpi a1,1 ;сравнение a1 c 1
breq x1 ;если a1 = 1 то перейти на метку x1
cpi a1,2 ;сравнение a1 c 2
breq x2 ;если a1 = 2 то перейти на метку x2
cpi a1,3 ;сравнение a1 c 3
breq x3 ;если a1 = 3 то перейти на метку x3
cpi a1,4 ;сравнение a1 c 4
breq x4 ;если a1 = 4 то перейти на метку x4
cpi a1,5 ;сравнение a1 c 5
breq x5 ;если a1 = 5 то перейти на метку x5
;алгоритм 1
x1:
cpi tmp2,0 ;если в регистре 0-й бит <> 1
brne x11 ;то на метку x11
ldi tmp2,0b10000000 ;то tmp2 = 0b10000000
x11: out PORTA,tmp2 ;вывод на светодиоды
lsr tmp2 ;сдвиг tmp2 вправо
rjmp ex
;алгоритм 2
x2:
out PORTA,tmp2
cpi tmp2,128
brne x22
ldi tmp2,0b00000001
rjmp ex
x22: lsl tmp2 ;сдвиг tmp2 влево
rjmp ex
;алгоритм 3
x3:
cpi tmp2,0b00011000 ;шаг 1
brne x31
out PORTA,tmp2 ;вывод на светодиоды
ldi tmp2,0b00100100
rjmp ex
x31:
cpi tmp2,0b00100100 ;шаг 2
brne x32
out PORTA,tmp2 ;вывод на светодиоды
ldi tmp2,0b01000010
rjmp ex
x32:
cpi tmp2,0b01000010 ;шаг 3
brne x33
out PORTA,tmp2 ;вывод на светодиоды
ldi tmp2,0b10000001
rjmp ex
x33:
cpi tmp2,0b10000001 ;шаг 4
brne x34
out PORTA,tmp2 ;вывод на светодиоды
ldi tmp2,0b00011000
x34: rjmp ex
;алгоритм 4
x4:
cpi tmp2,0
breq x41
cpi tm,0
breq x41
rjmp x1
ldi tm,1
rjmp ex
x41:
cpi tmp2,128
breq x42
cpi tmp2,0
brne x43
ldi tmp2,0b00000010
clr tm
x43: rjmp x2
x42: ldi tm,1
rjmp x1
rjmp ex
;алгоритм 5
x5:
cpi tmp2,255
brne x51
out PORTA,tmp2
ldi tmp2,0b10000000
rjmp ex
x51: out PORTA,tmp2
mov tm,tmp2
lsr tmp2
or tmp2,tm ;сдвиг tmp2 вправо
rjmp ex
ex:
ret ;возврат из подпрограммы
;=====================================================
;Подпрограмма задержки для светодиодов
;=====================================================
ms: wdr ;сброс сторожевого таймера
ldi YL,low(10000)
ldi YH,high(10000)
d05: wdr
sbiw YL,1
brne d05
ret
Скачать файлы проекта для AVR Studio 4 (7,27 КБ)