Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
То, о чем пойдет речь в этом подразделе, дает прямой выход на "ваяние" цифрового,
в том числе и многоканального осциллографа (или что-то типа этого), что, как сами
понимаете, весьма не слабо (цена этих "штуковин" удивляет очень сильно).
В том числе и с памятью.
Я не просто так упорно занимался шкальными индикаторами, а по очень могучему
поводу.
Дело в том, что, в соответствии с принципом "от простого к сложному", картинку
шкального индикатора можно, достаточно просто, "трансформировать" в картинку
эпюры.
Сейчас докажу (в приложении к одному каналу):
;********************************************************************************
; 12864_21.asm Переход от шкального индикатора к эпюре
; (отображение чисел в форме импульса).
;********************************************************************************
.....................................
.....................................
;----------------------------------------------
; Объем программы: 1200 слов в памяти программ.
;================================================================================
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 - указатель страницы).
Reg1 equ 25h ; Регистр счетчика количества попугаев
1
; верхней шкалы.
N_Zapoln1 equ 26h ; Регистр количества байтов заполнения
; верхней шкалы (для 1-го кристалла).
N_Zapoln2 equ 27h ; Регистр количества байтов заполнения
; верхней шкалы (для 2-го кристалла).
Flag equ 28h ; Указатель кристалла.
LED0 equ 30h ; Регистры, задействованные
LED1 equ 31h ; в ПП 2/10 преобразования.
;================================================================================
; Присвоение битам названий.
;================================================================================
.....................................
.....................................
;================================================================================
org 0 ; Начать выполнение программы с 0 адреса PC.
goto START ; Переход в ПП START.
;********************************************************************************
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм, обеспечивающая "побайтное" формирование символов цифр
; ("знакогенератор").
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Символ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "пробел".
;--------------------------------------------------------------------------------
Z_0....10
.....................................
;================================================================================
; Подпрограммы выбора страниц 1, 2, 3, 4, 5, 6, 7, 8.
;================================================================================
STRANICA_1...8
.....................................
;================================================================================
; Подпрограмма записи данных.
;================================================================================
WRITE_D
.....................................
;================================================================================
; Подпрограмма чтения данных.
;================================================================================
READ_D
.....................................
;================================================================================
; Подпрограмма стробирования.
;================================================================================
STROB
.....................................
;================================================================================
; Подпрограмма установки первого (самого левого) столбца страницы (адрес 00h).
;================================================================================
STOLB_1
.....................................
;================================================================================
; Подпрограмма заполнения страницы нулями.
;================================================================================
ZERO
.....................................
;================================================================================
; Подпрограмма выбора страницы, в случае совмещения 4-х таблиц,
; относящихся к одному кристаллу.
;================================================================================
VIBOR
.....................................
;================================================================================
; Подпрограмма числовой коррекции адреса "прыжка".
;================================================================================
2
N_STR
.....................................
;================================================================================
; ЗАДЕРЖКА (0,3 сек.)
;================================================================================
PAUSE
.....................................
;================================================================================
; Подпрограмма "обнуления" 4, 7 и 8 страниц.
;================================================================================
SBROS_STR call STRANICA_7 ; Выбор 7-й страницы.
call ZERO ; И заполнение ее нулями.
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START
.....................................
.....................................
;================================================================================
; Инициализация графического модуля.
;================================================================================
.....................................
.....................................
;################################################################################
; Вывод на индикацию картинки 1-го "кадра".
;################################################################################
4
;*************************************
; Переход на 2-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 2-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
;--------------------------------------------------------------------------------
; Запись в 4, 7, 8 страницы 2-го кристалла (заполнение их нулями).
;--------------------------------------------------------------------------------
call SBROS_STR ; Переход в ПП "обнуления" 4, 7 и 8 страниц.
;*************************************
; Переход на 1-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 1-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
;--------------------------------------------------------------------------------
; Запись в 4, 8 страницы 1-го кристалла (заполнение их нулями).
;--------------------------------------------------------------------------------
call SBROS_STR_1 ; Переход в ПП "обнуления" 4 и 8 страниц.
;################################################################################
;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Переход на 2-й кристалл.
;-------------------------------------
SNOVA bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
bsf Flag,7 ; Указание на активность 2-го кристалла.
;-------------------------------------
; Работа в 7 странице 2-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; и маркера периода.
;-------------------------------------
; Переход на 1-й кристалл.
;-------------------------------------
bsf PortB,E1 ; Включение 1-го кристалла.
bcf PortB,E2 ; Выключение 2-го кристалла.
bcf Flag,7 ; Указание на активность 1-го кристалла.
;-------------------------------------
; Работа в 7 странице 1-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; без маркера периода.
;-------------------------------------
; Сброс указателя кристалла.
;-------------------------------------
clrf Flag ; Flag = 0.
;================================================================================
; "Закольцовка" счета и запись текущего количества попугаев
; в регистры оперативной памяти.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Теперь, текущее, двоичное количество попугаев нужно
5
; стандартно перевести в "набор" 2/10 чисел.
;--------------------------------------------------------------------------------
call BIN2_10 ; Переход в ПП 2/10 преобразования
; (то, что нужно преобразовать, "лежит"
; в Mem1).
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Вывод результата "подсчета" количества попугаев
; на индикацию в графический модуль.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Задание "координаты", с которой начнется запись байтов данных.
;--------------------------------------------------------------------------------
call STRANICA_5 ; Выбор 5-й страницы.
movlw b'01100000' ; Выбор адреса 33-го столбца (20h).
movwf PortC ; Вывод инструкции "Set Address" в порт С.
call STROB ; Строб под инструкцию.
;--------------------------------------------------------------------------------
; Группа команд гашения незначащих нулей.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Администраторская" подпрограмма.
;--------------------------------------------------------------------------------
ADMIN
.....................................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Будем работать только в 1-м кристалле или в обеих? Анализ, "оргвыводы".
;================================================================================
.....................................
.....................................
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
btfss Flag,0 ; Работа в 7-й странице 2-го кристалла есть
; или ее нет?
goto $+7 ; Если нет, то обход "убийства паразита".
; Если есть, то "убийство паразита".
movlw b'01111111' ; Выбор адреса 64-го столбца (3Fh).
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
movlw b'00000001' ;
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
6
;================================================================================
.....................................
.....................................
;////////////////////////////////////////////////////////////////////////////////
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм вывода на индикацию символов цифр.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.....................................
.....................................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;################################################################################
; ТАБЛИЦЫ ДАННЫХ 1-го "КАДРА".
;################################################################################
.....................................
.....................................
;--------------------------------------------------------------------------------
; Данные 6-й страницы 1-го кристалла (код картинки градуировки).
;--------------------------------------------------------------------------------
TEXT_3
.....................................
STR_3 Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x3C,0x08 ; Картинка
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; градуировки
Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; (3Ch -
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08 ; вертикальные
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08 ; линии).
DT 0x08,0x08,0x08,0x08
;################################################################################
;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦА ДАННЫХ ЭПЮРЫ.
;////////////////////////////////////////////////////////////////////////////////
TEXT_4 ; 1-й байт
..................................... ; массива (0xFF)
; формирует
STR_4 Dt 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку спада
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; импульса.
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; Остальные байты
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; (0x01)
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; формируют
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; единичного
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; уровня.
;////////////////////////////////////////////////////////////////////////////////
;================================================================================
; Подпрограмма двоично-десятичного преобразования Сергея Рослика.
;================================================================================
BIN2_10
.....................................
;********************************************************************************
end ; Конец программы
7
Темно-красным цветом выделено то, что относится к "обнулению" страниц
графического модуля.
Темно-синим цветом выделено то, что относится к картинке градуировки (шаг - 10
позиций).
Красным цветом выделено то, что относится к картинке линии нулевого уровня и
маркера периода.
"Мать" - программа 12864_19.asm.
;================================================================================
; Подпрограмма "обнуления" 4, 7 и 8 страниц.
;================================================================================
SBROS_STR call STRANICA_7 ; Выбор 7-й страницы.
call ZERO ; И заполнение ее нулями.
В части касающейся работы во 2-м кристалле, картинка 1-го "кадра" формируется так
же, как и в "матери" (goto SBROS_STR).
В части касающейся работы во 1-м кристалле, - то же самое, за исключением
"обнуления" 7-й страницы (goto SBROS_STR_1).
Какой смысл тратить на это время, если сразу же после вывода на индикацию
картинки 1-го "кадра", в 7-ю страницу 1-го кристалла, производится запись (по верху)
картинки линии нулевого уровня, причем, в полном объеме страницы.
В принципе, то же самое можно было сделать и в 7-й странице 2-го кристалла, но в
этом случае, в интервале "нерабочих" позиций (от 101 до 128), "навсегда заторчит
бесполезная и глупая" линия нулевого уровня.
Да и маркер периода выставить нужно. Иначе, если ориентироваться по градуировке,
это будет выглядеть не очень-то и комфортно.
Я сделал так.
В начале ПП SNOVA, в 7-ю страницу 1-го кристалла, выводится, по всей ее длине (64
байта), "непромаркированная" линия нулевого уровня.
В 7-ю страницу 2-го кристалла, она тоже выводится, но не по всей длине страницы, а
до 35 позиции включительно, плюс маркер периода (36 позиция).
В итоге, это соответствует выставлению маркера периода на сотой позиции
(64+36=100).
8
О том, как это конкретно делается, будет рассказано ниже, а пока нужно "усечь" то,
что в 1-м "кадре", 7-ю страницу 2-го кристалла нужно "обнулить".
Если этого не сделать, то левее маркера периода, будет "красота и ляпота", а правее
- "чернота" (FFh).
Сказанное и объясняет то, что при выводе на индикацию картинки 1-го "кадра", 7-ю
страницу 2-го кристалла нужно "обнулить", а 7-ю страницу 1-го кристалла можно и не
"обнулять".
Та "чернота", которая, в последнем случае, будет иметь место быть, "промелькнет с
таким реактивным свистом", что человеческий глаз этого просто не заметит.
Сия "концепция" и реализована (дает выигрыш по скорости отработки 1-го "кадра").
;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Переход на 2-й кристалл.
;-------------------------------------
SNOVA bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
bsf Flag,7 ; Указание на активность 2-го кристалла.
;-------------------------------------
; Работа в 7 странице 2-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; и маркера периода.
;-------------------------------------
; Переход на 1-й кристалл.
;-------------------------------------
bsf PortB,E1 ; Включение 1-го кристалла.
bcf PortB,E2 ; Выключение 2-го кристалла.
bcf Flag,7 ; Указание на активность 1-го кристалла.
;-------------------------------------
; Работа в 7 странице 1-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; без маркера периода.
;-------------------------------------
; Сброс указателя кристалла.
;-------------------------------------
clrf Flag ; Flag = 0.
;================================================================================
; "Закольцовка" счета и запись текущего количества попугаев
; в регистры оперативной памяти.
;================================================================================
9
;================================================================================
; Подпрограмма записи, в 7-ю страницу, картинки линии нулевого уровня
; и маркера периода.
;================================================================================
LIN_MARKER call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.11 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movlw .36 ; Задание количества
movwf Temp ; проходов.
;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦА ДАННЫХ ЭПЮРЫ.
;////////////////////////////////////////////////////////////////////////////////
TEXT_4 ; 1-й байт
..................................... ; массива (0xFF)
; формирует
STR_4 Dt 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку спада
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; импульса.
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; Остальные байты
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; (0x01)
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; формируют
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; единичного
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; уровня.
;////////////////////////////////////////////////////////////////////////////////
Если спад импульса формируется в 7-й странице 2-го кристалла, то в 64-й позиции
7-й страницы 1-го кристалла, гнусно фиксируется "паразит/вражина/гнус/…,
представляющий собой спад импульса (байт FFh), который, как бы, "не смог
преодолеть границы", разделяющей кристаллы.
11
Вот он там и "заторчал", нарушая всю "эстетику".
Проще всего его "убить" записью, по верху, одного байта линии единичного уровня
(01h), что и имеет место быть:
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Будем работать только в 1-м кристалле или в обеих? Анализ, "оргвыводы".
;================================================================================
.....................................
.....................................
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
btfss Flag,0 ; Работа в 7-й странице 2-го кристалла есть
; или ее нет?
goto $+7 ; Если нет, то обход "убийства паразита".
; Если есть, то "убийство паразита".
movlw b'01111111' ; Выбор адреса 64-го столбца (3Fh).
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
movlw b'00000001' ;
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
.....................................
.....................................
;////////////////////////////////////////////////////////////////////////////////
;################################################################################
; Вывод на индикацию картинки 1-го "кадра".
;################################################################################
;*************************************
; Переход на 2-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 2-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
.....................................
;*************************************
; Переход на 1-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 1-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
.....................................
;################################################################################
;================================================================================
; ПП записи в 6-ю страницу (картинка градуировки с шагом в 10 позиций).
;================================================================================
ZAPIS_STR6 call STRANICA_6 ; Выбирается 1-й столбец
call STOLB_1 ; 6-й страницы.
movlw .64 ; Задание количества
movwf Temp ; проходов.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.12 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movf Temp,W ;
sublw .68 ; .68 - Temp = ...
;--------------------------------------------------------------------------------
; Данные 6-й страницы 1-го кристалла (код картинки градуировки).
;--------------------------------------------------------------------------------
TEXT_3
.....................................
STR_3 Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x3C,0x08 ; Картинка
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; градуировки
Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; (3Ch -
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08 ; вертикальные
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08 ; линии).
DT 0x08,0x08,0x08,0x08
Не трудно заметить то, что в этой таблице, вертикальные линии (3Ch) "разбросаны"
через каждые 10 позиций, и то, что в таблице не 64, а 68 байтов.
Это необходимо для обеспечения равномерности градуировки (в пределах дисплея).
То есть, в 6-ю страницу 1-го кристалла выводятся первые 64 байта (с 1-го по 64-й).
В 6-ю страницу 2-го кристалла тоже выводятся 64 байта, но только начиная не от
первого, а от 5-го (с 5-го по 68-й).
ПП ZAPIS_STR6 начинается с выбора 1-го столбца 6-й страницы, что вполне
естественно.
Далее, в регистре Temp, предустанавливается число проходов (.64).
Эта предустановка используется в обеих случаях.
Далее, в зависимости от того, какой именно кристалл включен (проверка бита №7
регистра Flag), имеет место быть два сценария:
Ну и ладушки.
А вот теперь, имеет место быть "красота несусветная", а заодно и ущербное чувство
частично выполненного долга.
"Частично" потому, что имеют место быть угрызения совести, связанные с программной
оптимизацией процедур вывода данных на индикацию в 7-е страницы.
Значит, "пулемет в руки, и айн, цвай, драй …".
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;--------------------------------------------------------------------------------
; Процедура вывода на индикацию массива байтов.
;--------------------------------------------------------------------------------
movf N_Zapoln1,W ; Копирование количества байтов заполнения
movwf Temp ; шкалы в регистр Temp
; (назначение числа проходов).
btfss Status,Z ; Результат операции =0 или не=0 ?
goto $+3 ; Если не=0, то формируется линия единичного
; уровня и спада.
call VIVOD_FF ; Если =0, то формируется только спад.
goto $+2 ;
call VIVOD_01_FF ;
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
.....................................
.....................................
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
.....................................
.....................................
15
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;--------------------------------------------------------------------------------
; Процедура вывода на индикацию массива байтов.
;--------------------------------------------------------------------------------
movf N_Zapoln2,W ;
movwf Temp ;
btfss Status,Z ; Аналогично (см. выше),
goto $+3 ; только для N_Zapoln2.
call VIVOD_FF ;
goto VIHOD ;
call VIVOD_01_FF ;
;////////////////////////////////////////////////////////////////////////////////
VIHOD call PAUSE ; Задержка 0,3 сек.
;================================================================================
; Далее - "на колу мочало" ("закольцовка").
;================================================================================
goto SNOVA ; Переход на следующий цикл программы.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;================================================================================
; Подпрограмма записи, в 7-ю страницу, картинок линии единичного уровня и спада.
;================================================================================
; Картинка линии единичного уровня.
;------------------------------------
VIVOD_01_FF movlw 1 ; W -> .1 (0000 0001)
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
decfsz Temp,F ; Если результат не=0, то
goto $-4 ; выводится следующий байт (01h).
; Если =0, то программа исполняется далее.
;------------------------------------
; Картинка спада.
;------------------------------------
VIVOD_FF movlw b'11111111' ; W -> .255 (1111 1111)
movwf PortC ; .255 выводится в порт С.
call WRITE_D ; Записывается.
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================
;********************************************************************************
; 12864_23.asm Переход от шкального индикатора к эпюре (отображение чисел в
; форме импульса). Оптимизированный вариант №2.
;********************************************************************************
.....................................
.....................................
;----------------------------------------------
; Объем программы: 1148 слов в памяти программ.
;================================================================================
.....................................
.....................................
;================================================================================
; Регистры общего назачения.
;================================================================================
.....................................
.....................................
Bufer equ 29h ; Регистр оперативной памяти результата
; предыдущего цикла.
.....................................
.....................................
;================================================================================
org 0 ; Начать выполнение программы с 0 адреса PC.
goto START ; Переход в ПП START.
;********************************************************************************
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.....................................
.....................................
.....................................
.....................................
;================================================================================
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START
.....................................
17
.....................................
clrf Bufer ; Подготовка к работе регистра оперативной
; памяти результата предыдущего цикла.
;================================================================================
.....................................
.....................................
.....................................
.....................................
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Анализ содержимого регистра оперативной памяти результата
; предыдущего цикла (Bufer).
;--------------------------------------------------------------------------------
movf Bufer,W ;
sublw .64 ; .64 - Bufer = ...
movlw .64 ;
subwf N_Zapoln1,W ; N_Zapoln1 - .64 = ... (результат -> W).
btfss Status,C ; Результат "+" или "-" ?
goto $+5 ; Если "-" (C=0 -> число - до .63
; включительно), то работаем только
; в 1-м кристалле.
movwf N_Zapoln2 ; Если "+" или =0 (C=1 -> число от .64 и
; более), то
; 1. W (разница) -> N_Zapoln2 (подготовка
; данных для той части шкалы, которая "лежит"
; во 2-м кристалле.
bsf Flag,0 ; 2. Установка флага указателя кристалла
; (разрешение работы во 2-м кристалле).
movlw .63 ; 3. Подготовка к "сплошному" заполнению
movwf N_Zapoln1 ; шкалы в части касающейся 1-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
18
;================================================================================
.....................................
.....................................
.....................................
.....................................
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
KRISTALL_2 bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
movf N_Zapoln1,W ; N_Zapoln -> Bufer.
movwf Bufer
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
;********************************************************************************
end ; Конец программы.
19
Примечание: в программе 12864_21.asm, "упор делался" на "командную" оптимизацию,
а в программе 12864_22.asm, "упор делался" на "скоростную" оптимизацию.
В конечном итоге, программа 12864_22.asm представляет собой некий "гибрид" первого
со вторым.
По-моему, получилось вполне сносно (по сравнению с тем, с чего начато).
А можно и лучше.
Прогресс, это такая "штуковина", которая вообще не имеет "границ".
Надеюсь на то, что Вы внесете в это благое дело свою лепту.
20