Advertisement
Guest User

Lab6_zad3

a guest
Apr 1st, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.51 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. UDATA
  6. f1 RES 1 ; deklaracja zmiennych potrzebnych
  7. f2 RES 1
  8. f3 RES 1
  9. f4 RES 1
  10. f5 RES 1
  11. f6 RES 1
  12. l1 RES 1
  13. licznik1 RES 1
  14. licznik2 RES 1
  15. licznik3 RES 1
  16. licznik4 RES 1
  17. zegar RES 1
  18. max_zegar RES 1
  19. migacz RES 1 ; zmienna sterująca miganiem
  20. migacz_zm RES 1 ; zmienna do zmiany częstotliwości migania
  21. wartosc RES 1 ; zmienna 20/10
  22. temp RES 1 ; zmienna tymczasowa do przechowywania wartości max_zegar, gdy pozostanie 20 sekund do końca
  23.  
  24. RST CODE 0x000 ; wektor resetu procesora
  25.  
  26. pagesel main ; wybór strony pamięci programu
  27. goto main ; skok do początku programu
  28.  
  29. PGM CODE
  30. main
  31. ; Inicjalizacja niezbędnych komponentów
  32. bcf STATUS, RP0 ; wybór banku 0
  33. bcf STATUS, RP1
  34.  
  35. clrf PORTA ; inicjalizacja PORTA przez zerowanie zatrzasków wyjściowych
  36.  
  37. bsf STATUS, RP0
  38.  
  39. movlw B'00000110' ; przełączenie wejść na cyfrowe
  40. movwf ADCON1 ; poprzez odłączenie przetwornika A/C
  41. clrf TRISA ; ustawienie wyprowadzeń PORTA na wyjścia
  42. clrf TRISB ; ustawienie wyprowadzeń PORTB na wyjścia
  43.  
  44. bcf STATUS, RP0
  45.  
  46. ; Rozwiązanie zadania
  47. clrf TRISB
  48. clrf migacz
  49. clrf migacz_zm
  50. movlw b'11110110' ; wartość maksymalnego zegara dla pierwszych 40 sekund odliczania
  51. movwf max_zegar
  52. movlw b'00000010' ; wartość maksymalnego zegara dla kolejnych 10 sekund odliczania
  53. movwf temp
  54. movlw d'62' ; zmienna określająca
  55. movwf wartosc ; częstotliwość migania godziny na wyświetlaczu
  56. call reset_zegar
  57. call init
  58. call standard
  59.  
  60. reset_zegar
  61. movlw 0
  62. movwf zegar
  63. return
  64.  
  65. init
  66. movlw 0
  67. movwf licznik1
  68. movlw 0
  69. movwf licznik2
  70. movlw 5
  71. movwf licznik3
  72. movlw 5
  73. movwf licznik4
  74. return
  75.  
  76. decrement1
  77. movlw 0Ah
  78. movwf licznik2
  79. movlw 0
  80. subwf licznik1, 0
  81. btfsc STATUS, Z
  82. call stop
  83. decf licznik1
  84. return
  85.  
  86. decrement2
  87. movlw 6
  88. movwf licznik3
  89. movlw 0
  90. subwf licznik2, 0
  91. btfsc STATUS, Z
  92. call decrement1
  93. decf licznik2
  94. return
  95.  
  96. decrement3
  97. movlw 0Ah
  98. movwf licznik4
  99. movlw 0
  100. subwf licznik3, 0
  101. btfsc STATUS, Z
  102. call decrement2
  103. decf licznik3
  104. return
  105.  
  106. decrement4
  107. movlw 0
  108. subwf licznik4, 0
  109. btfsc STATUS, Z
  110. call decrement3
  111. decf licznik4
  112. clrf zegar
  113. incf migacz_zm
  114. return
  115.  
  116. stop
  117. movlw b'11111111'
  118. movwf PORTB ; wysłanie na port PORTB
  119. movlw B'00001111' ; włączenie wyświetlacza DS1
  120. movwf PORTA
  121. goto stop
  122.  
  123. ; ############# STANDARD #############
  124.  
  125. standard
  126. call wypisz_standard ; procedura wyświetlająca godzinę
  127. call opoznienie_standard ; procedura wyliczająca okres 1 sekundy
  128. movlw d'35' ; przez 40 cykli ma nie być migania
  129. subwf migacz_zm, 0
  130. btfsc STATUS, Z
  131. call _20s ; jeśli 40 sekund minęło, uruchom procedurę wypisującą godzinę z miganiem
  132. goto standard
  133.  
  134. wypisz_standard
  135. movf licznik1, W ; załaduj wartość
  136. call convert ; wywołaj procedurę konwersji
  137. movwf PORTB ; wysłanie na port PORTB
  138. movlw B'00000001' ; włączenie wyświetlacza DS1
  139. movwf PORTA
  140. call w998us
  141.  
  142. movf licznik2, W ; załaduj wartość
  143. call convert_kropka ; wywołaj procedurę konwersji
  144. movwf PORTB ; wysłanie na port PORTB
  145. movlw B'00000010' ; włączenie wyświetlacza DS2
  146. movwf PORTA
  147. call w998us
  148.  
  149. movf licznik3, W ; załaduj wartość
  150. call convert ; wywołaj procedurę konwersji
  151. movwf PORTB ; wysłanie na port PORTB
  152. movlw B'00000100' ; włączenie wyświetlacza DS3
  153. movwf PORTA
  154. call w998us
  155.  
  156. movf licznik4, W ; załaduj wartość
  157. call convert ; wywołaj procedurę konwersji
  158. movwf PORTB ; wysłanie na port PORTB
  159. movlw B'00001000' ; włączenie wyświetlacza DS4
  160. movwf PORTA
  161. call w998us
  162.  
  163. return
  164.  
  165. opoznienie_standard
  166. incf zegar
  167. movf max_zegar, 0
  168. subwf zegar, 0
  169. btfsc STATUS, Z
  170. call decrement4
  171. return
  172.  
  173. ; ############# 20s / 10s #############
  174.  
  175. change ; procedura do zmiany
  176. movlw d'38' ; częstotliwości migania
  177. movwf wartosc ; gdy zostało 10 sekund do końca
  178. movlw b'00000011' ; wartość maksymalnego zegara
  179. movwf temp ; dla ostatnich 10 sekund odliczania
  180. return
  181.  
  182. _20s
  183. movf temp, 0 ; wpisz wartość maskymalnego zegara dla przedostatnich 10 sekund (40-50) odliczania
  184. movwf max_zegar
  185. movf wartosc, 0 ; wstaw częstotliwość migania
  186. movwf migacz ; do odpowiedniej zmiennej
  187. call wypisz_20s ; wyświetl godzinę
  188. movf wartosc, 0 ; ponownie wstaw częstotliwość migania
  189. movwf migacz
  190. call czysc_20s ; wyświetlaj puste segmenty (dzięki nim następuje miganie)
  191. call opoznienie_20s ; wywołaj opóźnienie
  192. movlw d'45'
  193. subwf migacz_zm, 0 ; gdy zmienna osiągnie wartość 50
  194. btfsc STATUS, Z
  195. call change ; oznacza to, że trzeba zmienić częstotliwość migania
  196. goto _20s
  197.  
  198. wypisz_20s
  199. movf licznik1, W ; załaduj wartość
  200. call convert ; wywołaj procedurę konwersji
  201. movwf PORTB ; wysłanie na port PORTB
  202. movlw B'00000001' ; włączenie wyświetlacza DS1
  203. movwf PORTA
  204. call w998us
  205.  
  206. movf licznik2, W ; załaduj wartość
  207. call convert_kropka ; wywołaj procedurę konwersji
  208. movwf PORTB ; wysłanie na port PORTB
  209. movlw B'00000010' ; włączenie wyświetlacza DS2
  210. movwf PORTA
  211. call w998us
  212.  
  213. movf licznik3, W ; załaduj wartość
  214. call convert ; wywołaj procedurę konwersji
  215. movwf PORTB ; wysłanie na port PORTB
  216. movlw B'00000100' ; włączenie wyświetlacza DS3
  217. movwf PORTA
  218. call w998us
  219.  
  220. movf licznik4, W ; załaduj wartość
  221. call convert ; wywołaj procedurę konwersji
  222. movwf PORTB ; wysłanie na port PORTB
  223. movlw B'00001000' ; włączenie wyświetlacza DS4
  224. movwf PORTA
  225. call w998us
  226.  
  227. decfsz migacz, 1 ; zmiejszaj wartość zmiennej
  228. goto wypisz_20s ; aby wiedzieć, przez jaki czas trzeba wyświetlać godzinę
  229.  
  230. return
  231.  
  232. czysc_20s
  233. clrf PORTB ; wyświetlenie pustego segmentu
  234. movlw B'00000001'
  235. movwf PORTA
  236. call w998us
  237.  
  238. clrf PORTB ; wyświetlenie pustego segmentu
  239. movlw B'00000010'
  240. movwf PORTA
  241. call w998us
  242.  
  243. clrf PORTB ; wyświetlenie pustego segmentu
  244. movlw B'00000100'
  245. movwf PORTA
  246. call w998us
  247.  
  248. clrf PORTB ; wyświetlenie pustego segmentu
  249. movlw B'00001000'
  250. movwf PORTA
  251. call w998us
  252.  
  253. decfsz migacz, 1 ; zmiejszaj wartość zmiennej
  254. goto czysc_20s ; aby wiedzieć, przez jaki czas trzeba wyświetlać puste segmenty
  255.  
  256. return
  257.  
  258. opoznienie_20s
  259. incf zegar
  260. movf max_zegar, 0
  261. subwf zegar, 0
  262. btfsc STATUS, Z
  263. call decrement4
  264. return
  265.  
  266. convert_kropka
  267. addwf PCL, f
  268. dt B'10111111' ; 0 z kropka
  269. dt B'10000110' ; 1 z kropka
  270. dt B'11011011' ; 2 z kropka
  271. dt B'11001111' ; 3 z kropka
  272. dt B'11100110' ; 4 z kropka
  273. dt B'11101101' ; 5 z kropka
  274. dt B'11111101' ; 6 z kropka
  275. dt B'10000111' ; 7 z kropka
  276. dt B'11111111' ; 8 z kropka
  277. dt B'11101111' ; 9 z kropka
  278. return
  279.  
  280. convert
  281. addwf PCL, f
  282. dt B'00111111' ; 0
  283. dt B'00000110' ; 1
  284. dt B'01011011' ; 2
  285. dt B'01001111' ; 3
  286. dt B'01100110' ; 4
  287. dt B'01101101' ; 5
  288. dt B'01111101' ; 6
  289. dt B'00000111' ; 7
  290. dt B'01111111' ; 8
  291. dt B'01101111' ; 9
  292. return
  293.  
  294. w8us ; funkcja wykonujaca sie 10 us
  295. goto $+1 ; 2 cykle .. razem 2 cykle
  296. goto $+1 ; 2 cykle .. razem 4 cykle
  297. goto $+1 ; 2 cykle .. razem 6 cykli
  298. return ; 2 cykle .. razem 8 cykli
  299.  
  300. w48us ; funkcja wykonujaca sie 50 us
  301. call w8us ; 10 cykli razem 10
  302. call w8us ; 10 cykli razem 20
  303. call w8us ; 10 cykli razem 30
  304. call w8us ; 10 cykli razem 40
  305. goto $+1 ; 2 cykle razem 42
  306. goto $+1 ; 2 cykle razem 44
  307. goto $+1 ; 2 cykle razem 46
  308. return ; 2 cykle razem 48
  309.  
  310. w98us ; funkcja wykonujaca sie 100 us
  311. call w48us ; 50 cykli razem 50
  312. movlw d'3' ; podstawienie do akumulatora 3, 1 cykl razem 51
  313. movwf f1 ; podstawienie 3 pod f1, 1 cykl razem 52
  314. petla1
  315. call w8us ; 3x10cykli razem 82 cykli
  316. decfsz f1,1 ; 2x1 razem 84 i skos razem 86
  317. goto petla1 ; 2x2 razem 90
  318. goto $+1 ; 2 cykle razem 92
  319. goto $+1 ; 2 cykle razem 94
  320. goto $+1 ; 2 cykle razem 96
  321. return ; 2 cykle razem 98
  322.  
  323. w998us ; funkcja wykonujaca sie 1000 us = 1ms
  324. movlw d'9' ; podstawienie do akumulatora 9, 1 cykl, razem 1
  325. movwf f2 ; podstawienie 9 pod f1, 1 cykl razem 2
  326. petla2
  327. call w98us ; 9x100 cykli, razem 902 cykle
  328. decfsz f2,1 ; 8x1 cykli,i plus 2 razem 912 cykli
  329. goto petla2 ; 8x2 cykli, razem 928 cykli
  330. call w48us ; 50 cykli, razem 978 cykli
  331. call w8us ; 10 cykli, razem 988 cykli
  332. goto $+1 ; 2 cykle razem 990 cykli
  333. goto $+1 ; 2 cykle razem 992 cykli
  334. goto $+1 ; 2 cykle razem 994 cykli
  335. goto $+1 ; 2 cykle razem 996 cykli
  336. return ; 2 cykle, razem 998
  337.  
  338. END ; dyrektywa END kończy treść programu
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement