Advertisement
Guest User

Untitled

a guest
May 29th, 2015
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.34 KB | None | 0 0
  1. #include <p16f877A.inc> ; definicje specyficzne dla mikrokontrolera
  2.  
  3. __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF
  4.  
  5.  
  6. LCD_RS_BIT equ 2
  7. LCD_E_BIT equ 3
  8. LCD_D4_BIT equ 4
  9. LCD_D5_BIT equ 5
  10. LCD_D6_BIT equ 6
  11. LCD_D7_BIT equ 7
  12.  
  13. LCD_RS equ 1 << LCD_RS_BIT
  14. LCD_E equ 1 << LCD_E_BIT
  15. LCD_D4 equ 1 << LCD_D4_BIT
  16. LCD_D5 equ 1 << LCD_D5_BIT
  17. LCD_D6 equ 1 << LCD_D6_BIT
  18. LCD_D7 equ 1 << LCD_D7_BIT
  19.  
  20. LCD_FUNC_SET equ B'00100000'
  21. LCD_FUNC_SET_8B equ B'00010000'
  22. LCD_FUNC_SET_4B equ B'00000000'
  23. LCD_FUNC_SET_2L equ B'00001000'
  24. LCD_FUNC_SET_1L equ B'00000000'
  25. LCD_FUNC_SET_HFONT equ B'00000100'
  26. LCD_FUNC_SET_LFONT equ B'00000000'
  27.  
  28. LCD_DISP_CTRL equ B'00001000'
  29. LCD_DISP_CTRL_ON equ B'00000100'
  30. LCD_DISP_CTRL_OFF equ B'00000000'
  31. LCD_DISP_CTRL_CUR_ON equ B'00000010'
  32. LCD_DISP_CTRL_CUR_OFF equ B'00000000'
  33. LCD_DISP_CTRL_BLK_ON equ B'00000001'
  34. LCD_DISP_CTRL_BLK_OFF equ B'00000000'
  35.  
  36. LCD_ENTRY_MODE equ B'00000100'
  37. LCD_ENTRY_MODE_INC equ B'00000010'
  38. LCD_ENTRY_MODE_DEC equ B'00000000'
  39. LCD_ENTRY_MODE_SHIFT equ B'00000001'
  40. LCD_ENTRY_MODE_NOTSHIFT equ B'00000000'
  41.  
  42. LCD_SET_CGRAM equ B'01000000'
  43. LCD_SET_DDRAM equ B'10000000'
  44.  
  45. LCD_SHIFT equ B'00010000'
  46. LCD_SHIFT_DISP equ B'00001000'
  47. LCD_SHIFT_RIGHT equ B'00000100'
  48. LCD_SHIFT_LEFT equ B'00000000'
  49.  
  50. LCD_DISP_CLEAR equ B'00000001'
  51.  
  52.  
  53. UDATA
  54. ; zmienna przechowująca kod rozkazu do wykonania w procedurze wykonaj
  55. lcd_data RES 1
  56.  
  57. tmp res 1
  58. tmp2 res 1
  59. tmp3 res 1
  60.  
  61. address res 1
  62. counter res 1
  63.  
  64. RST CODE 0x000 ; wektor resetu procesora
  65.  
  66. pagesel main ; wybór strony pamięci programu
  67. goto main ; skok do początku programu
  68.  
  69. PGM CODE
  70.  
  71. main
  72. ; Inicjalizacja niezbędnych komponentów
  73. banksel PORTA ; wybór banku 0
  74. clrf PORTA ; inicjalizacja PORTA przez zerowanie zatrzasków wyjściowych
  75. bsf STATUS, RP0 ; wybór banku 1
  76. movlw B'00000110' ; przełączenie wejść na cyfrowe
  77. movwf ADCON1 ; poprzez odłączenie przetwornika A/C
  78. clrf TRISA ; ustawienie wyprowadzen PORTA na wyjścia
  79. clrf TRISB ; ustawienie wyprowadzen PORTB na wyjścia
  80.  
  81. bcf STATUS, RP0 ; wybór banku 0
  82.  
  83. ; inicjalizacja wyświetlacza
  84. call delay_20ms
  85. call delay_20ms
  86.  
  87. call lcd_send_first_fs ; 1. instrukcja Function set
  88. call delay_20ms ; czekam więcej niż 4.1 ms
  89.  
  90. call lcd_send_first_fs ; 2. instrukcja Function set
  91. call delay_20ms ; czekam więcej niż 100 us
  92.  
  93. call lcd_send_first_fs ; 3. instrukcja Function set
  94. call delay_20ms ; czekam więcej niż 40 us
  95.  
  96. movlw LCD_FUNC_SET | LCD_FUNC_SET_4B | LCD_FUNC_SET_2L | LCD_FUNC_SET_LFONT
  97. call lcd_send_command
  98.  
  99. movlw LCD_DISP_CTRL | LCD_DISP_CTRL_OFF | LCD_DISP_CTRL_CUR_OFF | LCD_DISP_CTRL_BLK_OFF
  100. call lcd_send_command
  101.  
  102. movlw LCD_ENTRY_MODE | LCD_ENTRY_MODE_INC | LCD_ENTRY_MODE_NOTSHIFT
  103. call lcd_send_command
  104.  
  105. movlw LCD_DISP_CLEAR
  106. call lcd_send_command
  107.  
  108. movlw LCD_DISP_CTRL | LCD_DISP_CTRL_ON | LCD_DISP_CTRL_CUR_OFF | LCD_DISP_CTRL_BLK_ON
  109. call lcd_send_command
  110.  
  111. ; koniec inicjalizacji
  112. movlw LCD_SET_CGRAM
  113. call lcd_send_command
  114.  
  115. clrf counter
  116. wysylam_a
  117. movfw counter
  118. call lcd_get_polish_a
  119. call lcd_send
  120. incf counter
  121. movlw 8
  122. subwf counter, W
  123. btfss STATUS, Z
  124. goto wysylam_a
  125.  
  126. ;;;; Ę
  127. clrf counter
  128. wysylam_e
  129. movfw counter
  130. call lcd_get_polish_e
  131. call lcd_send
  132. incf counter
  133. movlw 8
  134. subwf counter, W
  135. btfss STATUS, Z
  136. goto wysylam_e
  137.  
  138. ;;;; Ć
  139. clrf counter
  140. wysylam_c
  141. movfw counter
  142. call lcd_get_polish_c
  143. call lcd_send
  144. incf counter
  145. movlw 8
  146. subwf counter, W
  147. btfss STATUS, Z
  148. goto wysylam_c
  149.  
  150. ;;;; L
  151. clrf counter
  152. wysylam_l
  153. movfw counter
  154. call lcd_get_polish_l
  155. call lcd_send
  156. incf counter
  157. movlw 8
  158. subwf counter, W
  159. btfss STATUS, Z
  160. goto wysylam_l
  161.  
  162. ;;;; Ń
  163. clrf counter
  164. wysylam_n
  165. movfw counter
  166. call lcd_get_polish_n
  167. call lcd_send
  168. incf counter
  169. movlw 8
  170. subwf counter, W
  171. btfss STATUS, Z
  172. goto wysylam_n
  173.  
  174. ;;;; Ó
  175. clrf counter
  176. wysylam_o
  177. movfw counter
  178. call lcd_get_polish_o
  179. call lcd_send
  180. incf counter
  181. movlw 8
  182. subwf counter, W
  183. btfss STATUS, Z
  184. goto wysylam_o
  185.  
  186. ;;;; Ź
  187. clrf counter
  188. wysylam_zi
  189. movfw counter
  190. call lcd_get_polish_zi
  191. call lcd_send
  192. incf counter
  193. movlw 8
  194. subwf counter, W
  195. btfss STATUS, Z
  196. goto wysylam_zi
  197.  
  198. ;;;; Ż
  199. clrf counter
  200. wysylam_zy
  201. movfw counter
  202. call lcd_get_polish_zy
  203. call lcd_send
  204. incf counter
  205. movlw 8
  206. subwf counter, W
  207. btfss STATUS, Z
  208. goto wysylam_zy
  209.  
  210. movlw LCD_SET_DDRAM
  211. call lcd_send_command
  212.  
  213. movlw 'J'
  214. call lcd_send
  215. movlw 'A'
  216. call lcd_send
  217. movlw 'N'
  218. call lcd_send
  219. movlw ' '
  220. call lcd_send
  221. movlw 6
  222. call lcd_send
  223. movlw 'D'
  224. call lcd_send
  225. movlw 6
  226. call lcd_send
  227. movlw 'B'
  228. call lcd_send
  229. movlw 3
  230. call lcd_send
  231. movlw 'O'
  232. call lcd_send
  233.  
  234. movlw LCD_SET_DDRAM | 0x40
  235. call lcd_send_command
  236. movlw 0
  237. call lcd_send
  238. movlw 1
  239. call lcd_send
  240. movlw 2
  241. call lcd_send
  242. movlw 3
  243. call lcd_send
  244. movlw 4
  245. call lcd_send
  246. movlw 5
  247. call lcd_send
  248. movlw 6
  249. call lcd_send
  250. movlw 7
  251. call lcd_send
  252.  
  253. goto $
  254.  
  255. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  256. ; wysyłanie znaku do CGRAM
  257. lcd_get_polish_a
  258. addwf PCL, f
  259. dt 0x0E, 0x11, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x02 ; Ą
  260. lcd_get_polish_e
  261. addwf PCL, f
  262. dt 0x1E, 0x10, 0x10, 0x1C, 0x10, 0x10, 0x1E, 0x01 ; Ę
  263. lcd_get_polish_c
  264. addwf PCL, f
  265. dt 0x04, 0x0E, 0x15, 0x10, 0x10, 0x10, 0x11, 0x0E ; Ć
  266. lcd_get_polish_l
  267. addwf PCL, f
  268. dt 0x08, 0x08, 0x0C, 0x08, 0x18, 0x08, 0x0F, 0x00 ; Ł
  269. lcd_get_polish_n
  270. addwf PCL, f
  271. dt 0x04, 0x15, 0x19, 0x15, 0x15, 0x13, 0x11, 0x00 ; Ń
  272. lcd_get_polish_o
  273. addwf PCL, f
  274. dt 0x04, 0x0E, 0x15, 0x11, 0x11, 0x11, 0x11, 0x0E ; Ó
  275. lcd_get_polish_zi
  276. addwf PCL, f
  277. dt 0x04, 0x1F, 0x05, 0x02, 0x04, 0x08, 0x10, 0x1F ; Ź
  278. lcd_get_polish_zy
  279. addwf PCL, f
  280. dt 0x04, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F ; Ż
  281.  
  282.  
  283. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  284.  
  285. lcd_shift_left
  286. movlw LCD_SHIFT | LCD_SHIFT_DISP | LCD_SHIFT_LEFT
  287. call lcd_send_command
  288. return
  289.  
  290. lcd_shift_right
  291. movlw LCD_SHIFT | LCD_SHIFT_DISP | LCD_SHIFT_RIGHT
  292. call lcd_send_command
  293. return
  294.  
  295. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  296. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  297.  
  298. lcd_send_command ;wysylanie danych do LCD
  299. movwf lcd_data
  300. andlw 0xF0
  301. iorlw LCD_E ; ustaw E
  302. movwf PORTB
  303. swapf lcd_data, W ; pobierz znak
  304. andlw 0xF0
  305. bcf PORTB, LCD_E_BIT
  306. nop
  307. iorlw LCD_E ; ustaw E
  308. movwf PORTB
  309. goto $+1
  310. bcf PORTB, LCD_E_BIT
  311. call delay_20ms
  312. return
  313.  
  314. lcd_send ;wysylanie danych do LCD
  315. movwf lcd_data
  316. andlw 0xF0
  317. iorlw LCD_RS | LCD_E ; ustaw RS i E
  318. movwf PORTB
  319. swapf lcd_data, W ; pobierz znak
  320. andlw 0xF0
  321. bcf PORTB, LCD_E_BIT
  322. nop
  323. iorlw LCD_RS | LCD_E ; ustaw RS i E
  324. movwf PORTB
  325. goto $+1
  326. bcf PORTB, LCD_E_BIT
  327. call delay_20ms
  328. return
  329.  
  330. lcd_send_first_fs
  331. movlw LCD_E | LCD_D5 | LCD_D4
  332. movwf PORTB
  333. goto $+1
  334. goto $+1
  335. bcf PORTB, LCD_E_BIT
  336. return
  337.  
  338. lcd_function_set
  339. movlw LCD_E | LCD_D5
  340. movwf PORTB
  341. goto $+1
  342. goto $+1
  343. bcf PORTB, LCD_E_BIT
  344. movlw LCD_E | LCD_D7 | LCD_D6
  345. movwf PORTB
  346. goto $+1
  347. goto $+1
  348. bcf PORTB, LCD_E_BIT
  349. return
  350.  
  351. lcd_display_off
  352. movlw LCD_E
  353. movwf PORTB
  354. goto $+1
  355. goto $+1
  356. bcf PORTB, LCD_E_BIT
  357. movlw LCD_E | LCD_D7
  358. movwf PORTB
  359. goto $+1
  360. goto $+1
  361. bcf PORTB, LCD_E_BIT
  362. return
  363.  
  364. lcd_init_entry_mode
  365. movlw LCD_E
  366. goto $+1
  367. goto $+1
  368. bcf PORTB, LCD_E_BIT
  369. movlw LCD_E | LCD_D6
  370. movwf PORTB
  371. goto $+1
  372. goto $+1
  373. bcf PORTB, LCD_E_BIT
  374. call delay_20ms
  375. return
  376.  
  377. lcd_display_clear
  378. movlw LCD_E
  379. movwf PORTB
  380. goto $+1
  381. goto $+1
  382. bcf PORTB, LCD_E_BIT
  383. movlw LCD_E | LCD_D4
  384. movwf PORTB
  385. goto $+1
  386. goto $+1
  387. bcf PORTB, LCD_E_BIT
  388. call delay_20ms
  389. return
  390.  
  391. lcd_display_on
  392. movlw LCD_E
  393. movwf PORTB
  394. goto $+1
  395. goto $+1
  396. bcf PORTB, LCD_E_BIT
  397. movlw LCD_E | LCD_D7 | LCD_D6
  398. movwf PORTB
  399. goto $+1
  400. goto $+1
  401. bcf PORTB, LCD_E_BIT
  402. call delay_20ms
  403. return
  404.  
  405. delay_20ms
  406. movlw D'23'
  407. movwf tmp2
  408. call delay_1ms
  409. decfsz tmp2, f
  410. goto $-2
  411. return
  412.  
  413. delay_5ms
  414. movlw D'5'
  415. movwf tmp2
  416. call delay_1ms
  417. decfsz tmp2, f
  418. goto $-2
  419. return
  420.  
  421. delay_1ms
  422. call delay_600us
  423. call delay_298us
  424. movlw D'32'
  425. movwf tmp
  426. decfsz tmp, f
  427. goto $-1
  428. nop
  429. return
  430.  
  431. delay_600us
  432. call delay_298us
  433. call delay_298us
  434. return
  435.  
  436. delay_298us
  437. movlw 61
  438. movwf tmp
  439. decfsz tmp, f
  440. goto $-1
  441. nop
  442. nop
  443. return
  444.  
  445. _end
  446. goto _end
  447. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement