Как ввести два раза в ATmega32 с помощью клавиатуры - PullRequest
0 голосов
/ 13 июня 2019

Я хочу ввести 2 цифры в ATmega32 с клавиатуры.
По моему коду профессора. Этот проект довольно сложен для меня, я не до конца понимаю код.

Вопрос:
С помощью кнопок введите два шестнадцатеричных числа и сохраните их в R20, затем с помощью 7-сегментных светодиодов отобразите числа 1 с и 0 с.

Это не полный код вопроса:
только для клавиатуры, это часть, которую я застрял.

Проблема состоит в том, чтобы ввести два числа, так как код работает только для одного ввода. Если я нажму второй раз, предыдущий номер будет удален.

Как я могу решить эту проблему?

.include "m32def.inc"

.EQU KEY_PORT = PORTA
.EQU KEY_PIN = PINA
.EQU KEY_DDR = DDRA 

          LDI R20,HIGH(RAMEND)
          OUT SPH, R20
          LDI R20, LOW(RAMEND)
          OUT SPL, R20
          LDI R21, 0xFF
          OUT DDRC, R21
          LDI R20, 0xF0
          OUT KEY_DDR,R20

GROUND_ALL_ROWS:
               LDI R20,0x0F
           OUT KEY_PORT, R20

WAIT_FOR_RELEASE:
               NOP
           IN R21, KEY_PIN
           ANDI R21, 0x0F
           CPI R21, 0x0F
           BRNE WAIT_FOR_RELEASE

WAIT_FOR_KEY:
               NOP
           IN R21, KEY_PIN
           ANDI R21, 0x0F
           CPI R21, 0x0F
           BREQ WAIT_FOR_KEY
           CALL WAIT15MS
           IN R21,KEY_PIN
           ANDI R21, 0x0F
           CPI R21, 0x0F
           BREQ WAIT_FOR_KEY
           LDI R21, 0b01111111
           OUT KEY_PORT, R21
           NOP
           IN R21, KEY_PIN
           ANDI R21,0x0F
           CPI R21, 0x0F
           BRNE COL1
           LDI R21, 0b10111111
           OUT KEY_PORT, R21
           NOP
           IN R21, KEY_PIN
           ANDI R21, 0x0F
           CPI R21,0x0F
           BRNE COL2
           LDI R21,0b11011111
           OUT KEY_PORT, R21
           NOP
           IN R21, KEY_PIN
           ANDI R21, 0x0F
           CPI R21, 0x0F
           BRNE COL3
           LDI R21,0b11101111
           OUT KEY_PORT, R21
           NOP
           IN R21, KEY_PIN
           ANDI R21, 0x0F
           CPI R21, 0x0F
           BRNE COL4

COL1:
              LDI R30,LOW( KCODE0<<1)
          LDI R31, HIGH( KCODE0<<1)
          RJMP FIND
COL2:
              LDI R30,LOW( KCODE1<<1)
          LDI R31, HIGH( KCODE1<<1)
          RJMP FIND        
COL3:
              LDI R30,LOW( KCODE2<<1)
          LDI R31, HIGH( KCODE2<<1)
          RJMP FIND         
 COL4:
              LDI R30,LOW( KCODE3<<1)
          LDI R31, HIGH( KCODE3<<1)
          RJMP FIND                        
MATCH:
              LPM R20,Z
          OUT PORTC,R20
          RJMP GROUND_ALL_ROWS
FIND:
              LSR R21
          BRCC MATCH
          LPM R20,Z+
          RJMP FIND

WAIT15MS:
              LDI R16,64
DELAY1: LDI R17,200
DELAY2: LDI R18,19
DELAY3: NOP
          DEC R18
          BRNE DELAY3
          DEC   R17
          BRNE DELAY2
          DEC R16
          BRNE DELAY1
          RET

.ORG 0x300

KCODE0: .DB '0','4','8','C'
KCODE1: .DB '1','5','9','D'
KCODE2: .DB '2','6','A','E'
KCODE3: .DB '3','7','B','F'

Этот код предназначен для поиска матрицы на клавиатуре, но я использую proteus для имитации кода:

Simulate ATmega32

...