@.CHARSET CP1251

@ GNU AS
.syntax unified
.cpu cortex-m4
.thumb
.fpu fpv4-sp-d16

.SECTION .bss
.align(1)
KEY_READER_TEST_Old: .space 1     @ прочитанное значение нажатых кнопок
KEY_READER_TEST_CNT: .space 4     @ счетчик нажатий\повторов

.SECTION .asmcode

@.DESC nane=KEY_READER_TEST_INIT type=proc
@ +---------------------------------------------------------------+
@ |          Инициализация счетчика нажатий кнопок модуля         |
@ +---------------------------------------------------------------+
@ | Регистры не изменяются, вызывать перед основным вызовом       |
@ +---------------------------------------------------------------+
@.ENDDESC

.global KEY_READER_TEST_INIT
KEY_READER_TEST_INIT:
                    PUSH       { R0, R1 }

                    MOV        R1, 0
                    LDR        R0, = KEY_READER_TEST_CNT
                    STR        R1, [ R0 ]

                    PUSH       { R0, R1 }
                    BX         LR

@.DESC nane=KEY_READER_TEST type=proc
@ +---------------------------------------------------------------+
@ |              Основной вызов модуля теста кнопок               |
@ +---------------------------------------------------------------+
@ | Модуль осуществляет вывод текста в буфер экрана, до вызова    |
@ | модуля экран нужно очистить, после - отправить буфер на экран |
@ | Регистры после вызова не изменяются                           |
@ +---------------------------------------------------------------+
@.ENDDESC

.global KEY_READER_TEST
 KEY_READER_TEST:
                    PUSH       { R0 - R7, LR }
                    LDR        R6, = KEY_READER_TEST_Old
                    LDRB       R6, [ R6 ]
                    LDR        R7, = KEY_READER_TEST_CNT
                    LDR        R7, [ R7 ]
KEY_TEST_LOOP:

                    BL         KEY_READER         @ прочитаем нажатые кнопки
                    CMP        R0, 0
                    ITT         NE
                    MOVNE      R6, R0
                    ADDNE      R7, R7, 1

                    @ выведем счетчик нажатий кнопок
                    MOV        R4, R7
                    MOV        R0, 55
                    MOV        R1, 10
                    MOV        R2, 1
                    MOV        R5, 5
                    BL         LCD_PUTDEC

                    @ вывод значения кода кнопки с учетом антидребезга\автоповтора
                    MOV        R4, R6
                    MOV        R0, 55
                    MOV        R1, 100
                    MOV        R2, 1
                    MOV        R5, 2
                    BL         LCD_PUTHEX

                    @ заголовок
                    ldr        R4, =key_test
                    BL         LCD_PUTSTR

                    TST        R6, 0b00000001
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      r2, 0
                    ldr        R4, =key_menu
                    BL         LCD_PUTSTR

                    TST        R6, 0b00000010
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      R2, 0
                    ldr        R4, =key_exit
                    BL         LCD_PUTSTR

                    TST        R6, 0b00000100
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      r2, 0
                    ldr        R4, =key_up
                    BL         LCD_PUTSTR

                    TST        R6, 0b00001000
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      r2, 0
                    ldr        R4, =key_dn
                    BL         LCD_PUTSTR

                    TST        R6, 0b00010000
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      r2, 0
                    ldr        R4, =key_lf
                    BL         LCD_PUTSTR

                    TST        R6, 0b00100000
                    ITE        EQ
                    MOVEQ      R2, 1
                    MOVNE      r2, 0
                    ldr        R4, =key_rt
                    BL         LCD_PUTSTR

                    LDR        R0, = KEY_READER_TEST_Old
                    STRB       R6, [ R0 ]
                    LDR        R0, = KEY_READER_TEST_CNT
                    STR        R7, [ R0 ]

                    POP       { R0 - R7, PC }


.section .rodata
.align(1)
key_test:
                         .byte       1                       @ задать координаты
                         .short      1, 30                   @ Y, X
                         .word       0                       @ цвет
                         .asciz      "ТЕСТ КНОПОК"   @ текст

key_menu:
                         .byte       2                       @ задать координаты
                         .short      20, 10                    @ X, Y
                         .asciz      "M"             @ текст

key_exit:
                         .byte       2                       @ задать координаты
                         .short      20, 30                    @ X, Y
                         .asciz      "E"             @ текст

key_up:
                         .byte       2                       @ задать координаты
                         .short      15, 80                    @ X, Y
                         .asciz      "UP"            @ текст

key_dn:
                         .byte       2                       @ задать координаты
                         .short      25, 80                    @ X, Y
                         .asciz      "DN"            @ текст

key_lf:
                         .byte       2                       @ задать координаты
                         .short      20, 60                    @ X, Y
                         .asciz      "LF"            @ текст

key_rt:
                         .byte       2                       @ задать координаты
                         .short      20, 100                    @ X, Y
                         .asciz      "RT"            @ текст



