Advertisement
Guest User

Untitled

a guest
May 29th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.82 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. LCD_DISPLAY_CLEAR equ 0x01 ; czyszczenie
  6. LCD_RETURN_HOME equ 0x02 ; skok na początek
  7. LCD_ENTRY_MODE_SET equ 0x04 ; zmiana trybu pracy
  8. LCD_DISPLAY_ON_OFF equ 0x08 ; sterowanie
  9. LCD_CURSOR_DISPLAY_SHIFT equ 0x10 ; przesunięcie kursora/wyświetlacza
  10. LCD_FUNCTION_SET equ 0x20 ; ustawienie podst. funkcji
  11. LCD_SET_CGRAM equ 0x40 ; ustawienie adresu CGRAM
  12. LCD_SET_DDRAM equ 0x80 ; ustawienie adresu DDRAM
  13.  
  14. ;argumenty
  15.  
  16. ;entry mode set
  17. LCD_EM_INC equ 0x02 ; inc kursor
  18. LCD_EM_DEC equ 0x00 ; dec kursor
  19. LCD_EM_DSPSHFT equ 0x01 ; przesunięcie całego wyświetlacza
  20.  
  21. ;display on/of
  22. LCD_DC_DSPON equ 0x04 ; włącz wyśw.
  23. LCD_DC_CRSRON equ 0x02 ; włącz kursor
  24. LCD_DC_BLINK equ 0x01 ; znak na kursorze miga
  25.  
  26. ; cursor/display shift
  27. LCD_SH_DSP equ 0x08 ; przesuń ekran
  28. LCD_SH_CURSOR equ 0x00 ; przesuń kursor
  29. LCD_SH_RIGHT equ 0x04 ; w prawo
  30. LCD_SH_LEFT equ 0x00 ; w lewo
  31.  
  32. ;function set
  33. LCD_FS_DATA8 equ 0x10 ; 8-bitó
  34. LCD_FS_DATA4 equ 0x00 ; 4-bity
  35. LCD_FS_2LINES equ 0x08 ; 2 linie wyświetlacza
  36. LCD_FS_1LINE equ 0x00 ; 1 linia wyświetlacza
  37. LCD_FS_5x10 equ 0x04 ; font 5x10
  38. LCD_FS_5x8 equ 0x00 ; font 5x8
  39.  
  40. RB3 equ 0x03 ; 3 bit portu B
  41. ENTER equ 0xC0
  42.  
  43. LCD_MODE_DATA equ 0x0C ; 1 do RS - dane
  44. LCD_MODE_CTRL equ 0x08 ; 0 do RS - komendy
  45.  
  46.  
  47. UDATA
  48. t_ms RES 2
  49. LCD_data RES 1 ; miejsce na dane wysylane
  50.  
  51. d1 RES 1
  52. d2 RES 1
  53. d3 RES 1
  54.  
  55. keyPressed RES 1
  56.  
  57. LCD_SEND MACRO MODE ; MODE - data albo command
  58. movf LCD_data, W ; ściągamy dane z W
  59. andlw 0xF0 ; zostawić 4 najstarsze bity
  60. iorlw MODE ; ustawienie RS i E
  61. movwf PORTB
  62. swapf LCD_data, W ; snowu ściągamy dane z W
  63. andlw 0xF0 ; teraz 4 najmłodsze
  64. bcf PORTB, RB3 ; stan niski na E
  65. nop
  66. iorlw MODE
  67. movwf PORTB
  68. nop
  69. nop
  70. bcf PORTB, RB3
  71. ENDM
  72.  
  73.  
  74. SEND_CMD MACRO CMD
  75. movlw CMD
  76. movwf LCD_data
  77. LCD_SEND LCD_MODE_CTRL
  78. call DELAY_100us
  79. ENDM
  80.  
  81. PUT_CHAR MACRO CHAR
  82. SEND_CHAR CHAR
  83. call DELAY_
  84. ENDM
  85.  
  86.  
  87. RST CODE 0x000 ; wektor resetu procesora
  88.  
  89. pagesel main ; wybór strony pamięci programu
  90. goto main ; skok do początku programu
  91.  
  92. PGM CODE
  93. main
  94. ; Inicjalizacja niezbędnych komponentów
  95. banksel PORTA ; wybór banku 0
  96. clrf PORTA ; inicjalizacja PORTA przez zerowanie zatrzasków wyjściowych
  97. bsf STATUS, RP0 ; wybór banku 1
  98. bcf OPTION_REG, NOT_RBPU ; włączenie pull-up na PORTB
  99. movlw B'00000110' ; przełączenie wejść na cyfrowe
  100. movwf ADCON1 ; poprzez odłączenie przetwornika A/C
  101. clrf TRISA ; ustawienie wyprowadzeń PORTA na wyjścia
  102.  
  103. movlw B'00000000' ; ekran
  104. movwf TRISB ; poprzez bity trisb
  105.  
  106. bcf STATUS, RP0 ; wybór banku 0
  107.  
  108. call lcd_init
  109.  
  110.  
  111. banksel TRISC
  112. movlw b'10101010'
  113. movwf TRISC
  114.  
  115. START
  116. goto displayportc
  117. goto START
  118.  
  119. ;M A R C
  120. ;I N S U
  121. ;R Y V L
  122. ;E O _ U
  123.  
  124. displayportc
  125. banksel PORTC
  126. ;kolumna A,B,C,D
  127. bcf PORTC, 0
  128. bsf PORTC, 2
  129. bsf PORTC, 4
  130. bsf PORTC, 6
  131. btfsc PORTC, 1 ;INDEX 0,0
  132. goto $+3
  133. movlw 'U'
  134. goto end_check
  135. btfsc PORTC, 3 ;INDEX 0,0
  136. goto $+3
  137. movlw 'L'
  138. goto end_check
  139. btfsc PORTC, 5 ;INDEX 0,0
  140. goto $+3
  141. movlw 'U'
  142. goto end_check
  143. btfsc PORTC, 7 ;INDEX 0,0
  144. goto $+3
  145. movlw 'C'
  146. goto end_check
  147.  
  148. ;kolumna 3,6,9,#
  149. bsf PORTC, 0
  150. bcf PORTC, 2
  151. btfsc PORTC, 1 ;INDEX 0,0
  152. goto $+3
  153. movlw ' '
  154. goto end_check
  155. btfsc PORTC, 3 ;INDEX 0,0
  156. goto $+3
  157. movlw 'V'
  158. goto end_check
  159. btfsc PORTC, 5 ;INDEX 0,0
  160. goto $+3
  161. movlw 'S'
  162. goto end_check
  163. btfsc PORTC, 7 ;INDEX 0,0
  164. goto $+3
  165. movlw 'R'
  166. goto end_check
  167.  
  168. ;kolumna 2,5,8,0
  169. bsf PORTC, 2
  170. bcf PORTC, 4
  171. btfsc PORTC, 1 ;INDEX 0,0
  172. goto $+3
  173. movlw 'O'
  174. goto end_check
  175. btfsc PORTC, 3 ;INDEX 0,0
  176. goto $+3
  177. movlw 'Y'
  178. goto end_check
  179. btfsc PORTC, 5 ;INDEX 0,0
  180. goto $+3
  181. movlw 'N'
  182. goto end_check
  183. btfsc PORTC, 7 ;INDEX 0,0
  184. goto $+3
  185. movlw 'A'
  186. goto end_check
  187.  
  188. ;kolumna 1,4,7,E
  189. bsf PORTC, 4
  190. bcf PORTC, 6
  191. btfsc PORTC, 1 ;INDEX 0,0
  192. goto $+3
  193. movlw 'E'
  194. goto end_check
  195. btfsc PORTC, 3 ;INDEX 0,0
  196. goto $+3
  197. movlw 'R'
  198. goto end_check
  199. btfsc PORTC, 5 ;INDEX 0,0
  200. goto $+3
  201. movlw 'I'
  202. goto end_check
  203. btfsc PORTC, 7 ;INDEX 0,0
  204. goto $+3
  205. movlw 'M'
  206. goto end_check
  207. bsf keyPressed, 0
  208. goto displayportc
  209.  
  210.  
  211. end_check
  212. bcf keyPressed, 0
  213. call printChar
  214. movf PORTC, 0
  215. iorlw b'01010101'
  216. xorlw b'11111111'
  217. btfss STATUS, Z
  218. goto $-4
  219. goto START
  220.  
  221. printChar
  222. banksel PORTB
  223. call send_char
  224. banksel PORTC
  225. return
  226.  
  227. lcd_init ; Inicjalizacja wyświetlacza
  228. call DELAY_20ms
  229.  
  230. ; wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
  231. movlw LCD_FUNCTION_SET | LCD_FS_DATA8 | (1 << RB3)
  232. movwf PORTB
  233. goto $+1 ; odczekaj 4 cykle
  234. goto $+1
  235. bcf PORTB, RB3 ; E = 0
  236. call DELAY_20ms
  237.  
  238. ; ponowne wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
  239. movlw LCD_FUNCTION_SET | LCD_FS_DATA8 | (1 << RB3)
  240. movwf PORTB
  241. goto $+1 ; odczekaj 4 cykle
  242. goto $+1
  243. bcf PORTB, RB3 ; E = 0
  244. call DELAY_100us
  245.  
  246. ; ponowne wysłanie komendy „Function Set” dla 8-bitowego interfejsu;
  247. movlw LCD_FUNCTION_SET | LCD_FS_DATA4 | (1 << RB3)
  248. movwf PORTB
  249. goto $+1 ; odczekaj 4 cykle
  250. goto $+1
  251. bcf PORTB, RB3 ; E = 0
  252. call DELAY_100us
  253.  
  254. SEND_CMD LCD_FUNCTION_SET | LCD_FS_DATA4 | LCD_FS_2LINES | LCD_FS_5x8
  255. SEND_CMD LCD_DISPLAY_ON_OFF
  256. SEND_CMD LCD_DISPLAY_CLEAR
  257. call DELAY_20ms
  258. SEND_CMD LCD_ENTRY_MODE_SET | LCD_EM_INC
  259. SEND_CMD LCD_DISPLAY_ON_OFF | LCD_DC_DSPON
  260.  
  261. return
  262.  
  263. ;procedury
  264. send_char
  265. movwf LCD_data
  266. LCD_SEND LCD_MODE_DATA
  267. call DELAY_100us
  268. return
  269.  
  270. ; Pętle opóźniające, z generatora
  271. DELAY_100us
  272. ;100 cycles
  273. movlw 0x21
  274. movwf d1
  275. Delay_100us
  276. decfsz d1, f
  277. goto Delay_100us
  278. return
  279.  
  280. DELAY_20ms
  281. ;19998 cycles
  282. movlw 0x9F
  283. movwf d1
  284. movlw 0x10
  285. movwf d2
  286. Delay_20ms
  287. decfsz d1, f
  288. goto $+2
  289. decfsz d2, f
  290. goto Delay_20ms
  291. goto $+1 ;2 cycles
  292. return
  293. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement