вызов функции по нажатию кнопки и завершение функции по отпусканию кнопки и опять возврат к ожиданию нажатия...
при помощи чего это можно сделать?
я с ассемблером вот только начал рабоать....но сейчас могу только инитить порты, выводить на них и rjump .;метка и нужный код
;повторять опрос порта до тех пор, пока на нём не появится 1
;выполнить нужный код
;повторять опрос порта до тех пор, пока на нём не появится 0
;выполнить нужный код
;переход к метке
Puher писал(а): а вот как опрос первого (нулевого) пина порта D организовать?
Код: Выделить всё
wait_1_pind0:
sbis PinD, PD0 ; пропустить следующую команду, если на линии PortD.0 присутствует 1
rjmp wait_1_pind0 ; перейти к метке повторного опроса порта
; сюда попадаем, если PinD.0==1ну и естестьвенно упрощу это с помощью лупов?;\\\\\\\\\\\\\ИНИЦИАЛИЗАЦИЯ СТЕКА\\\\\\\\\\\\\\\
ldi Temp5,RamEnd
out SPL,Temp5
.
код
программы
.
.
.
.
.
;\\\\\\\\\\\\ОБЪЯВЛЕНИЕ ЗАДЕРЖЕК\\\\\\\\\
;задержка 0.1 сек
Delay01: ldi Temp2,0
ldi Temp3,0
ldi Temp4,10
Loop1: dec Temp2
brne Loop1
dec Temp3
brne Loop1
dec Temp4
brne Loop1
ret
;задержка 1 сек
Delay1: rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
ret
;задержка 3 сек
Delay3: rcall Delay1
rcall Delay1
rcall Delay1
ret
;задержка 5 сек
Delay5: rcall Delay1
rcall Delay1
rcall Delay1
rcall Delay1
rcall Delay1
ret
во-первых, стек никогда матюгаться не будетPuher писал(а):не будет ли матюгаться стек, если я просто вызову 10 раз подпрограмму задержки 0,1 сек в подпрограмме задержки 1 сек ?
Код: Выделить всё
Const Dqpin = 1
........
.........
Readbyte:
For I = 0 To 7 ' это понятно
L11:
sbis pinb, DqPin ' пропустить след. команду если на линии 1
' иначе не пропускать
rjmp L11 'перейти к метке опроса порта ( L11???)
Далее абсолютно обратное условие
L12:
sbic pinb, DqPin 'Если на линии 0 то пропустить, иначе вернутся к метке
rjmp L12 ' перейти к метке повторного опроса порта
Timer = 256 - T1reset
Start Timer0
и так 8 раз, а потом что-то еще делаемGP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
Так вот это и непонятно. Вы пишете если ноль , ждем 1 - дождались и что? Куда дальше пойдет программа - я так понял на метку L12, которая при наличии той же 1 будет возвращатся на свое начало и таймер не сработает.ARV писал(а):и так 8 раз, а потом что-то еще делаемGP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
Претензии принимаю. Но разобратся надо, просто скопировав код, я не смогу работать дальше, на все случаи кодов не найдешь.GP1 писал(а):
Ну и в-третьих: таймер сработает всегда, как только произойдет изменение состояния вывода DqPin.
Например:
на выше означеном пине 1, программа пропустит переход на L11, и зациклится на куске L12.
Как только состояние вывода поменяется на 0, программа перейдет на загрузку и запуск таймера.
Аналогично для 0.
Большое Вам спасибо. Моя голова зациклилась на том что все возвращается к L11 ( когда повторяется цикл от 1 до 8 ) а оказалочь что правильно - работает с того места где зациклилась т.е L12.GP1 писал(а):Ну да, так оно и есть.
Я подозреваю что это обработки какой-то кнопки.