.
Данные для индикации записываются в регистры Ind_1- 4 .
Синим цветом выделена сама ПП, остальное для демонстрации примера.
;-------- Прописка регистров --------
Cblock
Temp ;
Temp_1
Bit2_10
Sdvig_1 ;
Reg_1
Reg_2
Reg_3
Ind_1
Ind_2
Ind_3
Ind_4
Led_U ; верхний байт результата.
Led_H ; старший байт результата.
Led_L ; младший байт результата.
endc
;---------------Присвоение------------
;-------------------------------------
org 0 ;
nop ;
goto START ;
;----------------------------------------
;добавляем в программу вектор прерывания
;----------------------------------------
org 08h ; H вектор прерывания
rrncf Sdvig_1 ; Сдвиг регистра
btfsc Sdvig_1,0 ; Бит 0 установлен ?
bra IND_Led_1 ; Да. Вызов ПП
btfsc Sdvig_1,1 ; Бит 1 установлен ?
bra IND_Led_2 ; Да. Вызов ПП
btfsc Sdvig_1,2 ; Бит 2 установлен ?
bra IND_Led_3 ; Да. Вызов ПП
btfsc Sdvig_1,3 ; Бит 3 установлен ?
bra IND_Led_4 ; Да. Вызов ПП
OUT_pr clrf PORTC ; Очистка порта
movwf LATC ; Запись значения+выбранный индикатор
bcf INTCON,2 ; сброс флага TMR0
RETFIE 1 ; выход из прерывания с восст.
IND_Led_1 movlw 80h ; Включаем 1 индикатор
xorwf Ind_1,0 ; Добавляем значение 0-9
bra OUT_pr ; Переход
IND_Led_2 movlw 40h ; Включаем 2 индикатор
xorwf Ind_2,0 ; Добавляем значение 0-9
bra OUT_pr ; Переход
IND_Led_3 movlw 20h ; Включаем 3 индикатор
xorwf Ind_3,0 ; Добавляем значение 0-9
bra OUT_pr ; Переход
IND_Led_4 movlw 10h ; Включаем 4 индикатор
xorwf Ind_4,0 ; Добавляем значение 0-9
bra OUT_pr ; Переход
;---------------Инициализация--------
START clrf TRISC ; порт на выход
movlw b'11000101' ; настройка ТMR0
movwf T0CON ;
movlw b'11100000' ; = разрешаем глоб.прерывания +периферия+
movwf INTCON ; переполнению TMR0+ сброс флага TMR0=
clrf Temp ;
movlw 11h ;
movwf Sdvig_1 ;
movlw .0 ;
movwf Ind_4 ;
;----------------------------------------
; Основная часть программы.
;----------------------------------------
SSS incf Temp_1 ;
movff Temp_1,Bit2_10 ;
call BIN2_10 ;
bra Delya_1 ;
bra SSS ;
;----------------------------------------
;ПП преобразования однобайтного двоичного
; числа в трёхзначное десятичное число
;----------------------------------------
BIN2_10 bcf INTCON,5 ;
clrf Led_U ; Очистить верхний байт
clrf Led_H ; Очистить старший байт
clrf Led_L ; Очистить младший байт
incf Led_U ; +1
movlw 9Ch ; Отнимаем .100
addwf Bit2_10 ;
bc $-.6 ; Продолжаем отнимать.
decf Led_U ; Коррекция
movlw .100 ; Выделяем остаток десятков..
addwf Bit2_10 ;
incf Led_H ; +1
movlw 0F6h ; Отнимаем .10
addwf Bit2_10 ;
bc $-.6 ; Продолжаем отнимать.
decf Led_H ; Коррекция
movlw .10 ; Выделяем остаток единиц.
addwf Bit2_10 ;
movff Bit2_10,Led_L ; Загружаем остаток в единицы.
movff Led_L,Ind_1 ;
movff Led_H,Ind_2 ;
movff Led_U,Ind_3 ;
bsf INTCON,5 ;
return ; Возврат из ПП.
Delya_1 movlw .73
movwf Reg_1
movlw .10
movwf Reg_2
movlw .4
movwf Reg_3
decfsz Reg_1
bra $-2
decfsz Reg_2
bra $-6
decfsz Reg_3
bra $-.10
return
Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2021 © ChipMK.ru
![]() |
|