;;********************************************************************** ;;Для процедуры вывода и подготовки данных на дисплей ; Disp_1_1 ;Регистр данных для 1го индикатора, 1й разряд ; Disp_1_2 ;Регистр данных для 1го индикатора, 2й разряд ; Disp_1_3 ;Регистр данных для 1го индикатора, 3й разряд ; Disp_2_1 ;Регистр данных для 2го индикатора, 1й разряд ; Disp_2_2 ;Регистр данных для 2го индикатора, 2й разряд ; Disp_2_3 ;Регистр данных для 2го индикатора, 3й разряд ; CNT_RX_bit ;Счетчик передаваемого бита на дисплей ; CNT_RX_byte ;Счетчик передаваемого байта на дисплей ; TX_reg ;Регистр сдвига для вывода данных ; Temp_disp ;Промежуточный регистр ;;Для процедуры преобразования BIN->BCD ; In_byte_hi ; Старший байт преобразования BIN->BCD ; In_byte_lo ; Младший байт преобразования BIN->BCD ; count ; Регистр счетчика процедуры BIN->BCD ; temp ; Промежуточный регистр процедуры BIN->BCD ; R0 ; Результат преобразования (0:дес.тыс.) ; R1 ; Результат преобразования (тыс.:сот.) ; R2 ; Результат преобразования (дес.:ед.) ;;********************************************************************** ;; Назначение выводов микроконтроллера ;#define Disp_CLK GPIO,2 ;Выход тактирования для индикатора ;#define Disp_DAT GPIO,4 ;Выход данных для индикатора ;#define Disp_CTR GPIO,5 ;Выход управления дисплеем (вкл/откл) ;********************************************************************** ; Таблица дешифратора значения BCD в код индикатора ;********************************************************************** Tabl_decode ; andlw b'00001111' ;Маскируем "лишние" биты addwf PCL,f ;Модифицируем PCL ; gfabhcde retlw b'01110111' ;"0" retlw b'00010100' ;"1" retlw b'10110011' ;"2" retlw b'10110110' ;"3" retlw b'11010100' ;"4" retlw b'11100110' ;"5" retlw b'11100111' ;"6" retlw b'00110100' ;"7" retlw b'11110111' ;"8" retlw b'11110110' ;"9" retlw b'00000000' ;" " retlw b'10000000' ;"-" retlw b'00000000' ;резерв retlw b'00000000' ;резерв retlw b'00000000' ;резерв retlw b'00000000' ;резерв retlw b'00000000' ;резерв ;********************************************************************** ;********************************************************************** ; Процедура загрузки данных на индикатор (6byte) из RAM начиная с ячейки Disp_1_1 ;********************************************************************** Disp_load ; bcf Disp_CTR ;Гасим индикатор (на момент обновления данных) movlw 0x06 ;Загружаем CNT_RX_byte movwf CNT_RX_byte ;(передаем 6 байт) DL_loop ; movlw Disp_1_1 - 1 ;Рассчитываем адрес передаваемого байта addwf CNT_RX_byte,w ;(Adr[Disp_1_1] - 1) + CNT_RX_byte - > FSR movwf FSR ; movfw INDF ;Сохраняем передаваемые данные movwf TX_reg ;в регистре TX_reg movlw 0x08 ;Загружаем CNT_RX_bit movwf CNT_RX_bit ;(передаем 8 бит) DL_RX_loop ; rlf TX_reg,f ;"C" << TX_reg bcf Disp_DAT ;Бит переноса "C" = 0? btfsc STATUS,C ;Да "1"->Disp_DAT bsf Disp_DAT ;Нет "0"->Disp_DAT nop ; bsf Disp_CLK ;_/-\_ nop ;Импульс для загрузки бита в регистры bcf Disp_CLK ;индикатора decfsz CNT_RX_bit,f ;CNT_RX_bit = CNT_RX_bit - 1, =0? (все передали?) goto DL_RX_loop ;Нет повтор с "DL_RX_loop". Да далее decfsz CNT_RX_byte,f ;CNT_RX_byte = CNT_RX_byte - 1, =0? (все передали?) goto DL_loop ;Нет повтор с "DL_loop". Да далее bsf Disp_CTR ;Включаем индикатор (данные обновлены) retlw 0x00 ;Выход из процедуры ;********************************************************************** ;********************************************************************** ; Процедура обновления данных для вывода на дисплей №1 ; (перед вызовом процедуры загрузить регистры ; In_byte[hi:lo] выводимым значением) ;********************************************************************** Disp_1_refr ; movfw In_byte_hi ;Проверяем выводимое значение > 1000? sublw 0x03 ;Да выводим занчение в формате [XXX] btfss STATUS,C ;Нет выводим занчение в формате [XХ.X] goto D1R_in_ххх ; btfss STATUS,Z ; goto D1R_in_хх.х ; movlw 0xE8 ; subwf In_byte_lo,w ; btfsc STATUS,C ; goto D1R_in_ххх ; D1R_in_хх.х ; call BIN_to_BCD ;Перекодируем из BIN в BCD movfw R1 ;Значение х10 из R1 в "W" andlw b'00001111' ;Маскируем не нужные биты btfsc STATUS,Z ;Значение =0? movlw 0x0A ;Да выводим " ". Нет значение. call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_1 ;Пишем значение в "Disp_1_1" swapf R2,w ;Значение х1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_2 ;Пишем значение в "Disp_1_2" bsf Disp_1_2,3 ;Устанавливаем "," во 2м разряде movfw R2 ;Значение х0,1 обор. в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_3 ;Пишем значение в "Disp_1_3" retlw 0x00 ;Выход из процедуры D1R_in_ххх ; call BIN_to_BCD ;Перекодируем из BIN в BCD swapf R1,w ;Значение х100 из R1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_1 ;Пишем значение в "Disp_1_1" movfw R1 ;Значение х10 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_2 ;Пишем значение в "Disp_1_2" swapf R2,w ;Значение х1 обор. в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_1_3 ;Пишем значение в "Disp_1_3" retlw 0x00 ;Выход из процедуры ;********************************************************************** ;********************************************************************** ; Процедура обновления данных для вывода на дисплей №2 ; (перед вызовом процедуры загрузить регистры ; In_byte[hi:lo] выводимым значением) ;********************************************************************** Disp_2_refr ; movfw In_byte_hi ;Проверяем выводимое значение > 1000? sublw 0x03 ;Да выводим занчение в формате [XX.X] btfss STATUS,C ;Нет выводим занчение в формате [X.ХX] goto D2R_in_хх.х ; btfss STATUS,Z ; goto D2R_in_х.хх ; movlw 0xE8 ; subwf In_byte_lo,w ; btfsc STATUS,C ; goto D2R_in_хх.х ; D2R_in_х.хх ; call BIN_to_BCD ;Перекодируем из BIN в BCD movfw R1 ;Значение х1 из R1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_1 ;Пишем значение в "Disp_2_1" bsf Disp_2_1,3 ;Устанавливаем "," в 1м разряде swapf R2,w ;Значение х0,1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_2 ;Пишем значение в "Disp_2_2" movfw R2 ;Значение х0,01 обор. в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_3 ;Пишем значение в "Disp_2_3" retlw 0x00 ;Выход из процедуры D2R_in_хх.х ; call BIN_to_BCD ;Перекодируем из BIN в BCD swapf R1,w ;Значение х10 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_1 ;Пишем значение в "Disp_2_1" movfw R1 ;Значение х1 из R1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_2 ;Пишем значение в "Disp_2_2" bsf Disp_2_2,3 ;Устанавливаем "," во 2м разряде swapf R2,w ;Значение х0,1 в "W" call Tabl_decode ;Читаем код символа из таблицы movwf Disp_2_3 ;Пишем значение в "Disp_2_3" retlw 0x00 ;Выход из процедуры ;********************************************************************** ;********************************************************************** ; Процедура преобразования из BIN[16bit] -> BCD ; Вход: In_byte_hi:In_byte_lo ; Выход: R0(0:дес.тыс.),R1(тыс.:сот.),R2(дес.:ед.) ; In = 1024 R0 = 00, R1 = 10, R2 = 24 ;********************************************************************** BIN_to_BCD ; bcf STATUS,C ; movlw .16 ; movwf count ; clrf R0 ; clrf R1 ; clrf R2 ; Loop16 rlf In_byte_lo,f ; rlf In_byte_hi,f ; rlf R2,F ; rlf R1,F ; rlf R0,F ; decfsz count,f ; goto adjDEC ; retlw 0x00 ; adjDEC movlw R2 ; movwf FSR ; call adjBCD ; movlw R1 ; movwf FSR ; call adjBCD ; movlw R0 ; movwf FSR ; call adjBCD ; goto Loop16 ; adjBCD movlw 0x03 ; addwf INDF,W ; movwf temp ; btfsc temp,3 ; movwf INDF ; movlw 0x30 ; addwf INDF,W ; movwf temp ; btfsc temp,7 ; movwf INDF ; retlw 0x00 ;Выход из процедуры ;**********************************************************************