- •Алматы 2011
- •1 Лабораторная работа №1. Байтовые и битовые команды. Логика
- •2 Лабораторная работа № 2.Маскирование. Суммирование массива
- •3 Лабораторная работа №3. Подпрограммы
- •4 Лабораторная работа №4. Умножение на дробное число
- •5 Лабораторная работа №5. Регулирование расхода газа
- •6. Лабораторная работа №6. Программирование клавиатуры
- •Фрагменты программы.
- •8 Лабораторная работа №8. Перевод чисел из 2-й в 2_10 систему.
- •9 Лабораторная работа №9. Таймер tmr1
- •10 Лабораторная работа №10. Прерывания
- •11 Лабораторная работа №11. Сложение двухбайтных чисел
- •Конец алгоритма
- •Конец алгоритма
- •Приложение а Регистр Status
- •Приложение б Описание инструкций мк pic
- •Приложение в Модуль таймера tmr1
- •Приложение г Карта памяти мк pic16877
- •Список литературы
- •0 50013, Алматы, Байтурсынова, 1
8 Лабораторная работа №8. Перевод чисел из 2-й в 2_10 систему.
Цель работы: научиться переводить числа из двоичной системы в двоично-десятичную систему, создание подпрограмм, возвращающих значение в вызвавшую программу.
Как правило, всегда выполняется индикация состояния технологического процесса на пульт оператора в цифровом или символьном виде. Простейший индикатор цифр имеет семь сегментов. Чтобы вывести числа из МК на такой индикатор их необходимо представить в двоично-десятичной системе счислений. В этой системе в одном регистре могут поместиться две десятичные цифры, каждая из которых будет занимать половину байта. От 00000000 до 00001001 в двоичной системе. Таким образом, в регистр можно записать две десятичные цифры и получить числа от 00 до 99.
Блок-схема алгоритма перевода частично приведена на рисунке 8.1.
Подпрограммы, которые мы применяли раньше, имели тип void, т.е. не возвращали никаких значений в вызвавшую их программу. Напишем подпрограмму, результатом работы которой будет передача однобайтного значения в вызвавшую программу. Эта подпрограмма обычно используется совместно с цифровым индикатором. Большинство таких индикаторов работают по принципу выборочного включения требуемых сегментов, как показано на рис. 8.2. Цифрами обозначены разряды порта передающего информацию. Обычно эти сегменты представляют собой светодиоды или электроды элементов на жидких кристаллах.
Рис.8.2-сегментный индикатор
Системное представление нашей подпрограммы приведено на рисунке 8.2а. Входным сигналом в данном случае является 4-битный двоичный код, находящийся в рабочем регистре. Выходным значением, также возвращаемым в W, является соответствующий 7-сегментный код, необходимый для отображения соответствующей цифры (подпрограмма Vyb_Seg). В микроконтроллерах PIC гарвардская архитектура делает невозможным использование значений памяти программ в виде данных. Вместо этого таблицы преобразования реализуются в виде наборов команд retlw, каждая из которых возвращает однобайтную константу, см. подпрограмму Vybor_Seg. Седьмой бит используется для точки.
Подпрограмма Vybor_Seg осуществляет выборку строки таблицы, прибавляя число N, передаваемое через рабочий регистр, к младшему байту счетчика команд (регистр PCL, расположенный по адресу h'02'). Поскольку PCL уже указывает на 1-ю команду retlw с кодом для цифры «0», то после прибавления N он будет указывать на N-ную команду, что нам и требуется.
Фрагменты программы. Применяемые символьныеимена регистров показаны на рисунке 8.3. Стандартные инструкции настройки МК опущены.
MOVLW b'11101011'; исходное число
MOVWF CHISLO
MOVWF Rab_Reg
; подсчитываем количество сотен
MOVLW D'100'
MOVWF VYCH; вычитаемое для сотен.
M_SOT INCF K_SOT, F;
SUBWF Rab_Reg, F; Rab_Reg= Rab_Reg-100
BTFSC STATUS, C; разность отрицательна (С=0)?
GOTO M_SOT; цикл подсчета количества сотен
ADDWF Rab_Reg, F; был заем, выполняем возврат назад на один шаг.
DECF K_SOT, F ; восстанавливаем количество сотен
MOVLW D'10'
MOVWF VYCH ; вычитаемое для определения десятков.
Подсчитываем количество десятков аналогично сотням. Напишите самостоятельно.
; запоминаем количество единиц.
MOVFW Rab_Reg; рабочий регистр содержит единицы после возврата.
MOVWF K_ED; переписываем количество единиц в регистр
SWAPF K_DES, W; перемещаем десятки в старшие разряды
ADDWF K_ED, W; добавляем количество единиц в младшие разряды
MOVWF R_D_ED; регистр теперь содержит десятки и единицы.
MOVF K_ED, W
CALL VYBOR_SEG; вызываем подпрограмму с аргументом W.
MOVWF Kod_seg_ed; записываем возвращенный код цифры
; аналогично найдите коды для десятков и сотен.
GOTO $; разделитель главной программы и подпрограмм.
VYBOR_SEG; подпрограмма, возвращающая код для включения сегментов.
addwf PCL, f; Прибавим W к PCL, получая PCL+W
retlw b'00111111'; код для цифры 0. Возвращается приW=0.
retlw b'00000110'; код для цифры 1. Возвращается при W=1.
retlw b'10101101'; код для цифры 2. Возвращается при W=2.
retlw b'01001111'; код для цифры 3. Возвращается при W=3.
retlw b'01100110'; код для цифры 4. Возвращается при W=4.
retlw b'01101101'; код для цифры 5. Возвращается при W=5.
retlw b'01111101'; код для цифры 6.Возвращается при W=6.
retlw b'00000111'; код для цифры 7.Возвращается приW=7.
retlw b'01111111'; код для цифры 8.Возвращается приW=8.
retlw b'01101111'; код для цифры 8.Возвращается при W= 8.
END
Переведите двоичное число в двоично-десятичное число и определите коды сотен, десятков и единиц. Т а б л и ц а 8.1 – Варианты заданий двоичного числа
|
Рисунок 8.3 – Окно наблюдения |
Из рисунка 8.3 видно, что заданное двоичное число содержит 2 сотни, 3 десятка и 5 единиц, то есть равно 235.
Контрольные вопросы
Назначение 2-10 системы счисления.
Сколько бит занимает 2-10 число?
Какое максимальное 2-10 число можно записать в регистр?
Как формируются цифры в индикаторе?
Назначение команды addwf PCL, f ?
Что вернется в вызывающую программу, если при вызове w=h’06’?
С какой целью в программе применена команда Swap?
Объясните алгоритм нахождения сотен.
Какое назначение регистра R_D_ED?
Как определяется, что получилась отрицательная разность?
Как определяется, что получился нулевой результат?
Назначение регистра PCL?