;Алгоритм сканирования кнопок на одном порте.Нажимая кнопки будет загораться светодиод.
.include "tn2313def.inc"
.list
.def     temp=r16
.def     count=r17
.def     k=r18
.def     j=r19
         .cseg
         .org    0
         ldi     temp,ramend
         out     spl,temp
         ldi     temp,0x80
         out     acsr,temp
         ldi     temp,1
         out     ddra,temp
         ldi     temp,0
         out     porta,temp
         out     ddrd,temp
         ldi     temp,255
         out     portd,temp
main:    clr     count      ;будем очищать этот регистр все время
         ldi     temp,0     ;выключаем светодиод
         out     porta,temp ;на порте А
         in      temp,pind  ;читаем кнопки
check:   lsr     temp       ;сдвигаем бит вправо
         brcc    proc       ;проверяем бит переноса в SREG
;если например нажали первую кнопку-000 0001,то при сдвиге в право
;эта единица попадёт с бит переноса и при проверке мы попадём на
;метку proc,если нажали вторую кнопку-000 0010,то будем увеличивать
;на единицу count
         inc     count
         cpi     count,7    ;сравниваем count с числом 7
         brne    check      ;если ещо не 7 сдвигаем temp есчо на 1
         rjmp    main       ;и всё заново
proc:    ldi     temp,1     ;включаем светодиод
         out     porta,temp
         rcall   delay      ;немного задержки
         rjmp    main       ;и опять на сканирование кнопки
delay:   ldi     j,255
jloop:   ldi     k,255
kloop:   dec     k
         brne    kloop
         dec     j
         brne    jloop
         ret

 

 

 

 

НАЗАД                  Assembler PIC                  Си AVR                  ДАЛЬШЕ