Академический Документы
Профессиональный Документы
Культура Документы
2
В случае же, если будут иметь место быть "дерганья" (резкие изменения значений
чисел, которые нужно отобразить), первое "имеет право на жизнь", а вот "бегущая
строка даст дуба", так как будет нарушен основной ее принцип: информация в
"бегущую строку" должна выводиться последовательно, с фиксированным шагом (чаще
всего - в одну "позицию"), и в одном направлении.
Иначе получится не "бегущая строка", а черт знает что (визуальная мУка).
А теперь, ближе к "животрепещущим" деталям.
Ниже, Вы видите текст программы, в которой реализовано "вышележащее" (программа
12864_18.asm. Полный текст прилагается).
В целях обеспечения комфортного "въезда", я ее как следует "обкарнал", но основные
"моменты" - в полной целости и сохранности.
Кстати, по сравнению с предыдущими программами, программа 12864_18.asm не такая
уж и "массивная":
;********************************************************************************
; 12864_18.asm Учебное устройство, осуществляющее "подсчет" (имитация)
; количества "размножающихся" попугаев. Результат подсчета
; выводится на индикацию в графический модуль MT-12864...
; (оба сценария "усопли". Вместо них, имеет место быть шкальный
; индикатор на 64 позиции и "бегущая строка")
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; За основу, взяты программные наработки Милевского А.З. mazr@bk.ru
; Попугайная и прочая специфика: Корабельников Е.А.
;********************************************************************************
; Используются операторы high и low.
; Инициализация графического модуля - "штатная", с использованием флагов статуса.
;================================================================================
; Функции выводов порта С:
; RC0...RC7 - выводы данных.
; Функции выводов порта В:
; RB0 - Е2 ; управление правым (2-м) кристаллом,
; RB1 - Е1 ; управление левым (1-м) кристаллом,
; RB2 - E ; на этом выводе формируются стробирующие импульсы,
; RB3 - A0 ; управление режимами "данные/команды",
; RB7 - R/W ; управление режимами "чтение/запись",
; RB4 - RES ; внешний сброс,
; остальные выводы порта В не задействованы.
; Выводы порта С не используются.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Используется PIC16F873A.
;----------------------------------------------
; Объем программы: 1203 слова в памяти программ.
;================================================================================
LIST p=16F873A ; Задание типа микроконтроллера.
__CONFIG 3F71H ; Включено: XT-генератор, PWRT, сброс BOR,
; Выключено: защита, WDT, LVP, DEBUG.
;================================================================================
; Регистры специального назначения.
;================================================================================
.............................
;================================================================================
; Регистры общего назачения.
;================================================================================
Temp equ 20h ; Регистр количества проходов.
Reg equ 21h ; Регистр выбора сценария вычисляемого
; перехода (плюс, используется в ПП BIN2_10).
Mem1 equ 22h ; Регистры задержки, а также и хранения
Mem2 equ 23h ; результата кольцевого сдвига
Mem3 equ 24h ; (кроме того, Mem1 - указатель страницы).
3
Reg1 equ 25h ; Регистр счетчика количества попугаев.
N_Zapoln equ 26h ; Регистр количества байтов заполнения шкалы.
LED0 equ 30h ; Регистры, задействованные
LED1 equ 31h ; в ПП 2/10 преобразования.
;================================================================================
; Присвоение битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
Z equ 2 ; Флаг нулевого результата.
RP0 equ 5 ; Бит выбора банка.
E2 equ 0 ; Бит выбора 2-го кристалла.
E1 equ 1 ; Бит выбора 1-го кристалла.
E equ 2 ; Бит стробирования.
A0 equ 3 ; Бит выбора режима "команды/данные".
R_W equ 7 ; Бит выбора режима "чтение/запись".
;================================================================================
org 0 ; Начать выполнение программы с 0 адреса PC.
goto START ; Переход в ПП START.
;********************************************************************************
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм, обеспечивающая "побайтное" формирование символов цифр
; ("знакогенератор").
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Символ "0".
;-------------
Z_0 .............................
;-------------
; Символ "1".
;-------------
Z_1 .............................
;-------------
; Символ "2".
;-------------
Z_2 .............................
;-------------
; Символ "3".
;-------------
Z_3 .............................
;-------------
; Символ "4".
;-------------
Z_4 .............................
;-------------
; Символ "5".
;-------------
Z_5 .............................
;-------------
; Символ "6".
;-------------
Z_6 .............................
;-------------
; Символ "7".
;-------------
Z_7 .............................
;-------------
; Символ "8".
;-------------
Z_8 .............................
;-------------
; Символ "9".
;-------------
Z_9 .............................
;-------------
; "Пробел".
4
;-------------
Z_10 .............................
;================================================================================
; Подпрограммы выбора страниц (1...8) кристалла.
;================================================================================
; ПП установки адреса 1-й страницы.
;------------------------------------
STRANICA_1 ..........................
;------------------------------------
; ПП установки адреса 2-й страницы.
;------------------------------------
STRANICA_2 ..........................
;------------------------------------
; ПП установки адреса 3-й страницы.
;------------------------------------
STRANICA_3 ..........................
;------------------------------------
; ПП установки адреса 4-й страницы.
;------------------------------------
STRANICA_4 ..........................
;------------------------------------
; ПП установки адреса 5-й страницы.
;------------------------------------
STRANICA_5 ..........................
;------------------------------------
; ПП установки адреса 6-й страницы.
;------------------------------------
STRANICA_6 ..........................
;------------------------------------
; ПП установки адреса 7-й страницы.
;------------------------------------
STRANICA_7 ..........................
;------------------------------------
; ПП установки адреса 8-й страницы.
;------------------------------------
STRANICA_8 ..........................
;================================================================================
; Подпрограмма записи данных.
;================================================================================
WRITE_D ..........................
;================================================================================
; Подпрограмма чтения данных.
;================================================================================
READ_D ..........................
;================================================================================
; Подпрограмма стробирования.
;================================================================================
STROB ..........................
;================================================================================
; Подпрограмма установки первого (самого левого) столбца страницы (адрес 00h).
;================================================================================
STOLB_1 ..........................
;================================================================================
; Подпрограмма заполнения страницы нулями.
;================================================================================
ZERO ..........................
;================================================================================
; Подпрограмма выбора страницы, в случае совмещения 4-х таблиц, относящихся
; к одному кристаллу.
;================================================================================
VIBOR ..........................
;================================================================================
; Подпрограмма числовой коррекции адреса "прыжка".
;================================================================================
; В случае возврата, отсчет от 1-й команды retlw ...
;------------------------------------------------------------------
5
N_STR ..........................
;================================================================================
; ЗАДЕРЖКА (0,3 сек.)
;================================================================================
PAUSE ..........................
;================================================================================
; Подпрограмма "обнуления" 4, 6, 7 и 8 страниц.
;================================================================================
; "Обнуляются" 4, 6, 7 и 8 страницы.
;------------------------------------
SBROS_STR ..........................
;------------------------------------
; "Обнуляются" 4, 7 и 8 страницы.
;------------------------------------
SBROS_STR_1 .........................
;================================================================================
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START ..........................
;================================================================================
; Инициализация графического модуля.
;================================================================================
..........................
;================================================================================
;################################################################################
; Вывод на индикацию картинки 1-го "кадра".
;################################################################################
; Включение 2-го кристалла.
;*************************************
..........................
;--------------------------------------------------------------------------------
; Выбор страницы, в случае совмещения 4-х таблиц, относящихся к одному кристаллу.
;--------------------------------------------------------------------------------
..........................
KOLCO call VIBOR ; Переход в подпрограмму выбора страницы, в
; случае совмещения 4-х таблиц, относящихся
; к одному кристаллу.
;---> Возврат по стеку из ПП VIBOR ;
;--------------------------------------------------------------------------------
; Запись в 1, 2, 3, 5 страницы 2-го кристалла.
;--------------------------------------------------------------------------------
..........................
call TEXT_1 ; Переход в ПП TEXT_1.
;---> Возврат по стеку из ПП TEXT_1
..........................
decfsz Mem1,F ; Декремент указателя страницы, после чего
goto KOLCO ; либо переход на заполнение следующей
; страницы, либо выход из процедуры.
;--------------------------------------------------------------------------------
; Запись в 4, 6, 7, 8 страницы 2-го кристалла (заполнение нулями).
;--------------------------------------------------------------------------------
call SBROS_STR ; Переход в ПП "обнуления" страниц.
;---> Возврат по стеку из ПП SBROS_STR
;*************************************
; Включение 1-го кристалла.
;*************************************
..........................
;--------------------------------------------------------------------------------
; Выбор страницы, в случае совмещения 4-х таблиц, относящихся к одному кристаллу.
;--------------------------------------------------------------------------------
6
..........................
KOLCO_1 call VIBOR ; Переход в подпрограмму выбора страницы, в
; случае совмещения 4-х таблиц, относящихся
; к одному кристаллу.
;---> Возврат по стеку из ПП VIBOR ;
;--------------------------------------------------------------------------------
; Запись в 1, 2, 3, 5 страницы 1-го кристалла.
;--------------------------------------------------------------------------------
..........................
call TEXT_2 ; Переход в ПП TEXT_2.
..........................
decfsz Mem1,F ; Декремент указателя номера страницы, после
goto KOLCO_1 ; чего либо переход на заполнение следующей
; страницы, либо выход из процедуры.
;--------------------------------------------------------------------------------
; Запись в 6-ю страницу 1-го кристалла
;--------------------------------------------------------------------------------
..........................
call TEXT_3 ; Переход в ПП TEXT_3.
..........................
;--------------------------------------------------------------------------------
; Запись в 4, 7, 8 страницы 1-го кристалла (заполнение нулями).
;--------------------------------------------------------------------------------
call SBROS_STR_1 ; Переход в ПП "обнуления" страниц.
;---> Возврат по стеку из ПП SBROS_STR_1
;################################################################################
;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
SNOVA incf Reg1,F ; Reg1 + 1 = ... (обеспечение "динамики")
movf Reg1,W ; Reg1 -> W
sublw .64 ; .64 - Reg1 = ...
btfsc Status,Z ; Выходить на следующее кольцо счета или нет?
goto $+2 ; Если да, то Reg1 сбрасывается в 0.
goto $+2 ; Если нет, то Reg1 не сбрасывается в 0.
clrf Reg1 ; А это сам сброс.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Вывод результата "подсчета" количества попугаев на индикацию
; в графический модуль.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Задание "координаты", с которой начнется запись байтов данных
; (страница 5, 33-й столбец).
;--------------------------------------------------------------------------------
..........................
;--------------------------------------------------------------------------------
; Группа команд гашения незначащих нулей (работа с LED1).
;--------------------------------------------------------------------------------
..........................
;--------------------------------------------------------------------------------
; "Администраторская" подпрограмма (работа с LED1 и LED0).
;--------------------------------------------------------------------------------
..........................
7
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА СО ШКАЛЬНЫМ ИНДИКАТОРОМ (в 1-м кристалле. Он установлен ранее).
;////////////////////////////////////////////////////////////////////////////////
; Вывод данных на индикацию в 7-ю страницу (шкала без "выкрутасов").
;--------------------------------------------------------------------------------
call STRANICA_7 ; Выбор 7-й страницы.
;---> Возврат по стеку из ПП STRANICA_7
call STOLB_1 ; Выбор 1-го столбца страницы.
;---> Возврат по стеку из ПП STOLB_1
call ZERO ; Сброс в 0 предыдущих показаний.
;---> Возврат по стеку из ПП ZERO
;--------------------------------------------------------------------------------
; Процедура вывода на индикацию массива байтов.
;--------------------------------------------------------------------------------
movf N_Zapoln,W ; Копирование количества байтов заполнения
movwf Temp ; шкалы в регистр Temp (назначение числа
; проходов).
call TEXT_4 ; Переход в ПП TEXT_4 (на эту команду
; происходит "закольцовка").
;---> Возврат по стеку из ПП TEXT_4
movwf PortC ; ----"----
movlw high WRITE_D; Стандартно.
movwf PCLATH ; ----"----
call WRITE_D ; ----"----
;---> Возврат по стеку из ПП WRITE_D
;-------------------------------------
; "Концовка".
;-------------------------------------
decf Temp,F ; Temp - 1 = ...
btfss Temp,7 ; В бит №7 регистра Temp 0 или 1 ?
goto $-7 ; Если 0, то на индикацию выводится
; следующий байт массива.
; Если это 1, то массив выведен и
; программа исполняется далее.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ВАРИАНТ "КОНЦОВКИ".
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;; decf Temp,F ; Temp - 1 = ...
;;; movlw .255 ;
;;; subwf Temp,W ; Temp - .255 = ...
;;; btfss Status,Z ; Это число .255 или другое ?
;;; goto $-9 ; Если не .255, то на индикацию выводится
;;; ; следующий байт массива.
;;; ; Если это .255, то массив выведен и
;;; ; программа исполняется далее.
;--------------------------------------------------------------------------------
; Вывод данных на индикацию в 8-ю страницу ("паровоз и 6 вагонов").
;--------------------------------------------------------------------------------
call STRANICA_8 ;
;---> Возврат по стеку из ПП STRANICA_8
call STOLB_1 ;
;---> Возврат по стеку из ПП STOLB_1
call ZERO ;
;---> Возврат по стеку из ПП ZERO
movf N_Zapoln,W ;
movwf Temp ;
8
decf Temp,F ;
btfss Temp,7 ;
goto $-7 ;
;////////////////////////////////////////////////////////////////////////////////
call PAUSE ; Задержка 0,3 сек.
;---> Возврат по стеку из ПП PAUSE
;================================================================================
; Далее - "на колу мочало" ("закольцовка").
;================================================================================
goto SNOVA ; Переход на следующий цикл программы.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм вывода на индикацию символов цифр.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Подготовительные операции.
;------------------------------------
CIFRA movwf Mem1 ; Сохранение, в Mem1, содержимого
; текущего LEDа.
movlw .8 ; В регистр Temp записывается
movwf Temp ; число проходов.
;================================================================================
; Циклическая ПП вывода на индикацию символов цифр (в нее "врезана" группа
; команд анализа числового значения содержимого текущего LEDа).
;================================================================================
VERH ..........................
;*************************************
; "Врезка".
;*************************************
; Для символа "0".
;-------------------------------------
..........................
call Z_0 ; Если =0, то переход в "знакогенератор"
;---> Возврат по стеку из ПП Z_0 ; символа "0" (подготовка к выводу на
goto VIVOD ; индикацию текущего байта), а после возврата
; - обход всей процедуры анализа.
;-------------------------------------
; Для символа "1".
;-------------------------------------
..........................
call Z_1 ; Переход в "знакогенератор" символа "1".
;---> Возврат по стеку из ПП Z_1
goto VIVOD ;
;-------------------------------------
; Для символа "2".
;-------------------------------------
..........................
call Z_2 ; Переход в "знакогенератор" символа "2".
;---> Возврат по стеку из ПП Z_2
goto VIVOD ;
;-------------------------------------
; Для символа "3".
;-------------------------------------
..........................
call Z_3 ; Переход в "знакогенератор" символа "3".
;---> Возврат по стеку из ПП Z_3
goto VIVOD ;
;-------------------------------------
; Для символа "4".
;-------------------------------------
..........................
call Z_4 ; Переход в "знакогенератор" символа "4".
;---> Возврат по стеку из ПП Z_4
goto VIVOD ;
;-------------------------------------
; Для символа "5".
9
;-------------------------------------
..........................
call Z_5 ; Переход в "знакогенератор" символа "5".
;---> Возврат по стеку из ПП Z_5
goto VIVOD ;
;-------------------------------------
; Для символа "6".
;-------------------------------------
..........................
call Z_6 ; Переход в "знакогенератор" символа "6".
;---> Возврат по стеку из ПП Z_6
goto VIVOD ;
;-------------------------------------
; Для символа "7".
;-------------------------------------
..........................
call Z_7 ; Переход в "знакогенератор" символа "7".
;---> Возврат по стеку из ПП Z_7
goto VIVOD ;
;-------------------------------------
; Для символа "8".
;-------------------------------------
..........................
call Z_8 ; Переход в "знакогенератор" символа "8".
;---> Возврат по стеку из ПП Z_8
goto VIVOD ;
;-------------------------------------
; Для символа "9".
;-------------------------------------
..........................
call Z_9 ; Переход в "знакогенератор" символа "9".
;---> Возврат по стеку из ПП Z_9
goto VIVOD ;
;-------------------------------------
; Для символа "пробел".
;-------------------------------------
..........................
call Z_10 ; Переход в "знакогенератор" символа "пробел"
;---> Возврат по стеку из ПП Z_10
;*************************************
; Конец "врезки".
;*************************************
VIVOD movwf PortC ; Вывод текущего байта кода символа в PortC.
call WRITE_D ; Переход в ПП записи байта данных.
;---> Возврат по стеку из ПП WRITE_D
decfsz Temp,F ; Temp - 1 = ...
goto VERH ; Если результат не=0, то на индикацию
; выводится следующий байт.
return ; Если результат =0, то возврат по стеку в то
; "место", из которого произошел вызов ПП
; CIFRA (с дальнейшим переходом на обработку
; содержимого следующего LEDа).
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;################################################################################
; ТАБЛИЦЫ ДАННЫХ 1-го "КАДРА".
;################################################################################
; КРИСТАЛЛ 2
;================================================================================
; "Счетверенные" данные 1, 2, 3, 5 страниц 2-го кристалла.
;================================================================================
; Анализ указателя номера страницы с целью числовой коррекции адреса "прыжка".
;--------------------------------------------------------------------------------
TEXT_1 call N_STR ; Переход в ПП числовой коррекции адреса
; "прыжка".
10
;---> Возврат по стеку из ПП N_STR ;
..........................
; КРИСТАЛЛ 2
; ---------Таблица 1-й страницы----------
; Надпись "ывода на"
STR_1 Dt 0x00,0xF8,0x90,0x90,0x60,0x00,0xF8,0x00
Dt 0x00,0x00,0xF8,0xA8,0xA8,0xA8,0x50,0x00
Dt 0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00
Dt 0x00,0x00,0xC0,0x68,0x58,0x48,0xF8,0x00 ; Reg+0=...
Dt 0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00
Dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
Dt 0x00,0x00,0xF8,0x20,0x20,0x20,0xF8,0x00
Dt 0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00
;================================================================================
; КРИСТАЛЛ 1
;================================================================================
; "Счетверенные" данные 1, 2, 3, 5 страниц 1-го кристалла.
;================================================================================
TEXT_2 call N_STR ;
;---> Возврат по стеку из ПП N_STR ;
..........................
; КРИСТАЛЛ 1
; ---------Таблица 1-й страницы----------
11
; Надпись "Пример в"
STR_2 Dt 0x00,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00
Dt 0x00,0x00,0xF8,0x48,0x48,0x48,0x30,0x00
Dt 0x00,0x00,0xF8,0x40,0x20,0x10,0xF8,0x00
Dt 0x00,0x00,0xF8,0x10,0x20,0x10,0xF8,0x00 ; Reg+0=...
Dt 0x00,0x00,0x70,0xA8,0xA8,0xA8,0x30,0x00
Dt 0x00,0x00,0xF8,0x48,0x48,0x48,0x30,0x00
Dt 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
Dt 0x00,0x00,0xF8,0xA8,0xA8,0xA8,0x50,0x00
addwf PCL,F ;
;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦЫ ДАННЫХ ШКАЛЬНОГО ИНДИКАТОРА.
;////////////////////////////////////////////////////////////////////////////////
; Таблица конфигурации байтов, которыми заполняется шкала (без "выкрутасов").
12
; Через каждые 8 байтов выставлен маркер.
;================================================================================
TEXT_4 movlw high STR_4 ;
movwf PCLATH ;
addwf PCL,F ;
STR_4 Dt 0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; Темно-красным
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; цветом выделены
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; маркеры
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
;================================================================================
; Таблица конфигурации байтов, которыми заполняется шкала.
; С "выкрутасами" ("паровоз и 6 вагонов").
;================================================================================
TEXT_5 movlw high STR_5 ;
movwf PCLATH ;
addwf PCL,F ;
STR_5 Dt 0x70,0xF8,0xFC,0x74,0x7E,0xF4,0xFC,0x74
Dt 0x7C,0xFC,0xFC,0x7C,0x7C,0xFC,0xFC,0x78
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
;////////////////////////////////////////////////////////////////////////////////
;================================================================================
; Подпрограмма двоично-десятичного преобразования Сергея Рослика.
;================================================================================
BIN2_10 ..........................
;********************************************************************************
end ; Конец программы.
Работа программы
;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
SNOVA incf Reg1,F ; Reg1 + 1 = ... (обеспечение "динамики")
movf Reg1,W ; Reg1 -> W
sublw .64 ; .64 - Reg1 = ...
btfsc Status,Z ; Выходить на следующее кольцо счета или нет?
goto $+2 ; Если да, то Reg1 сбрасывается в 0.
goto $+2 ; Если нет, то Reg1 не сбрасывается в 0.
clrf Reg1 ; А это сам сброс.
Так как речь идет о линейно нарастающем количестве попугаев, применена команда
incf.
"Предметом ее вожделения" назначен регистр Reg1.
Регистры Reg2 и Reg3 (см. "мать") "убиты за ненужностью".
Обратите внимание на команды, выделенные красным цветом.
Именно они и обеспечивают "динамику" шкалы, в диапазоне 64-х градаций.
14
Это осуществляется достаточно просто: постепенно "наращиваемое" число, которое
"лежит" в регистре Reg1 просто сравнивается (в начале каждого внутреннего цикла) с
константой .64.
Если это число "нарастилось" до .64, то содержимое регистра Reg1 банально
сбрасывается в ноль, после чего, дальнейший счет происходит от 0.
Последнее и есть, упомянутый выше, "подрыв на партизанской мине".
Итак, содержимое регистра Reg1 "заанализировано" и в случае чего, нужным образом
скорректировано.
После этого, его можно скопировать в регистр Mem1.
Далее, содержимое регистра Mem1 будет использовано как исходные данные для
осуществления 2/10 преобразования (см. переход в ПП BIN2_10).
Но особенность заключается в том, что после возврата из ПП BIN2_10, в регистре
Mem1, будет "лежать" число, которое и близко не будет соответствовать содержимому
регистра Reg1.
А ведь дальше-то (после возврата из ПП BIN2_10) нужно выводить результат
"подсчета" количества попугаев на индикацию в графический модуль.
Если при этом использовать регистр Mem1, то будут не "попугайные дела", а
сплошной конфуз.
То есть, при выводе результата "подсчета" количества попугаев на индикацию в
графический модуль, регистр Mem1 применять нельзя.
Значит, кроме сохранения содержимого регистра Reg1, в регистре Mem1 (для ПП
BIN2_10), нужно сохранить его и еще в одном регистре.
В качестве такового, используется регистр N_Zapoln (с намеком на текущее количество
байтов заполнения шкалы), который представляет собой те "закрома", из которых
"черпаются" исходные данные для процедур шкального индикатора/"бегущей строки".
А теперь о десятичной разрядности.
В данном случае, максимальная, десятичная разрядность = 2.
То есть, для отображения результата "размножения" попугаев (от .0 до .63-х), с
избытком хватит и одного регистра общего назначения.
Таким образом, ПП BIN2_10 должна обеспечивать преобразование всего-навсего одного
байта (Mem1) в два десятичных разряда (LED0 и LED1).
Остальные "материнские" LEDы просто "отправляются к праотцам" (что и имеет место
быть).
При таком "раскладе", ничего лучшего, чем ПП 2/10 преобразования Сергея Рослика,
просто нет (абсолютно вне конкуренции).
Поэтому я ее и применил, а заодно и вспомнил Сергея добрым словом.
На всякий случай, после директивы end программы 12864_18.asm, я "нарисовал"
соответствующий вариант стандартной ПП 2/10 преобразования.
Можете сравнить.
Так как речь идет всего о двух десятичных разрядах, то и последующие действия
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Вывод результата "подсчета" количества попугаев на индикацию
; в графический модуль.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Задание "координаты", с которой начнется запись байтов данных
; (страница 5, 33-й столбец).
;--------------------------------------------------------------------------------
..........................
;--------------------------------------------------------------------------------
; Группа команд гашения незначащих нулей (работа с LED1).
;--------------------------------------------------------------------------------
..........................
;--------------------------------------------------------------------------------
; "Администраторская" подпрограмма (работа с LED1 и LED0).
;--------------------------------------------------------------------------------
..........................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
15
Просто все лишнее "выкидывается на помойку" (см. текст программы 12864_18.asm, в
сравнении с текстом 12864_17.asm).
После этого, несколько нарушается "визуальная центровка" результата подсчета
попугаев.
Но это дело поправимое: просто изменяется адрес, с которого начинается заполнение
данными 5-й страницы 1-го кристалла (адрес 33-го столбца à 20h), и все дела.
А можно и не изменять. Кому как нравится.
После того, как в регистрах LED0 и LED1 "осядет" результат 2/10 преобразования,
начинается "основное действо".
А теперь пару слов о замысле.
Изначально, "привяжусь" не к "бегущей строке", а к шкальному индикатору.
Что "лежит" в регистре N_Zapoln ?
В нем "лежит" текущее количество попугаев.
Вот Вам и количество байтов, которое нужно вывести на индикацию в 7-ю страницу
1-го кристалла, из расчета того, что одному попугаю соответствует один столбец
(линейная зависимость).
Следовательно, числовое значение содержимого регистра N_Zapoln (от .0 до .63)
определяет номер одного из 64-х сценариев табличного вычисляемого перехода, на
котором заканчивается вывод на индикацию текущей группы байтов.
Соответственно, количество байтов, в этой группе, может быть различно (зависит от
содержимого регистра N_Zapoln).
Первым всегда выводится байт 1-го сценария вычисляемого перехода (я его пометил
"суперпимпочкой" с числовым значением FFh).
Направление вывода: от байта 1-го сценария, к байту, номер сценария которого задает
содержимое регистра N_Zapoln.
Теперь нужно определиться с числовыми значениями этих байтов.
Каковы они?
А какие зададите, такие и будут.
В простейшем случае, можно заполнить всю таблицу вычисляемого перехода байтами
с одинаковыми числовыми значениями.
Например, FFh ("лента" высотой в 8 точек), FEh ("лента" высотой в 7 точек), FCh
("лента" высотой в 6 точек) и т.д.
Я "сваял" "ленту" высотой в 6 точек, но с "маркерными пимпочками" (через каждые 8
байтов).
Мне кажется, что так симпатичнее и порядка больше (это "движущееся безобразие"
можно комфортно, визуально "привязать" к имеющейся фиксированной градуировке).
Итак, сначала "делаются координатные дела": выбирается 1-й столбец 7-й страницы
(напоминаю, что ранее был включен 1-й кристалл):
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА СО ШКАЛЬНЫМ ИНДИКАТОРОМ (в 1-м кристалле. Он установлен ранее).
;////////////////////////////////////////////////////////////////////////////////
; Вывод данных на индикацию в 7-ю страницу (шкала без "выкрутасов").
;--------------------------------------------------------------------------------
call STRANICA_7 ; Выбор 7-й страницы.
;---> Возврат по стеку из ПП STRANICA_7
call STOLB_1 ; Выбор 1-го столбца страницы.
;---> Возврат по стеку из ПП STOLB_1
call ZERO ; Сброс в 0 предыдущих показаний.
;---> Возврат по стеку из ПП ZERO
16
Далее, для обеспечения нормальной отработки процедуры вывода на индикацию
массива байтов, нужно "перегрузить" число текущего количества попугаев из регистра
N_Zapoln в регистр Temp:
;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦЫ ДАННЫХ ШКАЛЬНОГО ИНДИКАТОРА.
;////////////////////////////////////////////////////////////////////////////////
; Таблица конфигурации байтов, которыми заполняется шкала (без "выкрутасов").
; Через каждые 8 байтов выставлен маркер.
;================================================================================
TEXT_4 movlw high STR_4 ;
movwf PCLATH ;
addwf PCL,F ;
STR_4 Dt 0xFF,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; Темно-красным
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; цветом выделены
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC ; маркеры
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
Dt 0xFE,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC
;================================================================================
;------------------------------------
; Вариант концовки №2.
;------------------------------------
decf Temp,F ; Temp - 1 = ...
btfss Temp,7 ; В бит №7 регистра Temp 0 или 1 ?
goto $-7 ; Если 0, то на индикацию выводится
; следующий байт массива.
; Если это 1, то массив выведен и
; программа исполняется далее.
18
Если Вы думаете, что я сейчас буду заниматься тем, что я называю "на колу мочало",
то Вы ошибаетесь.
Все уже объяснено выше.
Разница только в номере страницы и коде картинки:
;--------------------------------------------------------------------------------
; Вывод данных на индикацию в 8-ю страницу ("паровоз и 6 вагонов").
;--------------------------------------------------------------------------------
call STRANICA_8 ;
;---> Возврат по стеку из ПП STRANICA_8
call STOLB_1 ;
;---> Возврат по стеку из ПП STOLB_1
call ZERO ;
;---> Возврат по стеку из ПП ZERO
movf N_Zapoln,W ;
movwf Temp ;
decf Temp,F ;
btfss Temp,7 ;
goto $-7 ;
.....................................
.....................................
;================================================================================
; Таблица конфигурации байтов, которыми заполняется шкала.
; С "выкрутасами" ("паровоз и 6 вагонов").
;================================================================================
TEXT_5 movlw high STR_5 ;
movwf PCLATH ;
addwf PCL,F ;
STR_5 Dt 0x70,0xF8,0xFC,0x74,0x7E,0xF4,0xFC,0x74
Dt 0x7C,0xFC,0xFC,0x7C,0x7C,0xFC,0xFC,0x78
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
Dt 0x40,0x7C,0xE4,0xE4,0x7C,0xE4,0xE4,0x7C
19