Это очень важно — хранить данные не только в регистрах Памяти для Данных, но и Памяти для Программ (Линейной памяти, флэш памяти). При необходимости извлекать из программной памяти данные и выводить их на ЖКИ LCD 1602 (дисплей). Тем самым создавая удобный интерфейс конечного пользователя-потребителя вместе с 16-битной клавиатурой. Которая, кстати может быть запараллелена с 8-битным портом данных ЖКИ. (входящие и выходящие данные).
ORG 0x2000
В ассемблере MPASM, PIC_ASM — есть директива da «ABCD», 0; — для ввода строки символов в ячейки памяти начиная со строки 0x2000 Liner Memory, за содержанием которой Вы можете наблюдать в меню IDE->Windos->Programm Memory, а также непосредственно — за регистрами косвенной адресации FSRn (0-1, для PIC16f) через меню WATCH.
Данные прописались в GPR Memory со (строки) 0х0020 – ячейки. Это Temp_N(0x0020), FLAG_edge (0x0021),
H_byte (0x022)/ Суппер!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Дважды копировался WREG, пришлось закомментировать инструкцию записи movwf INDF1, — Т.К. ПРИ ЭТОМ ЯЧЕЙКА FSR1++ СДВИГАЛАСЬ ЕЩЕ НА ОДИН ШАГ.
Данные FSR0 – сдвинул вправо на одну ячейку при записи изначально. Потому что к адресации получалось – что ячейка сдвигается для получения данных и первое число терялось. Можете проверить и устранить небольшие шероховатости при отладке — пошагово. А я потом, расскажу — какие именно. Так интереснее.
В этой программе мы побайтово, в режиме косвенной адресации заносим ASCII символы «О», «К», «R» в память Program Memory начиная с адреса 20А1. При извлечении этих данных обращаемся к ячейке 20А0, т.к. инструкция MOVIW FSRO++ (ПОСТИНКРЕМЕНТ), при первом цикле — инкрементирует адрес к 20А1. Происходит как бы преинкремент. Считываем данные в 20А1, потом постинкремент данных и еще два раза. В случае da «OKR», 0; будет цикл адресации к метке с прекращением по условию Z=0; IORLW 0x00;
— Успехов друзья в программировании!!!
Код программы приведен ниже:
list p = 16f18855
#include p16f18855.inc
; CONFIG1
__CONFIG _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
; CONFIG2
__CONFIG _CONFIG2, _MCLRE_OFF & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_OFF & _BORV_HI & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON
; CONFIG3
__CONFIG _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_SC
; CONFIG4
__CONFIG _CONFIG4, _WRT_OFF & _SCANE_not_available & _LVP_ON
; CONFIG5
__CONFIG _CONFIG5, _CP_OFF & _CPD_OFF
UDATA 0x20;Specify RAM
Temp_N res 1; Counter loop
H_byte res 1 ; equ 10
L_byte res 1 ; equ 11
CountB res 1 ;
org 0x000
RES_VECT CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
org 0x0004
; TODO ADD INTERRUPTS HERE IF USED
BTFSC PIR6,CCP1IF; Here CCP1? — bit 0; заполнил прерывания для компаратора
;GOTO CCP_ISR; PROGRAMM isr for CCP; в этом примере — не задействован
retfie;
START
MAIN_PROG CODE ; let linker place main program
movlw 0xA1 ;
movwf FSR0L ; open indeirect bank 0xA0,0xA1,0xA2
movlw A’O’;0x0F
movwf INDF0 ; Data inR0 — cell N0
;CLRF INDF0
INCF FSR0
movlw A’K’ ;0x10
movwf INDF0 ;FSR0 Data in R1 — cell N1
;CLRF INDF0
INCF FSR0
movlw A’R’ ;0x11
movwf INDF0 ; Data in R2- cell N2
movlw .3 ;Data of counter
movwf CountB ;
movlw 0x00 ;shifting 0x20A0 — before 0xA0first address memory bank1
movwf FSR0H ;
movlw 0xA0 ;
movwf FSR0L ;
movlw 0x020 ;first address memory bank2 H_byte
movwf FSR1L ;
movlw 0x00 ;
movwf FSR1H ;
B3 moviw FSR0++ ;10FSR0; 10;postincrement FSR0 cells bank1
movf INDF0,0 ;
movwi FSR1++; 10 ;p-i FSR1 cells bank2
;movwf INDF1;
decfsz CountB ;
BRA B3 ; CHECK the line mamory
GOTO $ ; loop forever
END