Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *****************************************************************
- LIST P=18F2520, F=INHX32
- #include <P18F2520.INC>
- ;******************************************************************************
- CONFIG OSC = INTIO67 ;конфигурирование тактового осциллятора в режим
- WDT = OFF ;использования встроенного осциллятора
- PBADEN = OFF ;а также конфигурирование периферийных устройтв
- CONFIG LVP = OFF
- XINST = OFF
- DEBUG = ON
- MCLRE = ON
- ;******************************************************************************
- ;Variable definitions
- UDATA ;инициализация переменных и вспомогательных
- WREG_TEMP RES 1 ;регистров
- STATUS_TEMP RES 1
- BSR_TEMP RES 1
- UDATA_ACS ;инициализация регистров и констант
- ;Data memory reading
- NUM RES 1
- ;EEPROM reading
- NumBook RES 1
- Data_EE_Addr RES 1
- ;Program memory Table Reading
- NumRead RES 1
- ConstNumRead EQU .19
- ConstStartPositionRead EQU .0
- ConstShiftAdrEE EQU .0
- ;******************************************************************************
- ;EEPROM data инициализация РПЗУ(EEPROM)
- AdressEE EQU 0xF00000 ;формирование массива данных в EEPROM
- DATA_EEPROM CODE AdressEE
- DE 0xAA,0x20,0x01,0x00, ;команда управления положением курсора
- 0xAA, 0x25, "Brigada_1", ;формирование посылки данных для отображения
- 0x0D ;на дисплее
- ;******************************************************************************
- ;Reset vector
- ; This code will start executing when a reset occurs.
- RESET_VECTOR CODE 0x0000 ;определение адреса вектора сброса
- goto Main ;переход на начало программы на метку main
- ;******************************************************************************
- ;High priority interrupt vector
- ; This code will start executing when a high priority interrupt occurs or
- ; when any interrupt occurs if interrupt priorities are not enabled.
- HI_INT_VECTOR CODE 0x0008
- bra HighInt ;переход к подпрограмме обработки
- ;прерываний высокого уровня
- ;******************************************************************************
- ;Low priority interrupt vector
- ; This code will start executing when a low priority interrupt occurs.
- ; This code can be removed if low priority interrupts are not used.
- LOW_INT_VECTOR CODE 0x0018
- bra LowInt ;переход к подпрограмме обработки
- ;прерываний высокого уровня
- ;******************************************************************************
- ;High priority interrupt routine
- ; The high priority interrupt code is placed here.
- CODE
- HighInt:
- ; *** high priority interrupt code goes here ***
- retfie FAST
- ;******************************************************************************
- ;Low priority interrupt routine
- ; The low priority interrupt code is placed here.
- ; This code can be removed if low priority interrupts are not used.
- LowInt:
- movff STATUS,STATUS_TEM ;Сохранение содержимого м смр
- ;в вспомогательный регистр
- movff WREG,WREG_TEMP ;Сохранение содержимого аккумулятора
- ;в вспомогательный регистр
- movff BSR,BSR_TEMP ;Сохранение содержимого аккумулятора
- ;в вспомогательный регистр
- ; *** low priority interrupt code goes here ***
- movff BSR_TEMP,BSR ;восстановление содержимого
- ;регистра BSR
- movff WREG_TEMP,WREG ;восстановление содержимого
- ;регистра WREG
- movff STATUS_TEMP,STATUS ;восстановление содержимого
- ;регистра STATUS
- retfie
- ;******************************************************************************
- ;Start of main program
- ; The main program code is placed here.
- ; *** main code goes here ***
- Main: ;Запись в регистр OSCCON b'01110011'
- bsf OSCCON,SCS0; ;Выбор источника задающего осциллятора тактовой частоты
- bsf OSCCON,SCS1; 11 - от внутреннего тактового осциллятора
- bsf OSCCON,IRCF0; Выбор тактовой частоты посл делителя:
- bsf OSCCON,IRCF1; 111 - 8Мгц. Бит2=0:-частота вн такт осц нестабильна
- bsf OSCCON,IRCF2; Бит3=0:-идет время таймаута, внешн кварц осц не готов
- movlw b'10000000';Бит 8:выбор источника низкой частоты внутреннего осциллятора
- movwf OSCTUNE; 31,25 кГц от 8 МГц INTOSC источника. бит 6 умножителя
- ;частоты отключен, биты 0-5: тактовая частота подстраивается
- ;на центральную
- ; Конфигурация портов B и C:
- movlw b'00000001';RB0 - чтение, RB1-RB7 - вывод
- movwf TRISB
- movwf LATB
- movlw '11100000' ;TX(RC6),RX(RC7), BUSY от жк (RС5) - чтение, отсальные - вывод
- movwf TRISC
- movwf LATC
- StartMain: ;задаем количество слов для записи в ОЗУ
- movlw .10
- movwf Num
- ; Конфигурирование интерфейса USART
- ;Transmit status and control
- bcf TXSTA,CSRC; Синхронный режим - ведомый, внешн такт сигнал с входа CK
- bcf TXSTA,TX9;Разрешение 9разрядн передачи; TX9=0:- 8разрядная передача
- bcf TXSTA,SYNC; Установка асинхронного режима
- bcf TXSTA,BRGH; низкоскоростной режим
- ;Receive status and Control
- bcf RCSTA,TX9;Разрешение приема 9 бит; RC9=0:- 8разрядн прием
- bcf RCSTA,CREN; Запрет приема
- clrf SPBRG; Обнуляем регистр SPBRG
- movlw .12; Записываем в него коэфф 12 для формирования скорости передачи
- movwf SPBRG; 9600 бод/сек
- bsf RCSTA,SPEN ;Разрешение одиночн приема в синхронном режиме. Бит5=1:
- ;одиночн режим разрешен(сбрасывается в '0' по завершении приема)
- bsf TXSTA,TXEN; Разрешение передачи данных по USART
- ;Организация чтения из ОЗУ
- movlw .22; Задаем количество слов посылки 22
- movwf Num
- lfsr FSR0,0x100;Задаем начальный адресс массива в ОЗУ
- movlw 0xAA; Формируем посылку для ЖК-дисплея:
- movwf INDF0;
- incf FSR0L
- movlw 0x11; - команда включения ЖК-дисплея
- movwf INDF0
- incf FSR0L
- movlw 0xAA;
- movwf INDF0
- incf FSR0L
- movlw 0x22; - команда выключения курсора
- movwf INDF0
- incf FSR0L
- movlw 0xAA
- movwf INDF0
- incf FSR0L
- movlw 0x10; - команда очистки дисплея
- movwf INDF0
- incf FSR0L;
- movlw 0xAA
- movwf INDF0
- incf FSR0L
- movlw 0x20; - команда установки позиции курсора
- movwf INDF0; [0,0] - строка, столбец
- incf FSR0L
- movlw 0x00; row
- movwf INDF0
- incf FSR0L
- movlw 0x00; column
- movwf INDF0
- incf FSR0L
- movlw 0xAA
- movwf INDF0
- incf FSR0L
- movlw 0x25; Формирование пакета данных для отображения на дисплее
- movwf INDF0
- incf FSR0L; Текстовое сообщение в коде ASCII:
- movlw 0x42; B
- movwf INDF0
- incf FSR0L
- movlw 0x72; r
- movwf INDF0
- incf FSR0L
- movlw 0x69; i
- movwf INDF0
- incf FSR0L
- movlw 0x67; g
- movwf INDF0
- incf FSR0L
- movlw 0x61; a
- movwf INDF0
- incf FSR0L
- movlw 0x64; d
- movwf INDF0
- incf FSR0L
- movlw 0x61; a
- movwf INDF0
- incf FSR0L
- movlw 0x20; _
- movwf INDF0
- incf FSR0L
- movlw 0x31; 1
- movwf INDF0
- incf FSR0L
- movlw 0x0D; Конец пакета данных для передачи
- movwf INDF0
- WaitPressButton: ;ожидание нажатия на кнопку( логическ '0' на RB0)
- btfsc PORTB,RB0
- bra WaitPressButton
- bsf LATB,RB3 ;при нажатии на кнопку включается светодиод на выводе
- ;RB0
- WaitUnpressButton: ;ожидание отпускания кнопки( логическ '1' на RB0)
- btfss PORTB,RB0
- bra WaitUnpressButton
- bra SendMessAdr; переход к пересылке сообщения из ОЗУ в дисплей
- ; передача сообщения на ЖК-дисплей из ОЗУ
- SendMessAdr:
- lfsr FSR0, 0x100; задаем начальный адрес массива в ОЗУ
- SendMess:
- movff INDF0,WREG ;передаем данные из памяти через WREG в регистр TXREG
- movwf TXREG
- TX_TRMT: ;Опрашиваем бит готовности [TRMT], TXSTA[TRMT]=1,
- btfss TXTA,TRMT ;если да - переход на метку BUSY
- bra TX_TRMT
- bra BUSY
- BUSY:
- btfsc LATC, RC5; Опрашиваем бит RC5 (BUSY от дисплея), если = 1, включаем
- bra BUSY_LED_ON; светодиод RB5 и ждём окончания операции, если RC5 = 0,
- bra NEXT_DATA; переход к следующему слову в ОЗУ
- BUSY_LED_ON:
- bsf LATB, RB5; Включаем светоиод RB5
- bra BUSY
- NEXT_DATA: ;Переход к следующему значению:
- incf FSR0L; увеличение адреса на 1, уменьшениче счётчика слов на 1,
- decf Num; если Num >= 1, переход к передаче следующего слова,
- bnz SendMess; если нет - выход из цикла
- bcf LATB, RB5; Выкл. свеодиода RB5
- bra EEPROM_Reading; Переходим к чтению из EEPROM
- ;******************************************************************************
- EEPROM_Reading:
- movlw 0x16 ; запись количества слов для считывания из EEPROM NumBook=0x16
- movwf NumBook
- movlw ConstShiftAdrEE; записываем константу сдвига адреса в регистр Data_EE_Adr
- movlw LOW AdresEE; запись младшего байта адреса AdressEE=00 во WREG
- addwf Data_EE_Addr,W; складываем содержимое Data_EE_Addr и WREG(формируем данные
- ;для смещения)
- movwf EEADR;
- bcf EECON1,EEPGD; Сбразываем(EECON1 [EEPGD]=0)-задаем точку смещения для памяти
- ; данных
- bcf EECON1,CFGS; Сбразываем(EECON1 [CFGS]=0)- разрешаем доступ к EEPROM
- Next_byte:
- bsf EECON1, RD; Настраивем операцию чтения из EEPROM
- movf EEDATA, W; Переносим данные из регистра EEDATA в WREG
- incf EEADR; Переходим к следующему адресу
- movwf TXREG; Пересылаем данные из WREG для USART дисплея
- TX_TRMT2:
- btfss TXSTA, TRMT; Опрашиваем бит готовности
- bra TX_TRMT2
- decfsz NumBook, F; Проверяем счётчик считанных слов, если Z != 0,
- bra Next_byte; считываем и передаём следующий байт
- bra TABLE_Reading; Переход к табличному чтению
- ;******************************************************************************
- ;Таблица данных для размещения в памяти программ
- ORG 0x100 ;указание адреса размещения таблицы данных в памяти программ
- ConstHeadTabLed:;Формирование посылки данных
- DB 0xAA,0x20,0x00,0x09;установка позиции курсора
- DB 0xAA,0x25; данные для отображения 'Brig.1'
- DB 0x42,0x72,0x69,0x67,0x2E,0x31,0x0D
- DB 0xAA,0x20,0x01,0x0F; окончание посылки, новая позиция курсора,
- DB 0xAA,0x23;мигание курсора
- ;******************************************************************************
- TABLE_Reading:
- movlw UPPER ConstHeadTabLed ;запись регистра указателя адреса для таблицы
- movwf TBLPTRU ; TBLPTR
- movwf HIGH ConstHeadTabLed
- movwf TBLPTRH
- movlw LOW ConstHeadTabLed
- movwf TBLPTRL
- movlw ConstNumRead ; Запись во WREG количества слов для чтения
- movwf NumRead
- LoopReadTable:
- TBLRD*+; программное чтение данных с инкрементом адреса
- movff TABLAT,TXREG; ппересылка даных из памяти программы TABLAT в USART для
- ; жк-дисплея
- TX_TRMT3: btfss TXSTA, TRMT; опрос бита готовности [TRMT]
- bra TX_TRMT3
- decfsz NumRead,F; проверяем счетчик считанных слов,если Z != 0,
- bra LoopReadTable; переход к следующему байту таблицы
- HALT
- ;End of program
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement