Advertisement
Guest User

BADian

a guest
Nov 21st, 2019
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 14.84 KB | None | 0 0
  1. ;******************************************************************************
  2. ;   This file is a basic template for creating relocatable assembly code for  *
  3. ;   a PIC18F2520. Copy this file into your project directory and modify or    *
  4. ;   add to it as needed.                                                      *
  5. ;                                                                             *
  6. ;   The PIC18FXXXX architecture allows two interrupt configurations. This     *
  7. ;   template code is written for priority interrupt levels and the IPEN bit   *
  8. ;   in the RCON register must be set to enable priority levels. If IPEN is    *
  9. ;   left in its default zero state, only the interrupt vector at 0x008 will   *
  10. ;   be used and the WREG_TEMP, BSR_TEMP and STATUS_TEMP variables will not    *
  11. ;   be needed.                                                                *
  12. ;                                                                             *
  13. ;   Refer to the MPASM User's Guide for additional information on the         *
  14. ;   features of the assembler and linker.                                     *
  15. ;                                                                             *
  16. ;   Refer to the PIC18Fxx20 Data Sheet for additional                         *
  17. ;   information on the architecture and instruction set.                      *
  18. ;                                                                             *
  19. ;******************************************************************************
  20. ;                                                                             *
  21. ;    Filename:                                                                *
  22. ;    Date:                                                                    *
  23. ;    File Version:                                                            *
  24. ;                                                                             *
  25. ;    Author:                                                                  *
  26. ;    Company:                                                                 *
  27. ;                                                                             *
  28. ;******************************************************************************
  29. ;                                                                             *
  30. ;    Files required: P18F2520.INC                                             *
  31. ;                                                                             *
  32. ;******************************************************************************
  33.  
  34.     LIST P=18F2520, F=INHX32 ;directive to define processor and file format
  35.     #include <P18F2520.INC>  ;processor specific variable definitions
  36.  
  37. ;******************************************************************************
  38. ;Configuration bits
  39. ;Microchip has changed the format for defining the configuration bits, please
  40. ;see the .inc file for futher details on notation.  Below are a few examples.
  41.  
  42.  
  43.  
  44. ;   Oscillator Selection:
  45. CONFIG OSC = INTIO67,WDT = OFF,PBADEN = OFF,XINST = OFF,DEBUG = ON,MCLRE = ON              ;использования встроенного осциллятора
  46.          ;а также конфигурирование периферийных устройтв
  47.  
  48.  
  49.  
  50.       ;конфигурирование тактового осциллятора в режим
  51.  
  52. ;******************************************************************************
  53. ;Variable definitions
  54. ; These variables are only needed if low priority interrupts are used.
  55. ; More variables may be needed to store other special function registers used
  56. ; in the interrupt routines.
  57.  
  58. UDATA_ACS           ;инициализация регистров и констант
  59.      
  60.   BSR_TEMP  res 1      ;restore BSR register
  61.   WREG_TEMP res 1      ;restore working register
  62.   STATUS_TEMP res 1
  63. ;Data memory reading
  64. Num     RES 1  
  65. ;EEPROM reading
  66. NumBook     RES 1
  67. Data_EE_Addr    RES 1
  68. ;Program memory Table Reading
  69. NumRead     RES 1
  70. ConstNumRead    EQU .19
  71. ConstStartPositionRead  EQU .0
  72. ConstShiftAdrEE EQU .0
  73.          
  74. ;******************************************************************************
  75. ;EEPROM data            инициализация РПЗУ(EEPROM)
  76.  
  77. AdressEE    EQU 0xF00000   ;формирование массива данных в EEPROM
  78. DATA_EEPROM CODE    AdressEE
  79.  
  80. DE  0xAA,0x20,0x01,0x00,0xAA, 0x25, "Brigada_7",0x0D           ;команда управления положением курсора
  81.    ;формирование посылки данных для отображения
  82.                  ;на дисплее
  83.  
  84. ;******************************************************************************
  85. ;Reset vector
  86. ; This code will start executing when a reset occurs.
  87.  
  88. RESET_VECTOR    CODE    0x0000
  89.  
  90.         goto    Main        ;go to start of main code
  91.  
  92. ;******************************************************************************
  93. ;High priority interrupt vector
  94. ; This code will start executing when a high priority interrupt occurs or
  95. ; when any interrupt occurs if interrupt priorities are not enabled.
  96.  
  97. HI_INT_VECTOR   CODE    0x0008
  98.  
  99.         bra HighInt     ;go to high priority interrupt routine
  100.  
  101. ;******************************************************************************
  102. ;Low priority interrupt vector
  103. ; This code will start executing when a low priority interrupt occurs.
  104. ; This code can be removed if low priority interrupts are not used.
  105.  
  106. LOW_INT_VECTOR  CODE    0x0018
  107.  
  108.         bra LowInt      ;go to low priority interrupt routine
  109.  
  110. ;******************************************************************************
  111. ;High priority interrupt routine
  112. ; The high priority interrupt code is placed here.
  113.  
  114.         CODE
  115.  
  116. HighInt:
  117.  
  118. ;   *** high priority interrupt code goes here ***
  119.  
  120.  
  121.         retfie  FAST
  122.  
  123. ;******************************************************************************
  124. ;Low priority interrupt routine
  125. ; The low priority interrupt code is placed here.
  126. ; This code can be removed if low priority interrupts are not used.
  127.  
  128. LowInt:
  129.         movff   STATUS,STATUS_TEMP  ;save STATUS register
  130.         movff   WREG,WREG_TEMP      ;save working register
  131.         movff   BSR,BSR_TEMP        ;save BSR register
  132.  
  133. ;   *** low priority interrupt code goes here ***
  134.  
  135.  
  136.         movff   BSR_TEMP,BSR        ;restore BSR register
  137.         movff   WREG_TEMP,WREG      ;restore working register
  138.         movff   STATUS_TEMP,STATUS  ;restore STATUS register
  139.         retfie
  140.  
  141. ;******************************************************************************
  142. ;Start of main program
  143. ; The main program code is placed here.
  144.  
  145. Main:           ;Запись в регистр OSCCON b'01110011'
  146. bsf OSCCON,SCS0; ;Выбор источника задающего осциллятора тактовой частоты
  147. bsf OSCCON,SCS1; 11 - от внутреннего тактового осциллятора
  148. bsf OSCCON,IRCF0; Выбор тактовой частоты посл делителя:
  149. bsf OSCCON,IRCF1; 111 - 8Мгц. Бит2=0:-частота вн такт осц нестабильна
  150. bsf OSCCON,IRCF2; Бит3=0:-идет время таймаута, внешн кварц осц не готов
  151.  
  152. movlw b'10000000';Бит 8:выбор источника низкой частоты внутреннего осциллятора
  153. movwf OSCTUNE;   31,25 кГц от 8 МГц INTOSC источника. бит 6 умножителя
  154.          ;частоты отключен, биты 0-5: тактовая частота подстраивается
  155.          ;на центральную
  156. ;         Конфигурация портов B и C:      
  157. movlw b'00000001';RB0 - чтение, RB1-RB7 - вывод
  158. movwf TRISB
  159. movwf LATB
  160.          
  161. movlw b'11100000' ;TX(RC6),RX(RC7), BUSY от жк (RС5) - чтение, отсальные - вывод
  162. movwf TRISC
  163. movwf LATC
  164.  
  165. StartMain:      ;задаем количество слов для записи в ОЗУ
  166.     movlw .10
  167.     movwf Num
  168. ;           Конфигурирование интерфейса USART
  169. ;Transmit status and control
  170. bcf TXSTA,CSRC; Синхронный режим - ведомый, внешн такт сигнал с входа CK
  171. bcf TXSTA,TX9;Разрешение 9разрядн передачи; TX9=0:- 8разрядная передача
  172. bcf TXSTA,SYNC; Установка асинхронного режима
  173. bcf TXSTA,BRGH; низкоскоростной режим
  174. ;Receive status and Control
  175. bcf RCSTA,TX9;Разрешение приема 9 бит; RC9=0:- 8разрядн прием
  176. bcf RCSTA,CREN; Запрет приема
  177.    
  178. clrf SPBRG; Обнуляем регистр SPBRG
  179. movlw .12; Записываем в него коэфф 12 для формирования скорости передачи
  180. movwf SPBRG; 9600 бод/сек
  181.  
  182. bsf RCSTA,SPEN ;Разрешение одиночн приема в синхронном режиме. Бит5=1:
  183.            ;одиночн режим разрешен(сбрасывается в '0' по завершении приема)
  184. bsf TXSTA,TXEN; Разрешение передачи данных по USART
  185.  
  186. ;Организация чтения из ОЗУ
  187. movlw .22;  Задаем количество слов посылки 22
  188. movwf Num
  189. lfsr FSR0,0x100;Задаем начальный адресс массива в ОЗУ
  190. movlw 0xAA;    Формируем посылку для ЖК-дисплея:
  191. movwf INDF0;  
  192. incf FSR0L
  193. movlw 0x11;  - команда включения ЖК-дисплея
  194. movwf INDF0
  195. incf FSR0L
  196. movlw 0xAA;    
  197. movwf INDF0
  198. incf FSR0L
  199. movlw 0x22; - команда выключения курсора
  200. movwf INDF0
  201. incf FSR0L
  202. movlw 0xAA
  203. movwf INDF0
  204. incf FSR0L
  205. movlw 0x10; - команда очистки дисплея
  206. movwf INDF0
  207. incf FSR0L;
  208. movlw 0xAA
  209. movwf INDF0
  210. incf FSR0L
  211. movlw 0x20; - команда установки позиции курсора  
  212. movwf INDF0; [0,0] - строка, столбец
  213. incf FSR0L
  214. movlw 0x00; row
  215. movwf INDF0
  216. incf FSR0L
  217. movlw 0x00; column
  218. movwf INDF0
  219. incf FSR0L
  220. movlw 0xAA
  221. movwf INDF0
  222. incf FSR0L
  223. movlw 0x25; Формирование пакета данных для отображения на дисплее
  224. movwf INDF0
  225. incf FSR0L; Текстовое сообщение в коде ASCII:
  226. movlw 0x42; B
  227. movwf INDF0
  228. incf FSR0L
  229. movlw 0x72; r
  230. movwf INDF0
  231. incf FSR0L
  232. movlw 0x69; i
  233. movwf INDF0
  234. incf FSR0L
  235. movlw 0x67; g
  236. movwf INDF0
  237. incf FSR0L
  238. movlw 0x61; a
  239. movwf INDF0
  240. incf FSR0L
  241. movlw 0x64; d
  242. movwf INDF0
  243. incf FSR0L
  244. movlw 0x61; a
  245. movwf INDF0
  246. incf FSR0L
  247. movlw 0x5F; _
  248. movwf INDF0
  249. incf FSR0L
  250. movlw 0x37; 1
  251. movwf INDF0
  252. incf FSR0L
  253. movlw 0x0D; Конец пакета данных для передачи
  254. movwf INDF0
  255.  
  256.  
  257.  
  258. WaitPressButton:    ;ожидание нажатия на кнопку( логическ '0' на RB0)
  259. btfsc PORTB,RB0    
  260. bra WaitPressButton
  261. bsf LATB,RB3        ;при нажатии на кнопку включается светодиод на выводе
  262.             ;RB0
  263. WaitUnpressButton:  ;ожидание отпускания кнопки( логическ '1' на RB0)
  264. btfss PORTB,RB0
  265. bra WaitUnpressButton
  266. bra SendMessAdr;    переход к пересылке сообщения из ОЗУ в дисплей
  267. ;           передача сообщения на ЖК-дисплей из ОЗУ
  268. SendMessAdr:
  269. lfsr FSR0, 0x100;   задаем начальный адрес массива в ОЗУ
  270. SendMess:
  271. movff INDF0,WREG    ;передаем данные из памяти через WREG в регистр TXREG
  272. movwf TXREG
  273.  
  274. TX_TRMT:        ;Опрашиваем бит готовности [TRMT], TXSTA[TRMT]=1,
  275. btfss TXSTA,TRMT     ;если да - переход на метку BUSY
  276. bra TX_TRMT
  277. bra BUSY
  278.  
  279. BUSY:
  280. btfsc LATC, RC5; Опрашиваем бит RC5 (BUSY от дисплея), если = 1, включаем
  281. bra BUSY_LED_ON; светодиод RB5 и ждём окончания операции, если RC5 = 0,
  282. bra NEXT_DATA; переход к следующему слову в ОЗУ
  283.  
  284. BUSY_LED_ON:
  285. bsf LATB, RB5; Включаем светоиод RB5
  286. bra BUSY
  287.  
  288. NEXT_DATA: ;Переход к следующему значению:
  289. incf FSR0L; увеличение адреса на 1, уменьшениче счётчика слов на 1,
  290. decf Num;  если Num >= 1, переход к передаче следующего слова,
  291. bnz SendMess;  если нет - выход из цикла
  292. bcf LATB, RB5; Выкл. свеодиода RB5
  293.  
  294.    
  295.   END
  296.    
  297.  END   
  298.    
  299.        
  300.    
  301.  END      
  302. ;******************************************************************************
  303. ;End of program
  304.  
  305.         END
  306.  
  307.            
  308.  
  309.    
  310.    
  311.    
  312.         ;PART 2  Работаем с памятью программы таблицы
  313.    
  314.    
  315.    
  316.    
  317.        
  318.        
  319.        
  320.        
  321.    
  322. TABLE_Reading:
  323.     movlw UPPER ConstHeadTabLed
  324.     movwf TBLPTRU
  325.     movlw HIGH ConstHeadTabLed
  326.     movwf TBLPTRH
  327.     movlw LOW ConstHeadTabLed
  328.     movwf TBLPTRL
  329.    
  330.    
  331.    
  332.     movlw ConstNumRead
  333.     movwf NumRead
  334.    
  335.     lfsr FSR0,0x200 ; начальный адрес
  336.    
  337.    
  338.    
  339.        
  340.       WaitPressButton:    ;ожидание нажатия на кнопку( логическ '0' на RB0)
  341. btfsc PORTB,RB0    
  342. bra WaitPressButton
  343. bsf LATB,RB3        ;при нажатии на кнопку включается светодиод на выводе
  344.             ;RB0
  345. WaitUnpressButton:  ;ожидание отпускания кнопки( логическ '1' на RB0)
  346. btfss PORTB,RB0
  347. bra WaitUnpressButton
  348. bra CiklReadTable;    переход к пересылке сообщения из ОЗУ в дисплей
  349. ;           передача сообщения на ЖК-дисплей из ОЗУ
  350.  
  351.  
  352.          
  353. CiklReadTable:  ;цикл чтения таблицы
  354.    
  355.  
  356.     TBLRD*+;    Чтение програмное  данных с инкрементом адреса
  357.  
  358.     movff TABLAT,INDF0   ; сохраняем в память ОЗУ и пересылаем на жк дисплей
  359.     incf FSR0L
  360.    
  361.     movff TABLAT,TXREG
  362.    
  363.     TX_TRMT3:
  364.      btfss TXSTA,TRMT
  365.      bra TX_TRMT3;
  366.      
  367.      decfsz NumRead,F
  368.      
  369.     bra WaitPressButton
  370.     bra PROG_End
  371.    
  372.    
  373.    
  374.    
  375.    
  376.    
  377.    
  378.    
  379.     ORG 0x120 ;адрес таблицы
  380.    
  381.    
  382.     ConstHeadTabLed:
  383.     DB 0xAA,0x20,0x00,0x01
  384.     DB 0xAA,0x47 ;g
  385.    
  386.     DB 0x20     ; -
  387.     DB 0x47     ; g
  388.    
  389.     DB 0x20     ; -
  390.     DB 0x47     ; g
  391.    
  392.     DB 0x20     ; -
  393.     DB 0x47     ; o
  394.    
  395.     DB 0x20     ; -
  396.     DB 0x47     ; n
  397.    
  398.     DB 0x20     ; -
  399.     DB 0x47     ; e
  400.    
  401.     DB 0x20     ; -
  402.     DB 0x47     ; x
  403.    
  404.     DB 0x20     ; -
  405.     DB 0x47,0x0D     ; t
  406.     DB 0xAA,0x20,0x01,0x0F
  407.     DB 0xAA,0x23
  408.    
  409.    
  410.    
  411.    
  412.     PROG_End:
  413.     Halt
  414.     END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement