Advertisement
Guest User

Untitled

a guest
Dec 1st, 2011
398
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. $regfile = "m32def.dat" 'deklaracja procesora
  2. $crystal = 1000000
  3.  
  4. 'konfiguracje-------------------------------------------------------------------
  5. Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.5 , Rs = Porta.4
  6. Config Lcd = 16 * 2
  7.  
  8. Config Scl = Portc.0
  9. Config Sda = Portc.1
  10.  
  11. Config Portd.7 = Output 'dioda
  12. Config Portd.0 = Input 'przycisk menu
  13. Set Portd.0
  14. Config Portd.1 = Input 'przycisk plus
  15. Set Portd.1
  16.  
  17. 'zmienne------------------------------------------------------------------------
  18. Dim M As Byte 'deklaracja zmiennej określającej minuty
  19. Dim S As Byte 'deklaracja zmiennej określającej sekundy
  20. Dim H As Byte 'deklaracja zmiennej określającej godziny
  21. Dim Dzien As Byte
  22. Dim Miesiac As Byte
  23. Dim Rok As Byte 'rok z pcf (od 0 do 3)
  24. Dim Rok_2 As Byte 'ostatnie dwie cyfry - rok z ramu minus rok z pcf
  25. Dim Rok_w As Byte 'rok do bezpośredniego wyświetlania
  26. Dim Dzien_tygodnia As Byte
  27.  
  28. Dim Menu_z As Byte
  29. Menu_z = 0
  30.  
  31. 'procedury----------------------------------------------------------------------
  32. Declare Sub Menu
  33. Declare Sub S_plus
  34. Declare Sub M_plus
  35. Declare Sub H_plus
  36. Declare Sub Rok_plus
  37. Declare Sub Miesiac_plus
  38. Declare Sub Dzien_plus
  39.  
  40. Cursor Off Noblink
  41. Cls
  42.  
  43. '-------------------------------------------------------------------------------
  44. '-------------------------------------------------------------------------------
  45. 'główna pętla
  46.  
  47. Do
  48. Debounce Pind.0 , 0 , Menu , Sub 'oczekiwanie na wciśnięcie przycisku menu
  49.  
  50. 'gdy zmienna menu_z=0 to wyświetl zwykły zegarek z datą, jeśli jest inaczej wyświtl odpowiednie menu
  51. If Menu_z = 0 Then
  52. 'pobranie danych z pcf
  53. I2cstart 'inicjalizacja magistrali I2C
  54. I2cwbyte 162 'podanie adresu PCF8583 dla zapisu
  55. I2cwbyte 2 'wybranie drugiego rejestru
  56. I2cstart 'powtórna inicjalizacja magistrali I2C
  57. I2cwbyte 163 'podanie adresu PCF8583 dla odczytu danych
  58. I2crbyte S , Ack 'odczyt sekund z potwierdzeniem transmisji
  59. I2crbyte M , Ack 'odczyt minut z potwierdzeniem transmisji
  60. I2crbyte H , Ack 'odczyt godzin bez potwierdzania transmisji
  61. I2crbyte Dzien , Ack
  62. I2crbyte Miesiac , Nack
  63. I2cstop 'koniec transmisji I2C
  64.  
  65. S = Makedec(s) 'po odczycie zamieniamy kod bcd na zwykłe liczby
  66. M = Makedec(m)
  67. H = Makedec(h)
  68.  
  69. 'pobranie roku z pamięci ram
  70. I2cstart
  71. I2cwbyte 162
  72. I2cwbyte &H10
  73. I2cstart
  74. I2cwbyte 163
  75. I2crbyte Rok_2 , Nack
  76. I2cstop
  77.  
  78. 'przeliczenie danych z pcf na date dziesiętną
  79. Rok = Dzien
  80. Shift Rok , Right , 6
  81. Rok = Makedec(rok)
  82. Dzien.7 = 0 : Dzien.6 = 0
  83. Dzien = Makedec(dzien)
  84. Dzien_tygodnia = Miesiac
  85. Shift Dzien_tygodnia , Right , 5
  86. Dzien_tygodnia = Makedec(dzien_tygodnia)
  87. Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
  88. Miesiac = Makedec(miesiac)
  89.  
  90. Rok_w = Rok_2 + Rok
  91.  
  92. End If
  93.  
  94. 'wyświetlenie godziny w pierwszej linijce
  95. Locate 1 , 1
  96. If H < 10 Then
  97. Lcd "Godz: 0" ; H ; ":"
  98. Else
  99. Lcd "Godz: " ; H ; ":"
  100. End If
  101.  
  102. Locate 1 , 10
  103. If M < 10 Then
  104. Lcd "0" ; M ; ":"
  105. Else
  106. Lcd M ; ":"
  107. End If
  108.  
  109. Locate 1 , 13
  110. If S < 10 Then
  111. Lcd "0" ; S
  112. Else
  113. Lcd S
  114. End If
  115.  
  116. 'wyświetlenie daty w 2 linijce
  117. Locate 2 , 1
  118. Lcd "Data: "
  119. If Rok_w < 10 Then
  120. Lcd "0" ; Rok_w ;
  121. Else
  122. Lcd Rok_w
  123. End If
  124. If Miesiac < 10 Then
  125. Lcd "-0" ; Miesiac
  126. Else
  127. Lcd "-" ; Miesiac
  128. End If
  129. If Dzien < 10 Then
  130. Lcd "-0" ; Dzien
  131. Else
  132. Lcd "-" ; Dzien
  133. End If
  134.  
  135.  
  136. If S = 0 Then 'dioda migająca co minutę
  137. Portd.7 = 0
  138. Else
  139. Portd.7 = 1
  140. End If
  141.  
  142. 'czesc 1 menu - zmiana godziny
  143. If Menu_z = 1 Then
  144. Debounce Pind.1 , 0 , H_plus , Sub
  145. Locate 2 , 16
  146. Lcd "G"
  147. End If
  148.  
  149. 'czesc 2 menu - zmiana minut
  150. If Menu_z = 2 Then
  151. Debounce Pind.1 , 0 , M_plus , Sub
  152. Locate 2 , 16
  153. Lcd "M"
  154. End If
  155.  
  156. 'czesc 3 menu - zmiana sekund
  157. If Menu_z = 3 Then
  158. Debounce Pind.1 , 0 , S_plus , Sub
  159. Locate 2 , 16
  160. Lcd "S"
  161. End If
  162.  
  163. 'czesc 4 menu - zmiana roku
  164. If Menu_z = 4 Then
  165. Debounce Pind.1 , 0 , Rok_plus , Sub
  166. Locate 2 , 16
  167. Lcd "R"
  168. End If
  169.  
  170. 'czesc 5 menu - zmiana miesiaca
  171. If Menu_z = 5 Then
  172. Debounce Pind.1 , 0 , Miesiac_plus , Sub
  173. Locate 2 , 16
  174. Lcd "M"
  175. End If
  176.  
  177. 'czesc 6 menu - zmiana dnia
  178. If Menu_z = 6 Then
  179. Debounce Pind.1 , 0 , Dzien_plus , Sub
  180. Locate 2 , 16
  181. Lcd "D"
  182. End If
  183.  
  184. Loop
  185. End
  186.  
  187. '-------------------------------------------------------------------------------
  188. 'procedury----------------------------------------------------------------------
  189. '-------------------------------------------------------------------------------
  190.  
  191. 'procedura obslugi zapisu zmiany czasu gdy wychodzisz z menu
  192. Sub Menu
  193. Incr Menu_z
  194. If Menu_z = 7 Then 'jeśli menu_z = 7 to oznacza ze wychodzisz z menu (wtedy dokonujemy zapisu zmienionej godziny)
  195. Menu_z = 0 'zresetowanie zmiennej licznika pozycji menu (wyjscie z menu)
  196.  
  197. S = Makebcd(s) 'konwersja liczb na kod bcd do zapisu
  198. M = Makebcd(m)
  199. H = Makebcd(h)
  200.  
  201. Rok = Rok_w Mod 4 'obliczenie roku do zapisu w pcf
  202. Rok_2 = Rok_w - Rok 'obliczenie roku do zapisu w ram
  203.  
  204. Rok = Makebcd(rok) 'przygotowanie danych do zapisu w pcf
  205. Shift Rok , Left , 6
  206. Dzien = Makebcd(dzien)
  207. Dzien = Rok Or Dzien
  208. Miesiac = Makebcd(miesiac)
  209. Dzien_tygodnia = Miesiac
  210. Shift Dzien_tygodnia , Left , 5
  211. Miesiac = Dzien_tygodnia Or Miesiac
  212.  
  213. 'zapis danych do pamieci
  214. I2cstart 'Uruchomienie I2C
  215. I2cwbyte 162 'Wybór urządzenia do zapisu
  216. I2cwbyte &H02 'Wybór 2 rejestru do zapisu (sekundy)
  217. I2cwbyte S 'Zapisuje sekundy
  218. I2cwbyte M 'Zapisuje minuty
  219. I2cwbyte H 'Zapisuje godziny
  220. I2cwbyte Dzien
  221. I2cwbyte Miesiac
  222. I2cstop
  223. 'zapis rok_2 do wolnej komórki ram
  224. I2cstart 'rozpoczęcie transmisji
  225. I2cwbyte 162 'ustawienie adresu układu
  226. I2cwbyte &H10 'ustawienie adresu komórki (pioerwsza wolna)
  227. I2cwbyte Rok_2 'zapis zmiennej do pamięci
  228. I2cstop 'koniec zapisu
  229.  
  230. Cls
  231. End If
  232. End Sub
  233.  
  234. 'procedury inkrementacji zmiennnych po naciskaniu przycisku plus
  235. Sub H_plus
  236. Incr H
  237. If H = 24 Then H = 0
  238. End Sub
  239.  
  240. Sub M_plus
  241. Incr M
  242. If M = 60 Then M = 0
  243. End Sub
  244.  
  245. Sub S_plus
  246. Incr S
  247. If S = 60 Then S = 0
  248. End Sub
  249.  
  250. Sub Rok_plus
  251. Incr Rok_w
  252. If Rok_w = 100 Then Rok_w = 0
  253. End Sub
  254.  
  255. Sub Miesiac_plus
  256. Incr Miesiac
  257. If Miesiac = 13 Then Miesiac = 1
  258. End Sub
  259.  
  260. Sub Dzien_plus
  261. Incr Dzien
  262. If Dzien = 32 Then Dzien = 1
  263. End Sub
  264.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement