Спойлер
Код: Выделить всё
; если мы попали сюда -> было сгенерировано прерывание по изменению состояния на входах RB4, RB5, RB6, RB7
ORG 4h ; адрес вектора прерывания
movwf W_TEMP ; копируем W в регистр - дубликат
movf STATUS,W ; копируем STATUS в W
movwf ST_TEMP ; копируем W в регистр - дубликат
movf PORTB, W ; производим чтение порта B для исключения несоответствия
bcf INTCON, RBIF; сбрасываем флаг RBIF
btfss SUP_VS ; выявляем источник прерывания в порядке приоритетов - опрашиваем супервизор
goto SAVE ; сохраняем настройки в EEPROM, если супервизор в сброшенном состоянии
btfss ON_OFF_ENC ; опрашиваем кнопку энкодера
goto Button ; уходим в ПП обработки данных с кнопки, если кнопка была нажата
........
Button movlw .1 ; вводим константы для ожидания отжатия кнопки (1s)
movwf Reg_1 ; -//-
movlw .69 ; -//-
movwf Reg_2 ; -//-
movlw .21 ; -//-
movwf Reg_3 ; -//-
trc decfsz Reg_1, F
goto trc
btfsc ON_OFF_ENC ; ждем момента отжатия кнопки энкодера
goto incMETKA ; перескакиваем сюда, если отжата кнопка менее чем за 1 сек
clrwdt
decfsz Reg_2, F
goto trc
decfsz Reg_3, F
goto trc
goto Power_off ; отключаем устройствоПолный текст разрабатываемой программы.
Спойлер
Код: Выделить всё
LIST p=16F876A
#include <P16F876A.inc>
__CONFIG (_LVP_OFF & _CP_OFF & _CPD_OFF & _PWRTE_OFF & _WDT_ON & _HS_OSC & _BODEN_ON & _DEBUG_OFF )
cblock 0x20
W_TEMP ; временный регистр - дубликат W
ST_TEMP ; временный регистр - дубликат STATUS
Reg_1 ; временные регистры для ПП задержек в прерывании
Reg_2 ; -//-
Reg_3 ; -//-
TEMPS ; используем для меток установки U или I
Reg_tmp_I_L ; временные регистры для хранения уставок U и I
Reg_tmp_I_H ; -//-
Reg_tmp_U_L ; -//-
Reg_tmp_U_H ; -//-
Reg_4 ; тут храним шаблон для сравнения с нулевым результатом и подменой пустым знакоместом
Reg_tmpL ; сюда переносим данные перед трансформацией двоичного числа в десятичное
Reg_tmpH ; -//-
ctr ; временные регистры в ПП конвертации двоичного числа в десятичное
bcd1 ; -//-
bcd2 ; -//-
bcd3 ; -//-
bin1 ; -//-
bin2 ; -//-
TenK ; десятки тысяч
Thou ; тысячи
Hund ; сотни
Tens ; десятки
Ones ; единицы
Reg_tmp1 ; временные регистры для ПП задержек
Reg_tmp2 ; -//-
Reg_tmp3 ; -//-
Reg_tmp4 ; временные регистры для ПП задержек для ПП прерывания
Reg_tmp5 ; -//-
LCD_tmp ; временный регистр для вывода данных на LCD
endc
#define METKA TEMPS,0 ; используем для меток установки U или I
#define DAT_ENC PORTB,RB4 ; назначаем порт для ввода данных с энкодера
#define CLK_ENC PORTB,RB5 ; назначаем порт для ввода тактирующих импульсов с энкодера
#define ON_OFF_ENC PORTB,RB6 ; назначаем порт для кнопки энкодера
#define SUP_VS PORTB,RB7 ; назначаем порт для опроса супервизора
#define LED_ON bsf PORTC,RC7 ; назначаем вывод для управления подсветкой LCD
#define LED_OFF bcf PORTC,RC7 ; назначаем вывод для управления подсветкой LCD
#define E_1 bsf PORTC,RC6 ; назначаем вывод для команд E на PORTC для LCD
#define E_0 bcf PORTC,RC6 ; назначаем вывод для команд E на PORTC для LCD
#define RS_1 bsf PORTC,RC5 ; назначаем вывод для команд RS на PORTC для LCD
#define RS_0 bcf PORTC,RC5 ; назначаем вывод для команд RS на PORTC для LCD
#define D7_1 bsf PORTB,RB0 ; назначаем порты для вывода данных на LCD
#define D7_0 bcf PORTB,RB0 ; -//-
#define D6_1 bsf PORTB,RB1 ; -//-
#define D6_0 bcf PORTB,RB1 ; -//-
#define D5_1 bsf PORTB,RB2 ; -//-
#define D5_0 bcf PORTB,RB2 ; -//-
#define D4_1 bsf PORTB,RB3 ; -//-
#define D4_0 bcf PORTB,RB3 ; -//-
org 2100h ; На стадии "прошивки", записываем в EEPROM-ячейку,
de .100 ; с адресом 00h, число 100 (64)
org 2101h ; На стадии "прошивки", записываем в EEPROM-ячейку,
de .0 ; с адресом 01h, число 0 (0)
org 2102h ; На стадии "прошивки", записываем в EEPROM-ячейку,
de .30 ; с адресом 02h, число 30 (1E)
org 2103h ; На стадии "прошивки", записываем в EEPROM-ячейку,
de .0 ; с адресом 03h, число 0 (0)
org 2104h ; На стадии "прошивки", записываем в EEPROM-ячейку,
de .0 ; с адресом 04h, число 0 (0)
;;;;;;;;;;;;;;;;;;;
; старт программы;
;;;;;;;;;;;;;;;;;;;
org 0
goto START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; подпрограмма приема данных с энкодера;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; если мы попали сюда -> было сгенерировано прерывание по изменению состояния на входах RB4, RB5, RB6, RB7
ORG 4h ; адрес вектора прерывания
movwf W_TEMP ; копируем W в регистр - дубликат
movf STATUS,W ; копируем STATUS в W
movwf ST_TEMP ; копируем W в регистр - дубликат
movf PORTB, W ; производим чтение порта B для исключения несоответствия
bcf INTCON, RBIF; сбрасываем флаг RBIF
btfss SUP_VS ; выявляем источник прерывания в порядке приоритетов - опрашиваем супервизор
goto SAVE ; сохраняем настройки в EEPROM, если супервизор в сброшенном состоянии
btfss ON_OFF_ENC ; опрашиваем кнопку энкодера
goto Button ; уходим в ПП обработки данных с кнопки, если кнопка была нажата
ENC movlw .48 ; вводим константы ожидания приема данных 1 на CLK_ENC (150ms)
movwf Reg_1 ; -//-
movlw .11 ; -//-
movwf Reg_2 ; -//-
movlw .4 ; -//-
movwf Reg_3 ; -//-
ers btfsc CLK_ENC ; опрашиваем тактовый вход энкодера
goto READ_ENC ; уходим считывать данные, если на тактовом входе 1
decfsz Reg_1, F
goto ers
clrwdt
decfsz Reg_2, F
goto ers
decfsz Reg_3, F
goto ers
goto END_ENC ; уходим из ПП если закончилось время ожидания приема данных (150ms) (не дождались 1)
READ_ENC call del_1msc ; необходимо для устранения дребезга
movlw .48 ; вводим константы ожидания приема данных 0 на CLK_ENC (150ms)
movwf Reg_1 ; -//-
movlw .11 ; -//-
movwf Reg_2 ; -//-
movlw .4 ; -//-
movwf Reg_3 ; -//-
rew btfss CLK_ENC ; опрашиваем тактовый вход энкодера
goto READY ; уходим считывать данные, если на тактовом входе 0
decfsz Reg_1, F
goto rew
clrwdt
decfsz Reg_2, F
goto rew
decfsz Reg_3, F
goto rew
goto END_ENC ; уходим из ПП если закончилось время ожидания приема данных (150ms) (не дождались 0)
READY btfsc METKA ; для начала проверяем метку и исходя из этого меняем уставки U или I при повороте энкодера
goto UST_I ; -//-
btfss METKA ; -//-
goto UST_U ; -//-
UST_I btfsc DAT_ENC
goto I_UP
btfss DAT_ENC
goto I_DOWN
I_UP bcf STATUS, Z ; сбрасываем флаг Z
movlw 0x01 ; загружаем шаблон для проверки предельного результата 500
xorwf Reg_tmp_I_H,W; сравниваем со старшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto I_UPs
movlw 0xF4 ; загружаем шаблон для проверки предельного результата 500
xorwf Reg_tmp_I_L,W; сравниваем с младшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto I_UPs
goto ENC ; уходим отсюда (ничего не делаем если результат 500)
I_DOWN bcf STATUS, Z ; сбрасываем флаг Z
movlw 0x00 ; загружаем шаблон для проверки нулевого результата 001
xorwf Reg_tmp_I_H,W; сравниваем со старшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto I_DOWNs
movlw 0x01 ; загружаем шаблон для проверки нулевого результата 001
xorwf Reg_tmp_I_L,W; сравниваем с младшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto I_DOWNs
goto ENC ; уходим отсюда (ничего не делаем если результат 001)
I_UPs bcf STATUS, Z ; сбрасываем флаг Z
incf Reg_tmp_I_L,F; увеличиваем содержимое Reg_tmp_I_L
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=был перенос)
goto OUTPUT_I1
incf Reg_tmp_I_H,F; увеличиваем содержимое Reg_tmp_I_H
goto OUTPUT_I1
I_DOWNs bcf STATUS, Z ; сбрасываем флаг Z
decf Reg_tmp_I_L,F; уменьшаем содержимое Reg_tmp_I_L
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=был перенос)
goto OUTPUT_I1
decf Reg_tmp_I_H,F; уменьшаем содержимое Reg_tmp_I_H
goto OUTPUT_I1
OUTPUT_I1 call OUTPUT_I
goto ENC
UST_U btfsc DAT_ENC
goto U_UP
btfss DAT_ENC
goto U_DOWN
U_UP bcf STATUS, Z ; сбрасываем флаг Z
movlw 0x00 ; загружаем шаблон для проверки предельного результата 240
xorwf Reg_tmp_U_H,W; сравниваем со старшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto U_UPs
movlw 0xF0 ; загружаем шаблон для проверки предельного результата 240
xorwf Reg_tmp_U_L,W; сравниваем с младшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto U_UPs
goto ENC ; уходим отсюда (ничего не делаем если результат 240)
U_DOWN bcf STATUS, Z ; сбрасываем флаг Z
movlw 0x00 ; загружаем шаблон для проверки нулевого результата 001
xorwf Reg_tmp_U_H,W; сравниваем со старшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto U_DOWNs
movlw 0x01 ; загружаем шаблон для проверки нулевого результата 001
xorwf Reg_tmp_U_L,W; сравниваем с младшим регистром
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=совпали данные)
goto U_DOWNs
goto ENC ; уходим отсюда (ничего не делаем если результат 001)
U_UPs bcf STATUS, Z ; сбрасываем флаг Z
incf Reg_tmp_U_L,F; увеличиваем содержимое Reg_tmp_U_L
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=был перенос)
goto OUTPUT_U1
incf Reg_tmp_U_H,F; увеличиваем содержимое Reg_tmp_U_H
goto OUTPUT_U1
U_DOWNs bcf STATUS, Z ; сбрасываем флаг Z
decf Reg_tmp_U_L,F; уменьшаем содержимое Reg_tmp_U_L
btfss STATUS, Z ; проверяем состояние флага Z, пропускаем если 1 (1=был перенос)
goto OUTPUT_U1
decf Reg_tmp_U_H,F; уменьшаем содержимое Reg_tmp_U_H
goto OUTPUT_U1
OUTPUT_U1 call OUTPUT_U
goto ENC
Button movlw .1 ; вводим константы для ожидания отжатия кнопки (1s)
movwf Reg_1 ; -//-
movlw .69 ; -//-
movwf Reg_2 ; -//-
movlw .21 ; -//-
movwf Reg_3 ; -//-
trc decfsz Reg_1, F
goto trc
btfsc ON_OFF_ENC ; ждем момента отжатия кнопки энкодера
goto incMETKA ; перескакиваем сюда, если отжата кнопка менее чем за 1 сек
clrwdt
decfsz Reg_2, F
goto trc
decfsz Reg_3, F
goto trc
goto Power_off ; отключаем устройство
TABL_dig andlw b'00001111' ; маскируем старший полубайт W (обнуляем 4 старших байта)
addwf PCL,f ; Содержимое счетчика команд PC увеличивается на величину содержимого аккумулятора W.
retlw 0x30 ; 0
retlw 0x31 ; 1
retlw 0x32 ; 2
retlw 0x33 ; 3
retlw 0x34 ; 4
retlw 0x35 ; 5
retlw 0x36 ; 6
retlw 0x37 ; 7
retlw 0x38 ; 8
retlw 0x39 ; 9
retlw 0x41 ; A
retlw 0x42 ; B
retlw 0x43 ; C
retlw 0x44 ; D
retlw 0x45 ; E
retlw 0x46 ; F
incMETKA movlw B'00000001' ; инвертируем нулевой бит регистра TEMPS
xorwf TEMPS, F ; -//-
btfss METKA ; обновляем местоположение метки
call METKA_L ; -//-
btfsc METKA ; -//-
call METKA_H ; -//-
goto END_ENC ; метка установлена, выходим из прерывания
END_ENC movf ST_TEMP,W ; возвращаем прежние значения в STATUS и W
movwf STATUS ; -//-
swapf W_TEMP,f ; -//-
swapf W_TEMP,W ; -//-
bsf INTCON, GIE ; разрешаем прерывания
retfie ; возврат из прерывания GIE устанавливается в 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; подготовительные операции;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START bcf STATUS,RP0 ; переход в банк 0
banksel OPTION_REG ; переходим в регистр OPTION_REG
movlw b'00001101' ; включаем подтягивающие резисторы PORTB, включаем предделитель перед WDT 1:32
movwf OPTION_REG ; -//-
banksel INTCON ; переходим в регистр INTCON
movlw b'00001000' ; глобальный запрет прерываний, разрешение прерываний по изменению сигнала на входах RB4 - RB7
movwf INTCON ; -//-
banksel PIE1 ; переходим в регистр PIE1
movlw b'00000000' ; глобальный запрет периферийных прерываний
movwf PIE1 ; -//-
banksel TRISA ; переходим в регистр PORTA
movlw b'00101111' ; настраиваем RA0, RA1, RA2, RA3, RA5 на вход, остальные на выход
movwf TRISA ; -//-
banksel TRISB ; переходим в регистр PORTB
movlw b'11110000' ; настраиваем все порты на выход, RB4, RB5, RB6, RB7 на вход
movwf TRISB ; -//-
banksel TRISC ; переходим в регистр PORTC
movlw b'00000000' ; настраиваем все порты на выход
movwf TRISC ; -//-
banksel T1CON ; переходим в регистр T1CON
movlw b'00000000' ; отключаем модуль T1CON
movwf T1CON ; -//-
banksel T2CON ; переходим в регистр T2CON
movlw b'00000000' ; отключаем модуль T2CON
movwf T2CON ; -//-
banksel CCP1CON ; переходим в регистр CCP1CON
movlw b'00000000' ; отключаем модуль CCP1
movwf CCP1CON ; -//-
banksel CCP2CON ; переходим в регистр CCP2CON
movlw b'00000000' ; отключаем модуль CCP2
movwf CCP2CON ; -//-
banksel SSPSTAT ; переходим в регистр SSPSTAT
movlw b'00000000' ; отключаем модуль SSPSTAT
movwf SSPSTAT ; -//-
banksel SSPCON ; переходим в регистр SSPCON
movlw b'00000000' ; отключаем модуль SSPCON
movwf SSPCON ; -//-
banksel SSPCON2 ; переходим в регистр SSPCON2
movlw b'00000000' ; отключаем модуль SSPCON2
movwf SSPCON2 ; -//-
banksel TXSTA ; переходим в регистр TXSTA
movlw b'00000000' ; отключаем модуль TXSTA
movwf TXSTA ; -//-
banksel RCSTA ; переходим в регистр RCSTA
movlw b'00000000' ; отключаем модуль RCSTA
movwf RCSTA ; -//-
banksel ADCON0 ; переходим в регистр ADCON0
movlw b'00000000' ; отключаем модуль АЦП
movwf ADCON0 ; -//-
banksel ADCON1 ; переходим в регистр ADCON1
movlw b'00000000' ; отключаем модуль АЦП
movwf ADCON1 ; -//-
bcf STATUS,RP0 ; переход в банк 0
call READY_EEP ; отправляемся читать данные из EEPROM
clrf Reg_tmp_U_H ; удаляем данную строку, если необходимо хранить уставки напряжения выше 25,5V
;;;;;;;;;;;;;;;;;;;;;;;;;
; инициализация дисплея;
;;;;;;;;;;;;;;;;;;;;;;;;;
call del_100ms ; начальная задержка 100 милисекунд
movlw b'00110011' ; инициализация дисплея пока вкл 8 разрядов
call LCD_com ; грузим 0011 3 раза и один раз 0010
movlw b'00110010' ; -//-
call LCD_com ; -//-
movlw b'00100000' ; инициализация дисплея уже по 4х2 разрядам
call LCD_com ; -//-
movlw b'00101000' ; вкл 4 разрядный ввод данных, размер символа 5х8 символов
call LCD_com ; -//-
movlw b'00000110' ; сдвиг курсора вправо
call LCD_com ; -//-
movlw b'00001100' ; отключаем курсор
call LCD_com ; -//-
movlw b'00010100' ; двигаем курсор вправо
call LCD_com ; -//-
movlw b'00000001' ; очищаем дисплей
call LCD_com ; -//-
; выставляем метку уставок I или U
btfss METKA
call METKA_L
btfsc METKA
call METKA_H
; выставляем значение уставки U и I
call OUTPUT_U
call OUTPUT_I
gooo LED_ON
movlw 0x80 ; курсор в пределах первой строки ( 0x80 - начало )
call LCD_com ; загружаем команду
movlw 0x55 ; U
call LCD_dig ; загружаем данные
movlw 0x3D ; =
call LCD_dig ; загружаем данные
movlw 0x32 ; 2
call LCD_dig ; загружаем данные
movlw 0x33 ; 3
call LCD_dig ; загружаем данные
movlw 0x2E ; .
call LCD_dig ; -//-
movlw 0x30 ; 0
call LCD_dig ; загружаем данные
movlw 0x56 ; =
call LCD_dig ; загружаем данные
bsf INTCON, GIE ; разрешаем прерывания
call del_100ms
call del_100ms
call del_100ms
bcf INTCON, GIE ; запрещаем прерывания
goto gooo
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Подпрограмма конвертации двоичного числа в десятичное;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TRANSFORMER_dig
movf Reg_tmpL,W ; копируем младший байт результата преобразования АЦП в
movwf bin2 ; в bin2
movf Reg_tmpH,W ; копируем старший байт результата преобразования АЦП в
movwf bin1 ; в bin1
;bin2 = младший байт преобразуемого числа
;bin1 = старший байт преобразуемого числа
;bcd3 ( младший полубайт ) = единицы
;bcd3 ( старший полубайт ) = десятки
;bcd2 ( младший полубайт ) = сотни
;bcd2 ( старший полубайт ) = тысячи
;bcd1 ( младший полубайт ) = десятки тысяч
movlw .16
movwf ctr
clrf bcd1
clrf bcd2
clrf bcd3
goto start
adjdec movlw 0x33
addwf bcd1,f
addwf bcd2,f
addwf bcd3,f
movlw 0x03
btfss bcd1,3
subwf bcd1,f
btfss bcd2,3
subwf bcd2,f
btfss bcd3,3
subwf bcd3,f
movlw 0x30
btfss bcd1,7
subwf bcd1,f
btfss bcd2,7
subwf bcd2,f
btfss bcd3,7
subwf bcd3,f
start rlf bin2,f
rlf bin1,f
rlf bcd3,f
rlf bcd2,f
rlf bcd1,f
decfsz ctr,f
goto adjdec ; окончание конвертирования
movf bcd1,w ; распределение результата по регистрам
movwf TenK ; десятки тысяч
swapf bcd2,w
movwf Thou ; тысячи
movf bcd2,w
movwf Hund ; сотни
swapf bcd3,w
movwf Tens ; десятки
movf bcd3,w
movwf Ones ; единицы
return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Подпрограмма вывода данных на HD44780;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; загрузка комманды
LCD_com movwf LCD_tmp
E_0
RS_0
call LCD_load
return
; загрузка цифры
LCD_dig movwf LCD_tmp
E_0
RS_1
call LCD_load
return
; загрузка данных в дисплей со стробированием
LCD_load btfsc LCD_tmp,7
D7_1
btfss LCD_tmp,7
D7_0
btfsc LCD_tmp,6
D6_1
btfss LCD_tmp,6
D6_0
btfsc LCD_tmp,5
D5_1
btfss LCD_tmp,5
D5_0
btfsc LCD_tmp,4
D4_1
btfss LCD_tmp,4
D4_0
E_1
call del_1ms
E_0
call del_1ms
btfsc LCD_tmp,3
D7_1
btfss LCD_tmp,3
D7_0
btfsc LCD_tmp,2
D6_1
btfss LCD_tmp,2
D6_0
btfsc LCD_tmp,1
D5_1
btfss LCD_tmp,1
D5_0
btfsc LCD_tmp,0
D4_1
btfss LCD_tmp,0
D4_0
E_1
call del_1ms
E_0
call del_1ms
return
; ЗАДЕРЖКА 20 mcs
del_20mcs movlw .26
movwf Reg_tmp1
wr1 decfsz Reg_tmp1, F
goto wr1
return
; ЗАДЕРЖКА 1 ms
del_1ms movlw .46
movwf Reg_tmp1
movlw .6
movwf Reg_tmp2
wr2 decfsz Reg_tmp1, F
goto wr2
decfsz Reg_tmp2, F
goto wr2
return
; ЗАДЕРЖКА 1 ms в ПП прерывания
del_1msc movlw .46
movwf Reg_tmp4
movlw .6
movwf Reg_tmp5
wr4 decfsz Reg_tmp4, F
goto wr4
decfsz Reg_tmp5, F
goto wr4
return
; ЗАДЕРЖКА 5 ms
del_5ms call del_1ms
call del_1ms
call del_1ms
call del_1ms
call del_1ms
return
; ЗАДЕРЖКА 50 ms
del_50ms movlw .186
movwf Reg_tmp1
movlw .4
movwf Reg_tmp2
movlw .2
movwf Reg_tmp3
wr3 decfsz Reg_tmp1, F
goto wr3
decfsz Reg_tmp2, F
goto wr3
decfsz Reg_tmp3, F
goto wr3
clrwdt
return
; ЗАДЕРЖКА 100 ms
del_100ms call del_50ms
call del_50ms
return
; ставим верхнюю метку
METKA_L movlw 0x89 ; курсор в пределах первой строки ( 0x80 - начало )
call LCD_com ; загружаем команду
movlw 0x3E ; > ставим верхнюю метку
call LCD_dig ; загружаем данные
movlw 0xC9 ; курсор в пределах второй строки ( 0xC0 - начало )
call LCD_com ; загружаем команду
movlw 0x20 ; стираем нижнюю метку
call LCD_dig ; загружаем данные
return
; ставим нижнюю метку
METKA_H movlw 0x89 ; курсор в пределах первой строки ( 0x80 - начало )
call LCD_com ; загружаем команду
movlw 0x20 ; стираем верхнюю метку
call LCD_dig ; загружаем данные
movlw 0xC9 ; курсор в пределах второй строки ( 0xC0 - начало )
call LCD_com ; загружаем команду
movlw 0x3E ; > ставим нижнюю метку
call LCD_dig ; загружаем данные
return
; выводим данные устаки U
OUTPUT_U movf Reg_tmp_U_L,W; копируем в W содержимое Reg_tmp_U_L
movwf Reg_tmpL
movf Reg_tmp_U_H,W; копируем в W содержимое Reg_tmp_U_H
movwf Reg_tmpH
movlw 0x8B ; курсор в пределах первой строки ( 0x80 - начало )
call LCD_com ; загружаем команду
call TRANSFORMER_dig
movlw 0x30 ; подменяем пустым знакоместом , если первый 0
movwf Reg_4 ; -//-
movf Hund,W ; -//-
call TABL_dig ; -//-
xorwf Reg_4,F ; -//-
skpnz ; -//-
movlw 0x20 ; -//-
call LCD_dig ; -//-
end

