2.подсчитать количество импульсов между установкой из «1» в «0» на порту Р1.1 с помощью таймера/счетчика.
3.по нажатию клавиши произвести циклический сдвиг «1» по разрядам порта Р0
Код: Выделить всё
mov dptr, #80h ;начальный адрес массива
mov r0, #0 ;обнуляем счетчик кол-ва элементов массива
mov r4, #0 ;обнуляем
mov r5, #0 ;счетчики повторений
mov r6, #0 ;элементов
mov r7, #0 ;массива
metka:
mov a, r0 ;выбираем элемент массива
movc a, @a+dptr ;читаем элемент массива в аккумулятор
cjne a, #10, metka_1 ;проверяем элемент массива на равенство 10, если нет, то проверяем дальше
inc r4 ;элемент массива=10, поэтому r4=r4+1
jmp metka_5 ;уходим на проверку окончания цикла
metka_1:
cjne a, #20, metka_2 ;проверяем элемент массива на равенство 20, если нет, то проверяем дальше
inc r5 ;элемент массива=20, поэтому r5=r5+1
jmp metka_5 ;уходим на проверку окончания цикла
metka_2:
cjne a, #30, metka_3 ;проверяем элемент массива на равенство 30, если нет, то проверяем дальше
inc r6 ;элемент массива=30, поэтому r6=r6+1
jmp metka_5 ;уходим на проверку окончания цикла
metka_3:
inc r7 ;если элемент массива не равен 10, 20 и 30, значит он равен 180 и r7=r7+1
metka_5:
inc r0 ;выбираем следующий элемент массива
cjne r0, #16, metka ;если не достигли конца элементов массива, то цикл повторяем
nop
nop ; конец 1-й задачи
end Код: Выделить всё
org 80h ;указываем адрес начала массива
massiv: ; метка, необязательна
db 10, 20, 30, 180, 20, 30, 10, 30
db 180, 20, 20, 30, 10, 30, 180, 10 По 2-й задаче непонятки:Milady писал(а):2.подсчитать количество импульсов между установкой из «1» в «0» на порту Р1.1 с помощью таймера/счетчика.
3.по нажатию клавиши произвести циклический сдвиг «1» по разрядам порта Р0
Я бы посоветовал книгу: Она есть в сети, если не найдете, то скажите куда скинуть.Milady писал(а): как писать программы с таймером, какие для этого использовать команды. или где это подробно прочитать?а то нам ничего не объяснили, дали только задание.
Даже не знаю, - смеяться или плакать? Украинский технический, это нечто. В общем, ничего не понял.Milady писал(а):Вот пример программы. она похожая на мою немного
Уважаемая Миледи, насколько я понял, Вам требуется что-то типа такого:Milady писал(а):только последняя задача пока не решена. кнопка по идее тоже будет в симуляторе битом порта. нужно решить задачу через прерывание. его нужно настроить,и что-то в общем такое
Код: Выделить всё
; используем внешнее прерывание int0, у которого вход на выводе p3.2
; соответственно на p3.2 и подключаем кнопку, которая при нажатии выдает лог "0"
; используем прерывание по "срезу импульса", т.е. прерывание возникает не по
; лог. "0", а при переходе из лог. "1" в лог. "0", а затем нас этот "0" не волнует до
; следующего среза, т.е. кнопку надо будет отпустить, а потом еще раз нажать
; кнопку считаем идеальной. т.е. не создающей "дребезга"
org 0
jmp start
; задаем адрес вектора внешнего прерывания int0 (0003h)
org 3
jmp irr_0 ; переходим на обработку прерывания
start:
mov tcon, #00000001b ; устанавливает бит (it0="1") управления типом прерывания int0 (срез)
mov ie, #10000001b ; разрешаем прерывание int0 (бит ex0="1") и устанавливаем общее
; разрешение на прерывания (бит ea="1")
mov a, #00000001b ; уст. лог. "1" в младшем разряде аккумулятора
mov p0, a ; отправляем содержимое акк. в порт 0
wait0:
jmp wait0 ; далее зацикливаемся и ждем нажатия кнопки
; обработка прерывания, будем попадать сюда при каждом нажатии кнопки
irr_0:
rl a ; сдвигаем нашу единицу в акк. циклически влево на 1 разряд
mov p0, a ; отправляем содержимое акк. в порт 0
reti ; выходим из обработки прерывания
; все
end
Поздравляю!Milady писал(а):Итог защиты лабораторных- оценка 5В(то есть 5 с минусом)
Milady писал(а):PUSH ACC
PUSH PSW
PUSH B
PUSH DPL
PUSH DPH
Если в обработке прерывания эти регистры не используются, то нет смысла загонять их в стек и затем выталкивать обратно.Milady писал(а):POP DPH
POP DPL
POP B
POP PSW
POP ACC
Если используется только одно прерывание, то установка приоритета теряет смысл.Milady писал(а):mov ip, #00000001b
Установка флага прерывания tcon.1 происходит автоматически при вызове самого прерывания и сбрасывается также автоматически при его обработке. Установка программой tcon.1 (он же ie0) имеет смысл если вы хотите вызвать прерывание искусственно, т.е. не по входу (кнопке), а непосредственно из программы, что можно сделать к примеру командой setb ie0 в нужный момент.Milady писал(а):mov tcon,#00000011b
Порт p0 имеет выход на транзисторах с открытым стоком и при чтении его командой mov a, p0 будем иметь в аккумуляторе только нули. Чтобы этого избежать необходимо установить 8 резисторов на его выводы, примерно так как стоит у Вас на входе кнопки, т.е. на плюс питания. Обратите внимание, что в своей программе, я порт p0 не читал, а только выводил в него.Milady писал(а):Вот картинка работающей программы. только порт 0 поменян на порт 1. препод сказал, что там нужны какие-то дополнительные настройки для него.