Advertisement
Guest User

ARM LCD 16x2

a guest
Nov 4th, 2019
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. RS = $E ; 14
  2. EN = $F ; 15
  3. DATA4 = $1A ; 26
  4. DATA5 = $13 ; 19
  5. DATA6 = $D ; 13
  6. DATA7 = $6 ; 6
  7.  
  8. b start
  9.  
  10. init_display:
  11. push {r11, lr}
  12. add r11, sp, #0 ; Initialize Frame Pointer
  13. sub sp, sp, #16 ; Initialize local stack
  14.  
  15. mov r0, RS
  16. bl set_gpio_to_output
  17. mov r0, EN
  18. bl set_gpio_to_output
  19. mov r0, DATA4
  20. bl set_gpio_to_output
  21. mov r0, DATA5
  22. bl set_gpio_to_output
  23. mov r0, DATA6
  24. bl set_gpio_to_output
  25. mov r0, DATA7
  26. bl set_gpio_to_output
  27.  
  28. mov r0, #0x33
  29. mov r1, #0
  30. bl write8
  31.  
  32. mov r0, #0x32
  33. mov r1, #0
  34. bl write8
  35.  
  36. mov r0, #0x06
  37. mov r1, #0
  38. bl write8
  39.  
  40. mov r0, #0x0C
  41. mov r1, #0
  42. bl write8
  43.  
  44. mov r0, #0x28
  45. mov r1, #0
  46. bl write8
  47.  
  48. mov r0, #1
  49. mov r1, #0
  50. bl write8
  51.  
  52. bl long_delay
  53.  
  54. mov r0, #0x4E
  55. mov r1, #1
  56. bl write8
  57.  
  58.  
  59. sub sp, r11, #0
  60. pop {r11, pc}
  61.  
  62.  
  63.  
  64. pulse_enable:
  65. push {lr}
  66. mov r0, EN
  67. bl turn_gpio_off
  68. bl delay
  69. mov r0, EN
  70. bl turn_gpio_on
  71. bl delay
  72. mov r0, EN
  73. bl turn_gpio_off
  74. pop {pc}
  75.  
  76. write8:
  77. ; r0: value between 0 and 255 to be written
  78. ; r1: 0 if command else data
  79. push {r11, lr}
  80. add r11, sp, #0 ; Initialize Frame Pointer
  81. sub sp, sp, #16 ; Initialize local stack
  82.  
  83. str r0, [r11, #-4]
  84. str r1, [r11, #-8]
  85.  
  86. bl long_delay
  87.  
  88. ; START RS
  89. ; Write the value of the rs based on the passed value in r1
  90.  
  91. ldr r5, [r11, #-8]
  92. cmp r5, #0
  93. beq write8_rs_command
  94.  
  95. write8_rs_data:
  96. mov r0, RS
  97. bl turn_gpio_on
  98. b write8_rs_done
  99.  
  100. write8_rs_command:
  101. mov r0, RS
  102. bl turn_gpio_off
  103. b write8_rs_done
  104.  
  105. write8_rs_done:
  106.  
  107. ; END RS
  108.  
  109. ; START Write Upper 4 bits
  110.  
  111. ldr r5, [r11, #-4]
  112.  
  113. lsr r1, r5, #4
  114. mov r0, DATA4
  115. bl set_pin_if_lsb_is_set
  116.  
  117. lsr r1, r5, #5
  118. mov r0, DATA5
  119. bl set_pin_if_lsb_is_set
  120.  
  121. lsr r1, r5, #6
  122. mov r0, DATA6
  123. bl set_pin_if_lsb_is_set
  124.  
  125. lsr r1, r5, #7
  126. mov r0, DATA7
  127. bl set_pin_if_lsb_is_set
  128.  
  129. ; END Write Upper 4 bits
  130. bl pulse_enable
  131.  
  132. ; START Write Lower 4 bits
  133. ldr r5, [r11, #-4]
  134.  
  135. mov r1, r5
  136. mov r0, DATA4
  137. bl set_pin_if_lsb_is_set
  138.  
  139. lsr r1, r5, #1
  140. mov r0, DATA5
  141. bl set_pin_if_lsb_is_set
  142.  
  143. lsr r1, r5, #2
  144. mov r0, DATA6
  145. bl set_pin_if_lsb_is_set
  146.  
  147. lsr r1, r5, #3
  148. mov r0, DATA7
  149. bl set_pin_if_lsb_is_set
  150. ; END Write Lower 4 bits
  151.  
  152. bl pulse_enable
  153.  
  154. sub sp, r11, #0
  155. pop {r11, pc}
  156.  
  157. set_pin_if_lsb_is_set:
  158. ; r0 = pin to set
  159. ; r1 = value to check
  160. push {lr}
  161.  
  162. and r1, r1, #1
  163. cmp r1, #0
  164. beq lsb_off
  165.  
  166. lsb_on:
  167. bl turn_gpio_on
  168. b lsb_done
  169.  
  170. lsb_off:
  171. bl turn_gpio_off
  172. b lsb_done
  173.  
  174. lsb_done:
  175.  
  176. pop {pc}
  177.  
  178. delay:
  179. push {lr}
  180. mov r0, #1
  181. bl sleep
  182. pop {pc}
  183.  
  184. long_delay:
  185. push {lr}
  186. mov r0, #3
  187. bl sleep
  188. pop {pc}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement