вот ещё простые примеры
:arrow:
;Сложение 1-байтных чисел
#include <p16f84.inc> ;Включаемый файл
__config b'11111111110001' ;Конфигурация
org 0 ;Вектор сброса
clrf PCLATH ;
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;
;Определение констант
S1 equ d'200' ;1-е слагаемое
S2 equ d'100' ;2-е слагаемое
;Определение переменных
;)присвоение имён двум РОН:
RESULT equ 0ch ;Переменная для хранения результата
CARRY equ 0dh ;Переменная для хранения переноса
start movlw S1 ;Сложение S1 и S2
addlw S2 ; )флаг переноса изменён:.
movwf RESULT ;Сохранение результата, оно
; не влияет на флаг переноса.
btfss STATUS,C ;Бит переноса установлен? –
goto no_car ; –нет{ Перейти на метку no_car.
clrf CARRY ; –да{ Запись единицы
incf CARRY,F ; в CARRY.
goto end_prog ;Переход на конец программы.
no_car clrf CARRY ;Запись нуля в CARRY.
end_prog nop ;Конец программы.
end
:arrow:
;Умножение 1-байтных чисел)результат - 2 байта:
#include <p16f84.inc> ;Включаемый файл
__config b'11111111110001' ;Конфигурация
org 0 ;Вектор сброса
clrf PCLATH
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;
;Определение констант
number1 equ d'100' ;1-й множитель
number2 equ d'3' ;2-й множитель
;Определение переменных
cblock 00ch ;Блок переменных
N1 ;1-й множитель )адрес=00ch:
N2 ;2-й множитель )адрес=00ch+1 , т.е. 00dh:
RES_L ;Младший байт результата )адрес=00ch+2 , т.е. 00eh:
RES_H ;Старший байт результата )адрес=00ch+3 , т.е. 00fh:
endc ;Завершение блока переменных
start movlw number1 ;Запись
movwf N1 ;констант
movlw number2 ;в
movwf N2 ;ОЗУ.
clrf RES_L ;Очистка регистров
clrf RES_H ; хранения результата.
incf N1,F ;Для правильной работы алгоритма.
;Основной цикл
loop decf N1,F ;Уменьшение N1.
btfsc STATUS,Z ;Если N1 стал = 0,
goto end_prog ; то конец умножения
movf N2,W ;Складываем N2
addwf RES_L,W ; с младшим байтом результата
movwf RES_L ;
btfsc STATUS,C ;Если был перенос,
incf RES_H,F ; то увеличиваем старший байт результата на 1
goto loop ;
end_prog nop
end
:arrow:
;Работа с портами
#include <p16f84.inc>
__config b'11111111110001'
org 0 ;Вектор сброса
clrf PCLATH
bcf STATUS,RP1 ;
bcf STATUS,RP0 ;установка банка №0
goto start
org 4 ;Вектор прерывания
goto start ;
start bsf STATUS,RP0 ;установка банка №1
movlw b'00000000' ;Настройка
movwf TRISA ;портов.
movlw b'00011111' ;
movwf TRISB ;
bcf STATUS,RP0 ;установка банка №0
loop movf PORTB,W ;Чтение из PORTB.
movwf PORTA ;Запись в PORTA.
goto loop ;
end
:arrow:
есть хитрый способ организовать небольшую табличку с помощью RETLW,
org 5
read_array
clrf PCLATH
addwf PCL,F
retlw 0x23
retlw 0x45
retlw 0xFF
retlw 0xAA
retlw 0x17
retlw 0x2D
retlw 0x2D
label1 retlw 0x6A
retlw 0x76
retlw 0x88
или то же самое
org 5
read_array;подпрограмма чтения из массива
; Вход{ W= номер элемента.
; Выход{ W= значение элемента.
clrf PCLATH
addwf PCL,F
dt 23, 45, 0ffh, 0xaa ;шестнадцатеричные константы
dt .23, .45, d’45’ ;десятичные константы
label1 dt 33+.55, .33+55, 33+55, ;смешанные константы
главное тут - чтобы массив не оказался в разных страницах - иначе в PCLATH будет указана не та страница. Поэтому в данном примере массив расположен в самом начале программы - тогда (так как он недлинный) гарантированно он окажется в нулевой странице - и мы просто очищаем PCLATH (clrf PCLATH) перед тем как перейти на строку с адресом, загружаемым в PCL.