Консультация № 182934
25.04.2011, 02:57
55.00 руб.
0 11 1
Здравствуйте, уважаемые эксперты! Прошу помощи в следующем вопросе:
Установить заданный разряд 2-байтового слова в 1 или 0. Исходными данными являются адрес слова и команда, расположенные во внешнем ОЗУ. Формат команды: 0 разряд - значение бита, 1-4 разряды - номер бита. ОМК Intel 8051.
P.S. Преподаватель подсказал, что задачу можно решить тремя способами: с помощью масок, с помощью сдвигов и с помощью проверки "больше или меньше 7", чтобы определить в старшем или младшем байте находится заменяемый элемент. вроде так.
вот ссылка на "URL >> АРХИТЕКТУРА И ПРОГРАММИРОВАНИЕ ОДНОКРИСТАЛЬНЫХ МИКРОКОНТРОЛЛЕРОВ MCS-51/52http://depositfiles.com/files/om2ud9mmw

Обсуждение

Неизвестный
26.04.2011, 10:56
общий
Не видел кнопки "прикрепить". Прикрепил doc по 8051 и то, что сам пытался написать. Помогите пожалуйста, ну очень надо..
Прикрепленные файлы:
33cc71aa2773f0705afabc9418244f49.zip
давно
Посетитель
7438
7205
26.04.2011, 11:06
общий
Сделаем, не переживайте. Подождите немного. Всему свое время.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
26.04.2011, 11:49
общий
Задачу решать любым способом или всеми тремя?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.04.2011, 12:04
общий
одним, желательно со сдвигом, он вроде более понятен для нас
давно
Посетитель
7438
7205
26.04.2011, 13:05
общий
это ответ
Здравствуйте, Никита Владимирович!
Вот и программа... Идея такая:
1) сдвинаем вправо слово "номер бита" раз так, чтобы нужный бит оказался нулевым в младшем байте
2) вставляем новое значение бита
3) сдвигаем слово обратно, чтобы все встало на те же места
Если что не понятно, обращайтесь...

Код:

ljmp start
Org 100h
start:
mov sp, #60h
mov dptr, #00h
movx a, @dptr ;младший байт
mov 20h, a ;чтобы иметь возможность адресовать биты
inc dptr
movx a, @dptr ;старший байт
mov 21h, a
inc dptr
movx a, @dptr ;номер бита (1-4), бит (0)
mov 22h, a

rrc a ;номер бита 0-7
mov r2, a ;сохраним как счетчик
jz SetBit ;если бит 0, то на установку бита
mov r3, a ;дубль счетчика, он нам еще понадобится

RightLoop: ;цикл сдвига двойного слова вправо так,
; чтобы нужный бит оказался на месте 0 бита
mov c, 20h.0 ;младший бит младшего байта
mov a, 21h ;ст байт
rrc a ;сдвиг вправо, acc.7 = мл биту мл слова,
; С = мл биту ст байта
mov 21h, a ;сохраним
mov a, 20h ;мл байт
rrc a ;сдвиг вправо, acc.7 = мл биту ст байта (из C)
;мл бит теряем (не нужен)
mov 20h, a ;сохраняем
djnz r3, RightLoop ;сдвинаем "номер бита" раз

SetBit: ;установка бита 0 в младшем байте
mov c, 22h.0 ;новое значение бита
mov a, 20h ;изменяемый байт
mov acc.0, c ;устанавливаем
mov 20h, a ;сохраняем

;вернем слово на место
mov a, r2 ;счетчик сдвигов
jz SaveData ;если бит 0, то сдвигать не надо
LeftLoop: ;цикл сдвига влево
mov c, 21h.7 ;ст бит ст байта
mov a, 20h ;мл байт
rlc a ;сдвиг влево, acc.0 = ст биту ст слова,
; С = ст биту мл байта
mov 20h, a ;сохраняем
mov a, 21h ;ст байт
rlc a ;сдвиг влево, acc.0 = стл биту мл байта (из C)
;ст бит теряем (не нужен)
mov 21h, a ;сохраняем
djnz r2, LeftLoop ;сдвинаем "номер бита" раз

SaveData: ;сохраним во внешней памяти
mov dptr, #00h
mov a, 20h
movx @dptr, a
inc dptr
mov a, 21h
movx @dptr, a

Wait: ;бесконечный цикл
jmp Wait

End
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
29.04.2011, 23:11
общий
29.04.2011, 23:12
Здравствуйте, спасибо за код, но непонятно, почему по завершению работы программы во внутренней памяти остаются исходные значения, должны ведь быть измененные?
давно
Посетитель
7438
7205
30.04.2011, 00:02
общий
Чем смотрите? Если под отладчиком, то как там меняется в процессе работы?
По мне, так все должно работать правильно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.04.2011, 11:14
общий
Cмотрим по шагам. Сначала меняет слово, а потом программа записывает исходные значения заново. И получается, что в итоге ничего не меняется
давно
Посетитель
7438
7205
30.04.2011, 11:22
общий
Невероятно...
Тогда скажите, в какой момент? Какими командами?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
04.05.2011, 13:01
общий
04.05.2011, 13:24
Адресаты:
Оказывается, он просто делает сдвиг вправо, заходит в savedata, а затем обратно сдвигает влево. в setbit вообще не заходит почему то
давно
Посетитель
7438
7205
05.05.2011, 10:33
общий
Здравствуйте.
Специально поставил Keil. Прошагал - все работает!
Покажите свой исходник, может что-то подпортилось...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа