Advertisement
Guest User

Untitled

a guest
Nov 21st, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.41 KB | None | 0 0
  1. /*
  2. * lab1.asm
  3. *
  4. * This is a driver for the 12-digit keyboard used in "Laboration 1".
  5. * The purpose of this program is:
  6. * - To read what button is pressed on the keyboard.
  7. * - To display a corresponding binary value for that key on
  8. * a simple LED-display.
  9. *
  10. * Authors: Dennis Wildmark, Kalle Kellokoski Adamsson
  11. *
  12. * Date: 2014-11-11
  13. */
  14.  
  15. ;==============================================================================
  16. ; Definitions of registers, etc. ("constants")
  17. ;==============================================================================
  18. .EQU RESET = 0x0000 ; initializes constants and pointers
  19. .EQU PM_START = 0x0056
  20. .DEF TEMP = R16
  21. .DEF RVAL = R24
  22. .EQU NO_KEY = 0x0F
  23. ;==============================================================================
  24. ; Start of program
  25. ;==============================================================================
  26. .CSEG ;code segment starts here
  27. .ORG RESET
  28. RJMP init
  29.  
  30. .ORG PM_START
  31. .INCLUDE "delay.inc"
  32. .INCLUDE "lcd.inc"
  33. ;==============================================================================
  34. ; Basic initializations of stack pointer, I/O pins, etc.
  35. ;==============================================================================
  36. init:
  37. ; Set stack pointer to point at the end of RAM.
  38. LDI TEMP, LOW(RAMEND)
  39. OUT SPL, TEMP
  40. LDI TEMP, HIGH(RAMEND)
  41. OUT SPH, TEMP
  42. ; Initialize pins
  43. CALL init_pins
  44. CALL lcd_init
  45. ; Initialize position for pressed key digit
  46. LDI RVAL, 0xC0
  47. RCALL lcd_write_instr
  48. ; Jump to main part of program
  49. RJMP main
  50.  
  51. ;==============================================================================
  52. ; Initialize I/O pins
  53. ;==============================================================================
  54. init_pins:
  55. LDI TEMP, 0xF0 ;initializes outputs PF4-7 and PB4-7
  56. OUT DDRF, TEMP
  57. OUT DDRB, TEMP
  58. LDI TEMP, 0xBF
  59. OUT DDRE, TEMP ;initializes input PE6
  60. LDI TEMP, 0xC0
  61. OUT DDRD, TEMP ;initializes outputs PD
  62. RET
  63. ;==============================================================================
  64. ; Read the keyboard and stuff
  65. ;==============================================================================
  66. read_keyboard:
  67. LDI RVAL, 150
  68. RCALL delay_micros
  69. LDI R18, 0 ; reset counter
  70. scan_key:
  71. MOV R19, R18
  72. LSL R19 ; moves bits in R19 4 steps to the left.
  73. LSL R19
  74. LSL R19
  75. LSL R19
  76. OUT PORTB, R19 ; set column and row
  77. NOP ; a minimum of 20 NOP's is necessary to prevent propagation delay in multiplexer to interfere.
  78. NOP
  79. NOP
  80. NOP
  81. NOP
  82. NOP
  83. NOP
  84. NOP
  85. NOP
  86. NOP
  87. NOP
  88. NOP
  89. NOP
  90. NOP
  91. NOP
  92. NOP
  93. NOP
  94. NOP
  95. NOP
  96. NOP
  97. SBIC PINE, 6 ; skips next instruction if PE6 is 0 (=not that key)
  98. RJMP return_key_val
  99. INC R18 ; increments R18
  100. CPI R18, 12 ; compares R18 to 12
  101. BRNE scan_key ; if R18 was not equal to 12, call scan_key again, else
  102. LDI R18, NO_KEY ; no key was pressed!
  103. return_key_val:
  104. MOV RVAL, R18 ; data in R18 is copied to RVAL
  105. RET
  106. ;==============================================================================
  107. ; Subroutines for the exeptions
  108. ;==============================================================================
  109. char_a:
  110. LDI RVAL, 65
  111. RET
  112. char_b:
  113. LDI RVAL, 66
  114. RET
  115. ;==============================================================================
  116. ; Convert keyboard output to ASCII-value
  117. ;==============================================================================
  118. convert:
  119. LDI R18, 48
  120. ADD RVAL, R18 ;ˆka RVAL med 48, vilket motsvarar v‰rdet i ASCII-tabellen
  121. CPI RVAL, 58 ;om v‰rdet ‰r 58 (som ska vara
  122. BREQ char_a
  123. CPI RVAL, 59
  124. BREQ char_b
  125. RET
  126. ;==============================================================================
  127. ; Main part of program
  128. ;==============================================================================
  129.  
  130. main:
  131. LDI R24, 0xC0
  132. RCALL lcd_write_instr ;s‰tter markˆren i nedre v‰nstra hˆrnet
  133.  
  134. loop:
  135. RCALL read_keyboard ;l‰ser av keyboardet
  136. CPI RVAL, NO_KEY ;om ingen knapp trycks,
  137. BREQ loop ;hoppa tillbaka till loop
  138. MOV TEMP, RVAL ;kopiera RVAL till TEMP fˆr att j‰mfˆras senare
  139. RCALL convert ;talet konverteras
  140. RCALL lcd_write_chr ;det motsvarande ASCII-talet skrivs till displayen
  141. RCALL delay_keypressed ;stannar h‰r om samma knapp ‰r intryckt
  142. RJMP loop
  143.  
  144. delay_keypressed:
  145. RCALL read_keyboard ;tar reda p vilken knapp som ‰r intryckt
  146. CP TEMP, RVAL ;j‰mfˆr med fˆrra knappen som var intryckt
  147. BREQ delay_keypressed ;‰r det samma knapp, loopa
  148. RET
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement