Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 13.60 KB | None | 0 0
  1. *****************************************************************
  2. LIST P=18F2520, F=INHX32
  3. #include <P18F2520.INC>  
  4. ;******************************************************************************
  5. CONFIG OSC = INTIO67        ;конфигурирование тактового осциллятора в режим
  6. WDT = OFF           ;использования встроенного осциллятора
  7. PBADEN = OFF            ;а также конфигурирование периферийных устройтв
  8. CONFIG LVP = OFF
  9. XINST = OFF
  10. DEBUG = ON
  11. MCLRE = ON
  12. ;******************************************************************************
  13. ;Variable definitions      
  14. UDATA               ;инициализация переменных и вспомогательных
  15. WREG_TEMP   RES 1   ;регистров  
  16. STATUS_TEMP RES 1  
  17. BSR_TEMP    RES 1  
  18.  
  19. UDATA_ACS           ;инициализация регистров и констант
  20. ;Data memory reading
  21. NUM     RES 1  
  22. ;EEPROM reading
  23. NumBook     RES 1
  24. Data_EE_Addr    RES 1
  25. ;Program memory Table Reading
  26. NumRead     RES 1
  27. ConstNumRead    EQU .19
  28. ConstStartPositionRead  EQU .0
  29. ConstShiftAdrEE EQU .0
  30.    
  31.    
  32. ;******************************************************************************
  33. ;EEPROM data            инициализация РПЗУ(EEPROM)
  34.  
  35. AdressEE    EQU 0xF00000   ;формирование массива данных в EEPROM
  36. DATA_EEPROM CODE    AdressEE
  37.  
  38. DE  0xAA,0x20,0x01,0x00,        ;команда управления положением курсора
  39. 0xAA, 0x25, "Brigada_1",   ;формирование посылки данных для отображения
  40. 0x0D                    ;на дисплее
  41.  
  42. ;******************************************************************************
  43. ;Reset vector
  44. ; This code will start executing when a reset occurs.
  45. RESET_VECTOR    CODE    0x0000      ;определение адреса вектора сброса
  46.  
  47.         goto    Main        ;переход на начало программы на метку main
  48.  
  49. ;******************************************************************************
  50. ;High priority interrupt vector
  51. ; This code will start executing when a high priority interrupt occurs or
  52. ; when any interrupt occurs if interrupt priorities are not enabled.
  53. HI_INT_VECTOR   CODE    0x0008
  54.  
  55.         bra HighInt     ;переход к подпрограмме обработки
  56.                                         ;прерываний высокого уровня
  57. ;******************************************************************************
  58. ;Low priority interrupt vector
  59. ; This code will start executing when a low priority interrupt occurs.
  60. ; This code can be removed if low priority interrupts are not used.
  61.  
  62. LOW_INT_VECTOR  CODE    0x0018
  63.  
  64.         bra LowInt      ;переход к подпрограмме обработки
  65.                                         ;прерываний высокого уровня
  66. ;******************************************************************************
  67. ;High priority interrupt routine
  68. ; The high priority interrupt code is placed here.
  69.  
  70.         CODE
  71.  
  72. HighInt:
  73.  
  74. ;   *** high priority interrupt code goes here ***
  75.  
  76.  
  77.         retfie  FAST
  78.  
  79. ;******************************************************************************
  80. ;Low priority interrupt routine
  81. ; The low priority interrupt code is placed here.
  82. ; This code can be removed if low priority interrupts are not used.
  83.  
  84. LowInt:
  85.         movff   STATUS,STATUS_TEM  ;Сохранение содержимого м смр
  86.                                    ;в вспомогательный регистр
  87.         movff   WREG,WREG_TEMP     ;Сохранение содержимого аккумулятора
  88.                                    ;в вспомогательный регистр
  89.         movff   BSR,BSR_TEMP       ;Сохранение содержимого аккумулятора
  90.                                            ;в вспомогательный регистр
  91. ;   *** low priority interrupt code goes here ***
  92.  
  93.  
  94.         movff   BSR_TEMP,BSR           ;восстановление содержимого
  95.                                        ;регистра BSR
  96.         movff   WREG_TEMP,WREG         ;восстановление содержимого
  97.                                        ;регистра WREG
  98.         movff   STATUS_TEMP,STATUS     ;восстановление содержимого
  99.                                        ;регистра STATUS
  100.         retfie
  101.  
  102. ;******************************************************************************
  103. ;Start of main program
  104. ; The main program code is placed here.
  105. ;   *** main code goes here ***
  106. Main:           ;Запись в регистр OSCCON b'01110011'
  107. bsf OSCCON,SCS0; ;Выбор источника задающего осциллятора тактовой частоты
  108. bsf OSCCON,SCS1; 11 - от внутреннего тактового осциллятора
  109. bsf OSCCON,IRCF0; Выбор тактовой частоты посл делителя:
  110. bsf OSCCON,IRCF1; 111 - 8Мгц. Бит2=0:-частота вн такт осц нестабильна
  111. bsf OSCCON,IRCF2; Бит3=0:-идет время таймаута, внешн кварц осц не готов
  112.  
  113. movlw b'10000000';Бит 8:выбор источника низкой частоты внутреннего осциллятора
  114. movwf OSCTUNE;   31,25 кГц от 8 МГц INTOSC источника. бит 6 умножителя
  115.          ;частоты отключен, биты 0-5: тактовая частота подстраивается
  116.          ;на центральную
  117. ;         Конфигурация портов B и C:      
  118. movlw b'00000001';RB0 - чтение, RB1-RB7 - вывод
  119. movwf TRISB
  120. movwf LATB
  121.          
  122. movlw '11100000' ;TX(RC6),RX(RC7), BUSY от жк (RС5) - чтение, отсальные - вывод
  123. movwf TRISC
  124. movwf LATC
  125.  
  126. StartMain:      ;задаем количество слов для записи в ОЗУ
  127.     movlw .10
  128.     movwf Num
  129. ;           Конфигурирование интерфейса USART
  130. ;Transmit status and control
  131. bcf TXSTA,CSRC; Синхронный режим - ведомый, внешн такт сигнал с входа CK
  132. bcf TXSTA,TX9;Разрешение 9разрядн передачи; TX9=0:- 8разрядная передача
  133. bcf TXSTA,SYNC; Установка асинхронного режима
  134. bcf TXSTA,BRGH; низкоскоростной режим
  135. ;Receive status and Control
  136. bcf RCSTA,TX9;Разрешение приема 9 бит; RC9=0:- 8разрядн прием
  137. bcf RCSTA,CREN; Запрет приема
  138.    
  139. clrf SPBRG; Обнуляем регистр SPBRG
  140. movlw .12; Записываем в него коэфф 12 для формирования скорости передачи
  141. movwf SPBRG; 9600 бод/сек
  142.  
  143. bsf RCSTA,SPEN ;Разрешение одиночн приема в синхронном режиме. Бит5=1:
  144.            ;одиночн режим разрешен(сбрасывается в '0' по завершении приема)
  145. bsf TXSTA,TXEN; Разрешение передачи данных по USART
  146.  
  147. ;Организация чтения из ОЗУ
  148. movlw .22;  Задаем количество слов посылки 22
  149. movwf Num
  150. lfsr FSR0,0x100;Задаем начальный адресс массива в ОЗУ
  151. movlw 0xAA;    Формируем посылку для ЖК-дисплея:
  152. movwf INDF0;  
  153. incf FSR0L
  154. movlw 0x11;  - команда включения ЖК-дисплея
  155. movwf INDF0
  156. incf FSR0L
  157. movlw 0xAA;    
  158. movwf INDF0
  159. incf FSR0L
  160. movlw 0x22; - команда выключения курсора
  161. movwf INDF0
  162. incf FSR0L
  163. movlw 0xAA
  164. movwf INDF0
  165. incf FSR0L
  166. movlw 0x10; - команда очистки дисплея
  167. movwf INDF0
  168. incf FSR0L;
  169. movlw 0xAA
  170. movwf INDF0
  171. incf FSR0L
  172. movlw 0x20; - команда установки позиции курсора  
  173. movwf INDF0; [0,0] - строка, столбец
  174. incf FSR0L
  175. movlw 0x00; row
  176. movwf INDF0
  177. incf FSR0L
  178. movlw 0x00; column
  179. movwf INDF0
  180. incf FSR0L
  181. movlw 0xAA
  182. movwf INDF0
  183. incf FSR0L
  184. movlw 0x25; Формирование пакета данных для отображения на дисплее
  185. movwf INDF0
  186. incf FSR0L; Текстовое сообщение в коде ASCII:
  187. movlw 0x42; B
  188. movwf INDF0
  189. incf FSR0L
  190. movlw 0x72; r
  191. movwf INDF0
  192. incf FSR0L
  193. movlw 0x69; i
  194. movwf INDF0
  195. incf FSR0L
  196. movlw 0x67; g
  197. movwf INDF0
  198. incf FSR0L
  199. movlw 0x61; a
  200. movwf INDF0
  201. incf FSR0L
  202. movlw 0x64; d
  203. movwf INDF0
  204. incf FSR0L
  205. movlw 0x61; a
  206. movwf INDF0
  207. incf FSR0L
  208. movlw 0x20; _
  209. movwf INDF0
  210. incf FSR0L
  211. movlw 0x31; 1
  212. movwf INDF0
  213. incf FSR0L
  214. movlw 0x0D; Конец пакета данных для передачи
  215. movwf INDF0
  216.  
  217. WaitPressButton:    ;ожидание нажатия на кнопку( логическ '0' на RB0)
  218. btfsc PORTB,RB0    
  219. bra WaitPressButton
  220. bsf LATB,RB3        ;при нажатии на кнопку включается светодиод на выводе
  221.             ;RB0
  222. WaitUnpressButton:  ;ожидание отпускания кнопки( логическ '1' на RB0)
  223. btfss PORTB,RB0
  224. bra WaitUnpressButton
  225. bra SendMessAdr;    переход к пересылке сообщения из ОЗУ в дисплей
  226. ;           передача сообщения на ЖК-дисплей из ОЗУ
  227. SendMessAdr:
  228. lfsr FSR0, 0x100;   задаем начальный адрес массива в ОЗУ
  229. SendMess:
  230. movff INDF0,WREG    ;передаем данные из памяти через WREG в регистр TXREG
  231. movwf TXREG
  232.  
  233. TX_TRMT:        ;Опрашиваем бит готовности [TRMT], TXSTA[TRMT]=1,
  234. btfss TXTA,TRMT     ;если да - переход на метку BUSY
  235. bra TX_TRMT
  236. bra BUSY
  237.  
  238. BUSY:
  239. btfsc LATC, RC5; Опрашиваем бит RC5 (BUSY от дисплея), если = 1, включаем
  240. bra BUSY_LED_ON; светодиод RB5 и ждём окончания операции, если RC5 = 0,
  241. bra NEXT_DATA; переход к следующему слову в ОЗУ
  242.  
  243. BUSY_LED_ON:
  244. bsf LATB, RB5; Включаем светоиод RB5
  245. bra BUSY
  246.  
  247. NEXT_DATA: ;Переход к следующему значению:
  248. incf FSR0L; увеличение адреса на 1, уменьшениче счётчика слов на 1,
  249. decf Num;  если Num >= 1, переход к передаче следующего слова,
  250. bnz SendMess;  если нет - выход из цикла
  251. bcf LATB, RB5; Выкл. свеодиода RB5
  252.  
  253. bra EEPROM_Reading; Переходим к чтению из EEPROM
  254. ;******************************************************************************    
  255. EEPROM_Reading:
  256. movlw 0x16 ; запись количества слов для считывания из EEPROM NumBook=0x16
  257. movwf NumBook
  258. movlw ConstShiftAdrEE; записываем константу сдвига адреса в регистр Data_EE_Adr
  259. movlw LOW AdresEE;  запись младшего байта адреса AdressEE=00 во WREG
  260.  
  261. addwf Data_EE_Addr,W; складываем содержимое Data_EE_Addr и WREG(формируем данные
  262.             ;для смещения)
  263. movwf EEADR;
  264. bcf EECON1,EEPGD; Сбразываем(EECON1 [EEPGD]=0)-задаем точку смещения для памяти
  265.         ; данных
  266. bcf EECON1,CFGS;  Сбразываем(EECON1 [CFGS]=0)- разрешаем доступ к EEPROM
  267.  
  268. Next_byte:
  269. bsf EECON1, RD; Настраивем операцию чтения из EEPROM
  270. movf EEDATA, W; Переносим данные из регистра EEDATA в WREG
  271.  
  272. incf EEADR; Переходим к следующему адресу
  273. movwf TXREG; Пересылаем данные из WREG для USART дисплея
  274.  
  275. TX_TRMT2:
  276. btfss TXSTA, TRMT; Опрашиваем бит готовности
  277. bra TX_TRMT2
  278.  
  279. decfsz NumBook, F; Проверяем счётчик считанных слов, если Z != 0,
  280. bra Next_byte; считываем и передаём следующий байт
  281. bra TABLE_Reading; Переход к табличному чтению
  282. ;******************************************************************************
  283. ;Таблица данных для размещения в памяти программ
  284. ORG 0x100   ;указание адреса размещения таблицы данных в памяти программ
  285.  
  286. ConstHeadTabLed:;Формирование посылки данных
  287. DB 0xAA,0x20,0x00,0x09;установка позиции курсора
  288. DB 0xAA,0x25; данные для отображения 'Brig.1'
  289. DB 0x42,0x72,0x69,0x67,0x2E,0x31,0x0D
  290. DB 0xAA,0x20,0x01,0x0F; окончание посылки, новая позиция курсора,
  291. DB 0xAA,0x23;мигание курсора
  292.  
  293. ;******************************************************************************
  294. TABLE_Reading:
  295. movlw UPPER ConstHeadTabLed ;запись регистра указателя адреса для таблицы
  296. movwf TBLPTRU           ; TBLPTR
  297. movwf HIGH ConstHeadTabLed
  298. movwf TBLPTRH
  299. movlw LOW ConstHeadTabLed
  300. movwf TBLPTRL
  301.  
  302. movlw ConstNumRead ; Запись во WREG количества слов для чтения
  303. movwf NumRead
  304.  
  305. LoopReadTable:
  306. TBLRD*+; программное чтение данных с инкрементом адреса
  307. movff TABLAT,TXREG; ппересылка даных из памяти программы TABLAT в USART для
  308.           ; жк-дисплея
  309. TX_TRMT3: btfss TXSTA, TRMT; опрос бита готовности [TRMT]
  310. bra TX_TRMT3
  311. decfsz NumRead,F;       проверяем счетчик считанных слов,если Z != 0,
  312. bra LoopReadTable;      переход к следующему байту таблицы
  313. HALT
  314. ;End of program
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement