Гашение незначащих нулей
Программа гашение незначащих нулей для PIC
Здравствуйте, уважаемые посетители. Один из посетителей сайта, человек начинающий освоение пикконтроллеров и написание программ на языке ассемблер, попросил выложить подпрограмму гашения незначащих нулей старших разрядов чисел при их индикации с комментариями.
Программа небольшая, показана на скриншоте 1.
Для пятизначного числа она состоит всего из шестнадцати команд. Алгоритм исполнения инструкций программы очень простой, он следующий: Допустим нам надо отобразить на индикаторе число 748 на пятиразрядном индикаторе. В двоичной системе счисления для этого числа потребуется задействовать два восьмиразрядных регистра, в моем проекте, который можно будет скачать в конце статьи, это регистры H_byte и L_byte. L_byte – младший регистр числа, а H_byte, естественно старший. В двоичной системе счисления это число имеет вид –B’00000010 11101100’. Перед командами гашения незначащих нулей в проекте находится программа преобразования 2х байтового двоичного числа в пятиразрядное двоично-десятичное, которое будет находиться в регистрах:
led_4 ; Данные, отображаемые в пятом (тот, что слева) разряде индикации
led_3 ; Данные, отображаемые в четвёртом разряде индикации
led_2 ; Данные, отображаемые в третьем разряде индикации
led_1 ; Данные, отображаемые во втором разряде индикации
led_0 ; Данные, отображаемые в первом (тот, что справа) разряде индикации
И так, после преобразования в регистре led_0 будет число 8, в регистре led_1 будет число 4, в регистре led_2 будет число 7, а в старших регистрах led_3 и led_4 будут нули, которые нам и не нужно индицировать. Программа начинается со строки 127 (смотрим скриншот). Вначале программа выполняет команду movfw led_4, т.е. мы заносим данные регистра led_4 в рабочий регистр WREG. Исполнение этой команды влияет на состояние бита Z в регистре STATUS или иначе флага нулевого результата. Таким образом, программа, выполняя эту инструкцию и следующую btfss _Z, проверяет регистр led_4 на ноль. Если значение данного регистра не равно нулю, т.е. флаг нулевого результата не поднят, Z = «0», то дальнейшее исполнение данной программы прекращается командой goto OUT – конец программы гашение незначащих нулей. В нашем случае регистр led_4 имеет нулевое значение и после выполнения команды movfw led_4 флаг нулевого результата буде поднят, т.е. бит Z будет равен «1». В этом случае нам необходимо «сказать контроллеру», чтобы индикатор этого разряда был погашен. Для этого нам потребуется в регистр led_4 записать число 16. В результате, после табличной конвертации двоично-десятичного числа в семисегментный код при выполнении программы вывода значений на индикатор (в проекте она не рассматривается), в регистр PORTB запишется значение, соответствующее строке 170 программы (смотрим скриншот 2) или строке 16 таблицы Table. Надеюсь, что вы уже знакомы с табличным преобразованием значений регистров.
Таким образом на выходе порта В все его биты будут иметь значение единицы, таким образом все светодиоды сегментов индикатора с общим анодом будут обесточены. Для записи числа D’16’ = b’00010000’ обычно используют две инструкции movlw .16 ; movwf led_4 ; , а в данном случае мы используем одну команду bsf led_4,4 – просто записываем единицу в четвертый бит регистра и получаем то же самое – число 16 в регистре led_4. Иногда это полезно помнить, когда не хватает объема памяти программ. Далее мы проверяем значение регистра led_3. В нашем случае он тоже имеет значение нуля, поэтому мы в его опять записываем число 16. В регистре led_2, после выполнения программы преобразования двоичных чисел в двоично-десятичные, находится число 7, т.е. после проверки этого регистра (строки 137,138 программы) флаг нулевого результата не будет поднят. И т.о. дальнейшее исполнение данной программы прекращается командой goto OUT – конец программы гашение незначащих нулей, строка 139 программы. В правом окне среды разработки MPLAB IDE можно увидеть распределение значений по всем задействованным регистрам программы.