Доброго времени суток. Делаю таблицу дешифрации для 7-сегментного индикатора (общий анод). Решил сделать расширенный вариант, и кроме цифр 0-9 добавил шестнадцатеричные А-F.
Добавляю в таком виде:
Спойлер
Zhuk72 писал(а):... для чего вам нужна длинная строка? Чем привлекла?
Да ничем особо. Просто ассемблерный код в сравнении с Сишным, при одинаковом объеме полезной продуктивности, априори более растянут по вертикали. Чтобы меньше скролить экран, стараюсь минимизировать "высоту" кода, упаковывая все в макросы и подпрограммы, распихать их по подключаемым файлам, и заиметь компактный файл главного цикла в котором четко видно общий алгоритм работы программы. Поэтому же вместо кучи строчек с RETLW всегда использовал 1 строчку c dt. А тут оказывается есть какие-то ограничения)) Погуглил по форумам, оказывается в первых версиях MPLAB X вообще нельзя было больше 1 значения в строке. Вот и переходи после этого на "новейшие" ИДЕ
Раз Вам так нравится MPLAB X, предлагаю Вам для просмотра длинного АСМ кода ДВА инструмента.
1. Открывание двух окон (вертикальных) с одинаковым открываемым файлом. Это позволяет смотреть два участка одного текста независимо и параллельно.
2. "Коллапсирование" участков кода (обычно подпрограмм или однотипной их группы). Это делается набором в начале строки текста fcom;<tab>. Сразу после нажатия на табуляцию будет сгенерированы теги "коллапсайдера". Дефолтное имя Вы исправляете на имя сворачиваемого участка, а сам сворачиваемый текст помещаете между тегами открытия и закрытия "коллапсайдера".
Текст становится очень коротким, свернутые участки Вы легко открываете по мере необходимости.
КРАМ писал(а):
Это делается набором в начале строки текста fcom;<tab>...
А вот это сюрприз. Я думал, что коллапсирование работает только в сишных исходниках, в асм тексты я не нашел этого в контекстном меню. Оказываются они таким вот хитрым образом закручиваются. Спасибо! Хотя для меня уже неактуально
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Обычно в одной строке больше чем позволяют ограничители страницы буковок не ставлю...
Правда исходники набираю в DPAD - текстовки универсальны для компиляторов любых семейств
(mcs51, pic10/12/16/18, avr, i8080, z80). А уж затем использую в проектах.
Жаль, что на сегодня сайт с проектом того редактора закрыт...
Приветствую, где можно набрать простых примеров на asm, типа сложения/вычитания/деления/умножения 8/16 битных чисел, циклы, BCD и семисегментники, прерывания т.п. Нужны простые, лаконичные примеры(лучше с комментариями) для самообучения
my_macro MACRO table_name ; Вроде так макросы создаются, не помню уже...
clrf table_name
..........
..........
ENDM
my_macro symbol_pointer ; Вызов макроса
Да и не выиграете Вы ничего макросом, ни в объёме кода, ни в быстродействии. Вот если функцию создадите, то уже будет выигрыш по коду. Там уже придётся передавать адрес, и через косвенную его обрабатывать.
Реальный адрес начала блока данных Let_XX получите при чтении данных по базовому адресу CODEPAGE_5x8 (адрес метки) + смещение по числу (строке) нужного блока данных.
Пока_без_кота писал(а):Доброго времени суток. Возможно ли каким-то образом передать в качестве параметра макроса адрес таблицы ?
...
И таких выводов значений из таблиц есть много, и все они отличаются лишь содержимым таблицы. Или я хочу невозможного ?
Векторный переход по смещению и базовому адресу?
У стандартных среднемладших для подобных фокусов используются команды, модифицирующие PCL .
Только надо при том помнить про содержимое pclath и про то, что перенос при переполнении PCL в результате операций с ним автоматически не распространяется на pclath - воть тута надо макрос шкарябать (как и для временного хранения исходного значения pclath).
У "улучшенных" среднемладших и 18-й несколько получше "фокусы" получаются.
Всем доброго времени суток. Спасибо, даже не ожидал такого внимания к моему вопросу. Отвечаю всем по порядку.
2 Zhuk72
Си уже по чуть-чуть начал учить, просто уже сделал проект простой древовидной менюшки на ассемблере, и хотел его "причесать", потому что в бессмертный PIC16F84 (1к слов) еле влезла менюшка 5 пунктов меню по 3 подпункта в каждом пункте (вместе с выводом на ЖК дисплей названий всех пунктов и подпунктов).
2 Аlex
Насчет использования макроса и пользе функции. Я понимаю что макрос не даст мне выиграша ни в чем, кроме общего восприятия кода в месте использования макроса. Я и хочу его использовать лишь для передачи внутрь процедуры адреса таблица в качестве параметра. Проблема в том что я не знаю, как передать АДРЕС ТАБЛИЦЫ в качестве параметра внутрь процедуры.
2 Albert_V
Все гораздо запущенее, я пишу для 12/16 Пиков Но за примеры спасибо, утянул себе в примеры, на будущее.
2 BOB51
Нет, это уже есть реализовано, надо именно предать внутрь процедуры АДРЕС ТАБЛИЦЫ. Передать 8-битный указатель проблемы нет. А а вот адрес таблицы не умею
П.С. Кажется до меня дошло, как реализовать задуманное, я просто подходил не с той стороны, позже отпишусь...
П.П.С. Спасибо всем, у меню получилось реализовать задуманное. Менюшка похудела до 740 слов при том же функционале. Спойлер
Доброго времени суток. Я как всегда со своим извечным "А можно ли лучше ?"
Делаю простенький термометр на 12 Пике, со светодиодным индикатором. Решил для лучшего понимания сам написать процедуру перекодировки двоичного числа в двоично-десятичное. Пока только на 2 разряда, температура дома вряд-ли перевалит за сотню)) Все получилось, но интересует, как можно улучшить код.
Спойлер
Bin_2_BCD_Lite
movlw .10 ; Задаем счетчик десятков
movwf counter
clrf decades_num ; Обнуляем количество десятков
clrf units_num ; Обнуляем количество единиц
movfw conv_value ; Заносим проверяемое значение в рабочий регистр
Loop_decades
movwf conv_value_temp ; Сохраняем полученное значение в промежуточную ячейку
movlw .10
subwf conv_value_temp,w ; Вычитаем 10, сохраняем в рабочий регистр
btfss STATUS,C ; Если возник флаг займа,
goto Decades_End ; Прекращаем вычитать десятки
incf decades_num ; Иначе увеличиваем количество десятков в проверяемом числе
decfsz counter ; Перебор возможного количества десятков
goto Loop_decades
clrf decades_num ; Обнуляем количество посчитанных десятков, количество единиц и так останется равным 0
retlw 0 ; Ошибка, возврат с нулевыми значениями десятков и единиц
Decades_End
movlw .10 ; Задаем счетчик единиц
movwf counter
Loop_units
movlw .1
subwf conv_value_temp ; Вычитаем 1
btfss STATUS,C ; Если возник флаг займа,
goto Units_End ; Прекращаем вычитать единицы
incf units_num ; Иначе увеличиваем количество единиц в проверяемом числе
decfsz counter ; Перебор возможного количества единиц
goto Loop_units
clrf decades_num ; Обнуляем количество посчитанных десятков
clrf units_num ; Обнуляем количество посчитанных единиц
retlw 0 ; Ошибка, возврат с нулевыми значениями десятков и единиц
Units_End
retlw 1 ; Возврат с посчитанными значениями десятков и единиц