Пн апр 17, 2023 20:04:12
#include p16f873a.inc
__CONFIG _HS_OSC
SIZE_MAS equ h'B0'
_DATA equ h'B1'
START_ADR equ h'A6'
SIZE_MAS2 equ h'B2'
_DATA2 equ h'B3'
START_ADR2 equ h'A0'
ORG 8
bsf STATUS, RP0
bcf STATUS, RP1
movlw d'6'
movwf SIZE_MAS2
movlw d'21'
movwf _DATA2
movlw START_ADR2
movwf FSR
loop:
movf _DATA2,W
movwf INDF
decf _DATA2, F
incf FSR, F
decf SIZE_MAS2, F
movf SIZE_MAS2, W
btfss STATUS, Z
goto loop
bsf STATUS, RP0
bcf STATUS, RP1
movlw d'10'
movwf SIZE_MAS
movlw d'9'
movwf _DATA
movlw START_ADR
movwf FSR
loop2:
movf _DATA,W
movwf INDF
decf _DATA, F
incf FSR, F
decf SIZE_MAS, F
movf SIZE_MAS, W
btfss STATUS, Z
goto loop2
Пн апр 17, 2023 22:54:50
Вт апр 18, 2023 11:22:58
Вт апр 18, 2023 12:39:42
Вт апр 18, 2023 12:43:08
Вт апр 18, 2023 12:59:08
Вт апр 18, 2023 16:39:33
Вт апр 18, 2023 20:21:54
#include p16f873a.inc
__CONFIG _HS_OSC & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _CP_OFF & _WRT_OFF & _DEBUG_OFF
; выбраны:
; высокоскоростной генератор
; сторожевой таймер выключен
; задержка при включении питания активирована
; выключение при снижении питания включено
; низковольтное программирование не задействовано
; защита данных программ, ПЗУ, записи отключено
; отладка отключена
; Стартовые адреса шести строк в памяти данных
START_ADR1_6 equ h'A0'
START_ADR2_6 equ h'B0'
START_ADR3_6 equ h'C0'
START_ADR4_6 equ h'D0'
START_ADR5_6 equ h'E0'
START_ADR6_6 equ h'F0'
; massive pointer
;- Вместо переменных SIZE_MAS2 и SIZE_MAS одна переменная
;- mas_p, т.к. они использовались по очереди. Переменная в Банке 0,
; потому что Банк 1 будет полностью использован
mas_p equ h'20'
; Константы для вычисления длины массива
SIZE_MAS2 equ d'6'
SIZE_MAS1 equ d'10'
; - Вместо _DATA и _DATA2 - _data в Банке 0
_data equ h'21' ;
; Константы для вычисления hex числа
_DATA2 equ d'21'
_DATA1 equ d'9'
ORG 0
Goto START
ORG 8
START
Movlw START_ADR1_6 ; 1-ый из 6
Call fill_nums
Movlw START_ADR2_6 ; 2-ой из 6
Call fill_nums
Movlw START_ADR3_6 ; 3-ий из 6
Call fill_nums
Movlw START_ADR4_6 ; 4-ый из 5
Call fill_nums
Movlw START_ADR5_6 ; 5-ый из 6
Call fill_nums
Movlw START_ADR6_6 ; 6-й из 6
Call fill_nums
MAIN_LOOP
NOP ; Главный цикл ничегонеделанья
Goto MAIN_LOOP
;********************************************************
; *** fill_nums *** *
; Заполняем 16 ячеек начиная со стартового адреса в *
; аккумуляторе в обратном порядки числами: *
; 15,14,13,12,11,10,9 ... 4,3,2,1,0 в hex виде *
;********************************************************
fill_nums
;- Работа с регистрами FSR и INDF возможна из любого банка
movwf FSR
movlw SIZE_MAS2
movwf mas_p
movlw _DATA2
movwf _data
loop:
movf _data,W
movwf INDF
decf _data, F
incf FSR, F
decf mas_p, F
;- Дополнительно запихивать переменную в раб. аккумулятор
;- не надо, т.к. результат команды влияет на Z
btfss STATUS, Z
goto loop
movlw SIZE_MAS1
movwf mas_p
movlw _DATA1
movwf _data
loop2:
movf _data,W
movwf INDF
decf _data, F
incf FSR, F
decf mas_p, F
btfss STATUS, Z
goto loop2
Return
END
Вт апр 18, 2023 20:29:43
Так как у вас один и тот же код скорей всего будет использоваться 6 раз (если продолжать заполнение массива данных в вашем стиле) то логично использовать отдельную подпрограмму для шести строк - fill_nums и "скармливать" ей адреса всех шести строк по очереди в главном цикле программы. Конец программы надо завершать директивой END. Если мы часть действий выполняем подпрограммой, то главный год надо зациклить пусть и пустым циклом MAIN_LOOP: NOP - Goto MAIN_LOOP.
#include p16f873a.inc
__CONFIG _HS_OSC
ORG 3
bcf STATUS, RP0
bcf STATUS, RP1
MOVLW h'A0'
movwf FSR
LOOP1:
MOVLW h'15'
LOOP2:
MOVWF INDF
INCF FSR,F
BTFSC STATUS,Z
GOTO LOOP3 ; If FSR=0
ADDLW h'FF' ; X->X-1
BTFSS STATUS,C
GOTO LOOP1 ; If 0->0FFh
BTFSS STATUS,DC ; Проверяем десятичный перенос
ADDLW -6 ; If 10h->0Fh
GOTO LOOP2
LOOP3:END
Вт апр 18, 2023 20:44:46
Ср апр 19, 2023 00:53:22
B0
MOVLW 0x0A0
MOVWF FSR
;
B0.IT1
MOVLW 0Fh
XORWF FSR,W
ANDLW 0Fh
MOVWF INDF
INCFSZ FSR,F
GOTO B0.IT1
;
;
Ср апр 19, 2023 11:17:06
Ср апр 19, 2023 14:09:32
Ср апр 19, 2023 16:59:28
Пт апр 21, 2023 11:30:53