Сб ноя 09, 2019 15:06:09
#include p16f873a.inc
__CONFIG _HS_OSC & _WDT_OFF;
ORG H'005' ;вектор сброса
CNT EQU H'A0' ;определение регистра счётчика
;с адресом А0(банк 1)
;запись возрастающих чисел в ОЗУ
BCF STATUS,RP1 ;выбираем банк регистров 1
BSF STATUS,RP0 ;
MOVLW H'20' ;загрузка в рабочий регистр адреса
;первого POH в банке 0
MOVWF FSR ;записываем начальный адрес
;в регистр косв.адресации
CLRF CNT ;обнуляем регистр счетчика
M10: MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
INCF FSR,F ;увеличение адреса POH
;в регистре косвенной адресации
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
INCF CNT,F ;увеличение счетчика на 1
INCF CNT,F ;увеличение счетчика на 1
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
ANDLW h'0F' ; побитное И с 0A
XORLW h'0A' ; сравнение с 0A
BTFSS STATUS,Z ; если не совпадают, скачок через команду
GOTO M2 ; вызов подпрограммы М2
MOVF CNT,W ; загружаем счетчик в W
ADDLW H'6'
MOVWF CNT
M2:
MOVF CNT,W
MOVWF INDF
INCF FSR,F ;увеличение адреса POH на 1
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
DECF CNT,F ;уменьшение счетчика на 1
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
ANDLW h'0F' ; побитное И с 0A
XORLW h'0F' ; сравнение с 0A
BTFSS STATUS,Z ; если не совпадают, скачок через команду
GOTO M3 ; вызов подпрограммы М2
MOVF CNT,W ; загружаем счетчик в W
ADDLW H'FA'
M3:
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
MOVF FSR,W
XORLW H'80' ;сравниваем его с последним значение +1
BTFSS STATUS,Z ;если не совпадают, то скачек через одну команду
GOTO M10 ;если не совпадают, то возврат
;к записи следующей ячейки
END
Пн ноя 11, 2019 14:42:51
Ср ноя 13, 2019 19:00:30
LIST p=16F873A
#include P16F873A.inc
errorlevel -302
__CONFIG _CP_OFF & _FOSC_HS
CBLOCK 0x20 ;96 byte 00
arr ;здесь пишем
endc
CBLOCK 0xA0 ;80 byte 01
CNT ;
endc
CBLOCK 0x120 ;80+16 byte 10 0x100-0x17F
endc
CBLOCK 0x1A0 ; 80+16 byte 11 0x100-0x17F
endc
org 0x0000
clrf STATUS
goto start
org 0x0004
interrupt
;
retfie
start
;запись возрастающих чисел в ОЗУ
BCF STATUS,RP1 ;
BSF STATUS,RP0 ; для CNT
MOVLW 0x20 ;загрузка в рабочий регистр адреса
;первого POH в банке 0
MOVWF FSR ;записываем начальный адрес
;в регистр косв.адресации
CLRF CNT ;обнуляем регистр счетчика
next BCF STATUS,IRP
BCF FSR,7 ;bank 0 for FSR;INDF
MOVF CNT,W ;загружаем значение счетчика в рабочий регистр
call bin_to_dec
MOVWF INDF ;сохраняем очередной отсчет в косвенно адресуемый POH
INCF FSR,F ;увеличение адреса POH
incf CNT,f
btfsc FSR,7 ;value 0x8x после 0b01111111 следует 0b100000000 a там не пишем
goto done
goto next
;by: Scott Dattalo
bin_to_dec:
SWAPF CNT, W ; swap the nibbles
ADDWF CNT, W ; so we can add the upper to the lower
ANDLW B'00001111' ; lose the upper nibble (W is in BCD from now on)
BTFSC STATUS, DC ; if we carried a one (upper + lower > 16)
ADDLW 0x16 ; add 16 (the place value) (1s + 16 * 10s)
BTFSC STATUS, DC ; did that cause a carry from the 1's place?
ADDLW 0x06 ; if so, add the missing 6 (carry is only worth 10)
ADDLW 0x06 ; fix max digit value by adding 6
BTFSS STATUS, DC ; if was greater than 9, DC will be set
ADDLW -0x06 ; if if it wasn't, get rid of that extra 6
BTFSC CNT,4 ; 16's place
ADDLW 0x16 - 1 + 0x6 ; add 16 - 1 and check for digit carry
BTFSS STATUS, DC
ADDLW -0x06 ; if nothing carried, get rid of that 6
BTFSC CNT, 5 ; 32nd's place
ADDLW 0x30 ; add 32 - 2
BTFSC CNT, 6 ; 64th's place
ADDLW 0x60 ; add 64 - 4
; BTFSC FSR, 7 ; 128th's place
; ADDLW 0x20 ; add 128 - 8 % 100
RETURN ; all done!
done
nop
end