Гашение незначащих нулей | Все своими руками






Программа гашения незначащих нулей для LCD

Программа вывода чисел и гашения незначащих нолей для ЖКИ

     При разработке программы для измерителя освещенности, люксметра, возникла необходимость в гашении незначащих нолей при индикации значений величины освещенности. Это продиктовано неудобством восприятия, например, двухразрядного числа при максимальном числе разрядов пять. Согласитесь, что число 88, отображаемое на индикаторе более читабельно, чем 00088. Может, кому ни будь, из начинающих программистов пригодится эта программа в качестве примера.

Коды программы гашения незначащих нолей приведены на скриншоте программы Notepad++. Сам файл программы в формате asm, можно скачать в конце статьи.

Программа гашения незначащих нулей для LCD

     И так, что нам надо. Нам надо, чтобы вместо кода незначащего ноля, т.е. только тех нолей, которые стоят перед индицируемым числом, контроллер передавал на индикатор код «пустого места». Будем выводить, для примера, четырехзначное число 3001 Lx. Не забываем, что максимальное число имеет 5 знаков. Двоично-десятичные значения этого числа хранятся в регистрах Ind_HH — десятки тысяч, Ind_H — значения тысяч, Ind_M — сотни единиц, Ind_L — десятки, Ind_LL — единицы. Программа вывода значений люксов начинается с метки Pokaz_Lx. Первая инструкция, это чтение кода команды на переход на вторую строку индикатора и не на первый ее символ, а сразу на четвертый. Далее следует команда Call условного перехода на подпрограмму send_LCD, подпрограмму передачи этого кода в контроллер индикатора. Подпрограммы загрузки команд в индикатор и загрузки кода символа здесь не приводятся.

Вывод числа начинаем со старшего разряда. Считываем значение самого старшего регистра Ind_HH, где хранится значение десятков тысяч Lx. Movfw - исполнение этой инструкции влечет за собой изменение состояния флага нулевого результата - Z, в регистре STATUS. Эта команда используется для проверки содержимого регистра на «0». Поэтому после чтения данного регистра, проверяем состояние флага Z btfss _Z. _Z — это замена текста «#define _Z STATUS,Z». Если содержимое было равно «0», то флаг Z будет поднят, т.е. будет находиться в состоянии «1». Раз это так, то программа сразу переходит на строку 11, где прочитает код пустого места — 0×20 и на строке 12 пошлет его в индикатор — call Load_znak, Load_znak — это подпрограмма передачи кода символа в индикатор. Далее следует команда безусловного перехода на метку H — для проверки на «0»содержимого следующего, более младшего регистра Ind_H. После чтения, программа определяет, что регистр имеет не нулевое значение, значит флаг Z, опущен, т.е. бит Z регистра STATUS находится в состоянии логического «0». Значит, следующей командой на выполнение будет инструкция goto $+4, выполнив которую программа попадет сразу на строку 26 с меткой h. Не забываем, что в регистре WREG уже находится ранее прочитанное двоично-десятичное содержимое регистра Ind_H и оно имеет значение 3, т.е. b’00000011’ в двоичном коде. Полный код цифры 3 для вывода ее на индикатор, должен иметь в старшей тетраде код адреса столбца таблицы, где находятся символы цифр. Поэтому к двоично-десятичному значению b’00000011’ регистра прибавляем код адреса столбца — b’00110000’, в шестнадцатеричном коде — 0×30. Получаем полный код выводимой цифры три — b’00110011’ — 0×33. Получив необходимый код, передаем его для вывода на индикатор, строка 28 — call Load_znak; Теперь, когда программа определила начало числа, проверка на «0» содержимого следующих регистров будет ею игнорироваться. Иначе бы мы получили на индикаторе всего две цифры из нашего примера 3 и 1, через два пробела — 3 1.
     При написании программы я копировал одинаковые части программы, чтобы лишний раз не стучать клавишами, поэтому везде для безусловного перехода программы используется строка — goto $+4, Данная конструкция иногда используется программистами, чтобы не определять лишний раз метку при совершении перехода в пределах 3-10 инструкций. Чем этот прием может быть опасен? После написания программы, иногда начинаешь ее модифицировать. Вставляешь еще одну команду, например, сброс флага, а изменить шаг перехода по инструкции goto с $+4 на $+5 забыл, потом ищешь целый день, почему перестала работать улучшенная программа. Так что лучше $+4 заменить на соответствующие метки перехода программы по инструкции goto для лучшей наглядности подальше от ошибок. После вывода всех цифр числа со строки 57 посылаем в индикатор код пробела, потом код заглавной буквы L, строка 60 и затем код прописной буквы х. Все. Надеюсь понятно. Успехов. К.В.Ю.

Скачать файл ASM


Просмотров:2 092
Комментариев нет




Оставить комментарий