Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. ; 1DT301
  2. ; Lab 5, Initialize display JHD202A.
  3. ;
  4. ; Date: 2017-10-11
  5. ; Author, Christian Fagerholm, Amelie Löwe
  6.  
  7. ; Modified: prints a random number between 1-75 when pushing a button.
  8. ;
  9. ; Function
  10. ; --------
  11. ; Initialize display JHD202 connected to PORTE
  12. ;
  13. ; (run @ 1.8432 MHz clk frequency)
  14. ;
  15.  
  16. .include "m2560def.inc"
  17. .def Temp = r16
  18. .def Data = r17
  19. .def RS = r18
  20. .def ButtonReg = r20
  21. .def LowCounter = r19
  22. .def HighCounter = r21
  23. .def Counter = r22
  24. .equ MaxCounter = 75
  25. .equ BITMODE4 = 0b00000010 ; 4-bit operation
  26. .equ CLEAR = 0b00000001 ; Clear display
  27. .equ DISPCTRL = 0b00001111 ; Display on, cursor on, blink on.
  28.  
  29. .cseg
  30. .org 0x0000 ; Reset vector
  31. jmp reset
  32. .org 0x0002
  33. jmp interrupt1
  34.  
  35. .org 0x0072
  36.  
  37. reset:
  38. ldi Temp, 0b0000_0001
  39. sts EICRA, Temp
  40. ldi Temp, 0b0000_0001
  41. out EIMSK, Temp
  42.  
  43. ldi Temp, HIGH(RAMEND) ; Temp = high byte of ramend address
  44. out SPH, Temp ; sph = Temp
  45. ldi Temp, LOW(RAMEND) ; Temp = low byte of ramend address
  46. out SPL, Temp ; spl = Temp
  47.  
  48. ser Temp ; r16 = 0b11111111
  49. out DDRE, Temp ; port E = outputs ( Display JHD202A)
  50. clr Temp ; r16 = 0
  51. out PORTE, Temp
  52.  
  53. ldi Temp, 0x00
  54. out DDRD, Temp
  55. sei
  56.  
  57.  
  58. ; **
  59. ; ** init_display
  60. ; **
  61. init_disp:
  62. rcall power_up_wait ; wait for display to power up
  63.  
  64. ldi Data, BITMODE4 ; 4-bit operation
  65. rcall write_nibble ; (in 8-bit mode)
  66. rcall short_wait ; wait min. 39 us
  67. ldi Data, DISPCTRL ; disp. on, blink on, curs. On
  68. rcall write_cmd ; send command
  69. rcall short_wait ; wait min. 39 us
  70.  
  71.  
  72. loop: nop
  73. rjmp loop ; loop forever
  74.  
  75.  
  76. clr_disp:
  77. ldi Data, CLEAR ; clr display
  78. rcall write_cmd ; send command
  79. rcall long_wait ; wait min. 1.53 ms
  80. ret
  81.  
  82. ; **
  83. ; ** write char/command
  84. ; **
  85.  
  86. write_char:
  87. ldi RS, 0b00100000 ; RS = high
  88. rjmp write
  89. write_cmd:
  90. clr RS ; RS = low
  91. write:
  92. mov Temp, Data ; copy Data
  93. andi Data, 0b11110000 ; mask out high nibble
  94. swap Data ; swap nibbles
  95. or Data, RS ; add register select
  96. rcall write_nibble ; send high nibble
  97. mov Data, Temp ; restore Data
  98. andi Data, 0b00001111 ; mask out low nibble
  99. or Data, RS ; add register select
  100.  
  101. write_nibble:
  102. rcall switch_output ; Modify for display JHD202A, port E
  103. nop ; wait 542nS
  104. sbi PORTE, 5 ; enable high, JHD202A
  105. nop
  106. nop ; wait 542nS
  107. cbi PORTE, 5 ; enable low, JHD202A
  108. nop
  109. nop ; wait 542nS
  110. ret
  111.  
  112. ; **
  113. ; ** busy_wait loop
  114. ; **
  115. short_wait:
  116. clr zh ; approx 50 us
  117. ldi zl, 30
  118. rjmp wait_loop
  119. long_wait:
  120. ldi zh, HIGH(1000) ; approx 2 ms
  121. ldi zl, LOW(1000)
  122. rjmp wait_loop
  123. dbnc_wait:
  124. ldi zh, HIGH(4600) ; approx 10 ms
  125. ldi zl, LOW(4600)
  126. rjmp wait_loop
  127. power_up_wait:
  128. ldi zh, HIGH(9000) ; approx 20 ms
  129. ldi zl, LOW(9000)
  130.  
  131. wait_loop:
  132. sbiw z, 1 ; 2 cycles
  133. brne wait_loop ; 2 cycles
  134. ret
  135.  
  136. ; **
  137. ; ** modify output signal to fit LCD JHD202A, connected to port E
  138. ; **
  139.  
  140. switch_output:
  141. push Temp
  142. clr Temp
  143. sbrc Data, 0 ; D4 = 1?
  144. ori Temp, 0b00000100 ; Set pin 2
  145. sbrc Data, 1 ; D5 = 1?
  146. ori Temp, 0b00001000 ; Set pin 3
  147. sbrc Data, 2 ; D6 = 1?
  148. ori Temp, 0b00000001 ; Set pin 0
  149. sbrc Data, 3 ; D7 = 1?
  150. ori Temp, 0b00000010 ; Set pin 1
  151. sbrc Data, 4 ; E = 1?
  152. ori Temp, 0b00100000 ; Set pin 5
  153. sbrc Data, 5 ; RS = 1?
  154. ori Temp, 0b10000000 ; Set pin 7 (wrong in previous version)
  155. out porte, Temp
  156. pop Temp
  157. ret
  158.  
  159. interrupt1:
  160. cpi Counter, MaxCounter
  161. breq resetcounters
  162. in ButtonReg, PIND
  163. inc Counter
  164. inc LowCounter
  165. cpi LowCounter, 10
  166. breq resetLow
  167. cpi ButtonReg, 0xFE
  168.  
  169. brne buttonreleased
  170.  
  171. rjmp interrupt1
  172.  
  173. resetcounters:
  174. ldi HighCounter, 0
  175. ldi LowCounter, 1
  176. ldi Counter, 0
  177. rjmp interrupt1
  178.  
  179. resetLow:
  180. ldi LowCounter, 0
  181. inc HighCounter
  182.  
  183. rjmp interrupt1
  184.  
  185. buttonreleased:
  186. rcall clr_disp
  187. rcall short_wait
  188.  
  189. mov Data, HighCounter
  190. ldi Temp, 0b00110000
  191. add Data, Temp
  192. rcall write_char
  193. clr Data
  194. mov Data, LowCounter
  195. ldi Temp, 0b00110000
  196. add Data, Temp
  197. rcall write_char
  198.  
  199.  
  200.  
  201. reti
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement