Читайте также:
|
|
Исходный текст программы приведен далее:
;предварительные настройки
#include p16f873a.inc
__CONFIG _HS_OSC;
RCV_S: SET H'20';принятый символ
STEK_0: SET H'21';программный стек данных
STEK_1: SET H'22';|
ORG H'000';вектор сброса
GOTO BEGIN;переход на начало основной программы
ORG H'004';вектор прерывания
GOTO INT;переход к обработчику прерываний
;начало основной программы
BEGIN: BCF STATUS,RP1;выбираем банк регистров 1
BSF STATUS,RP0;|
;задаем режимы работы параллельных портов
MOVLW B'00001110';задаем аналоговый вход PORTA,0
MOVWF ADCON1;программируем регистр АЦП 1
MOVLW B'00000001';PORTA, 7-1 выходы, PORTA, 0 вход
MOVWF TRISA;программируем регистр направления PORTA
MOVWF OPTION_REG;включаем подтягивающие резисторы PORTB
MOVLW B'11111111';PORTB, 7-0 входы
MOVWF TRISB;программируем регистр направления PORTB
MOVLW B'10000000';PORTC, 7 вход, PORTC, 6-0 выходы
MOVWF TRISC;программируем регистр направления PORTC
;разрешаем прерывания от приемника USART
MOVLW B'11000000';биты GIE и PEIE = 1
MOVWF INTCON;программируем регистр управления прерываниями
BSF PIE1,RCIE;разрешение прерываний от приемника USART
;задаем режим работы последовательного порта
MOVLW D'12';скорость передачи по USART 19200
MOVWF SPBRG;программируем регистр скорости обмена
MOVLW B'00100100';разрешение передачи, высокоскоростной асинхронный режим
MOVWF TXSTA;программируем регистр статуса передатчика
BCF STATUS,RP1;выбираем банк регистров 0
BCF STATUS,RP0;|
MOVLW B'10010000';включение USART, разрешение приема
MOVWF RCSTA;программируем регистр статуса приемника
;проверка кнопок и передача символов
M10: BCF STATUS,RP1;выбираем банк регистров 0
BCF STATUS,RP0;|
BTFSC PORTB,5;скачек,если нажата кнопка SA2
GOTO M20;переход к опросу SA3
MOVLW A'2';загружаем в аккумулятор ASCII символ "2"
CALL TSMIT;вызов подпрограммы передачи посылки
M20: BTFSC PORTB,4;скачек,если нажата кнопка SA3
GOTO M30;переход к опросу SA4
MOVLW A'3';загружаем в аккумулятор ASCII символ "3"
CALL TSMIT;вызов подпрограммы передачи посылки
M30: BTFSC PORTB,2;скачек,если нажата кнопка SA4
GOTO M40;переход к опросу SA5
MOVLW A'4';загружаем в аккумулятор ASCII символ "4"
CALL TSMIT;вызов подпрограммы передачи посылки
M40: BTFSC PORTB,1;скачек,если нажата кнопка SA5
GOTO M50;переход к опросу SA6
MOVLW A'5';загружаем в аккумулятор ASCII символ "5"
CALL TSMIT;вызов подпрограммы передачи посылки
M50: BTFSC PORTB,0;скачек,если нажата кнопка SA6
GOTO M60;переход к ожиданию и приему посылок
MOVLW A'6';загружаем в аккумулятор ASCII символ "6"
CALL TSMIT;вызов подпрограммы передачи посылки
;ожидание и прием символа
M60: MOVLW A'1';1 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTA,5;включаем HL1
MOVLW A'2';2 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTC,0;включаем HL2
MOVLW A'3';3 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTC,1;включаем HL3
MOVLW A'4';4 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTC,3;включаем HL4
MOVLW A'5';5 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTC,4;включаем HL5
MOVLW A'6';6 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSC STATUS,Z;скачек, если не равно
BSF PORTC,5;включаем HL6
MOVLW A'0';0 сравниваем
XORWF RCV_S,W;с принятым символом
BTFSS STATUS,Z;скачек, если равно
GOTO M10;возврат к началу программы если нет
BCF PORTA,5;гасим HL1
CLRF PORTC;гасим остальные светодиоды
GOTO M10;возврат к началу программы если нет
;подпрограмма передачи символа
TSMIT: MOVWF TXREG;инициируем передачу
NOP
T10: BTFSS PIR1,TXIF;скачек,если буфер освободился
GOTO T10;иначе, ждем освобождения буфера
BCF PIR1,TXIF;сброс флага освобождения буфера
RETURN;возврат в основную программу
;драйвер прерываний от приемника USART
INT: MOVWF STEK_0;сохраняем аккумулятор в ОЗУ
MOVF STATUS,W;сохраняем регистр статуса в ОЗУ
MOVWF STEK_1;|
BTFSC RCSTA,OERR;проверка ошибки переполнения буфера
GOTO I10;переход, если есть ошибка
BTFSC RCSTA,FERR;проверка ошибки кадра
GOTO I20;переход, если есть ошибка
MOVF RCREG,W;считываем принятый символ
MOVWF RCV_S;и сохраняем его в ОЗУ
GOTO I30;переход к выходу из драйвера прерывания
I10: MOVF RCREG,W;очистка буфера
MOVF RCREG,W;|
GOTO I30;переход к выходу из драйвера прерывания
I20: BCF RCSTA,CREN;сброс флага ошибки кадра
BSF RCSTA,CREN;|
I30: MOVF STEK_1,W;извлекаем регистр статуса из ОЗУ
MOVWF STATUS;|
MOVF STEK_0,W;извлекаем аккумулятор из ОЗУ
RETFIE;возврат в основную программу
END;конец программы
Дата добавления: 2015-07-08; просмотров: 210 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Разработка алгоритма программы | | | Разработка алгоритма программы |