Светодиоды 

Схема
  
 Текст программы микроконтроллера
 
.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 КБ)