Assembly 带键盘模块的ARM组件GPIO接口

Assembly 带键盘模块的ARM组件GPIO接口,assembly,arm,cortex-m,Assembly,Arm,Cortex M,您好,我有TM4C123GXL开发板和MCU TM4C123GH6PM,我有一个4x4键盘模块+4个开关按钮+模块上的8个LED。我将交换机连接到GPIO的输入端口(B端口B0-B3),4个LED连接到我的输出端口(B4-B7)。我想我已经完成了下面列出的必要配置 GPIO_PORTB_DIR EQU 0x40005400 GPIO_PORTB_PDR EQU 0X40005514 GPIO_PORTB_AFSEL EQU 0x40005420 GPIO_PORTB_

您好,我有TM4C123GXL开发板和MCU TM4C123GH6PM,我有一个4x4键盘模块+4个开关按钮+模块上的8个LED。我将交换机连接到GPIO的输入端口(B端口B0-B3),4个LED连接到我的输出端口(B4-B7)。我想我已经完成了下面列出的必要配置

GPIO_PORTB_DIR      EQU 0x40005400 
GPIO_PORTB_PDR      EQU 0X40005514
GPIO_PORTB_AFSEL    EQU 0x40005420
GPIO_PORTB_DEN      EQU 0x4000551C
IOB                 EQU 0xF0
GPIO_PORTB_LOCK     EQU 0x40005520
GPIO_PORTB_CR       EQU 0x40005524
SYSCTL_RCGCGPIO     EQU 0x400FE608

             AREA   |.text|,    READONLY,   CODE,   ALIGN=2
             THUMB
             EXPORT start

start       PROC
            PUSH    {R0-R1}
            LDR     R1 , =SYSCTL_RCGCGPIO
            MOV     R0 , #0
            ORR     R0 , R0 , #0x02                 ;0000_0010  Only activates B ports' clock.
            STRB    R0 , [R1]                       ;..FE DCBA
            NOP
            NOP
            NOP                                     ;LET CLOCK STABILIZE.
            
            LDR     R1 , = GPIO_PORTB_LOCK          ;Unlock B
            LDR     R0 , =0x4C4F434B                ;Value is not important. (Just ASCII of "LOCK")
            STR     R0 , [R1]                       ;0x40005520 is 00 means it is unlocked.  01 means it is locked. 0x40005524 should be FF for GPIOCR
            
            LDR     R1 , = GPIO_PORTB_AFSEL         
            MOV     R0 , #0
            STRB    R0 , [R1]                       ;Regular I/O will be used.
            
            LDR     R1 , =GPIO_PORTB_DIR            ;Configuration of Port B starts.
            MOV     R0 , #0
            ORR     R0 , #IOB                       ;[B7-B4] = Output   ,    [B3-B0] = Input
            STRB    R0 , [R1]                       ;Modify only B7-B0
            
            LDR     R1 , =GPIO_PORTB_DEN            
            MOV     R0 , #0xFF                      ;Digital I/O is enabled for all pins of port B (B0-B7)
            STRB    R0 , [R1]                       ;Configuration of Port B ends.
            POP     {R0-R1}
            BX LR
            ENDP
                ALIGN
                    END

在我的主函数中,我设置了B7,B6,B5,而B4为零,如下所示

            LDR     R1 , =GPIO_PORTB_DATA    ;0x400053FC DATA ADDRESS TO ALL PINS
            MOV     R0 , #0xE0
            STRB    R0 , [R1]
当我运行该程序时,我希望数据寄存器地址中出现“E0”,因为我没有按下任何开关,所以B0-B3都是0,我将输出初始化为1110(E),如上所述。然而,我注意到这是EF。下面是我的两个问题。(抱歉花了这么长时间)

1-)我只观察到LED0打开,而我只期望看到另一种情况(LED3,2,1:打开,而LED0:关闭)

2-)因为我读到了F(1111输入来自开关),这是否意味着我的开关已经导通了,当我按下它们时,它变成了断路


对于这两个问题,我只想到了其他情况,结果是这样的。我想我遗漏了一些要点。我很乐意提供帮助。

开关是常开还是常闭?如果打开,那么您的一侧是挂接在地上还是挂接在vcc上?如果接地,gpio引脚是否已拔出?在基本知识之后,你打算如何处理反弹?这是一个asm问题还是其他问题?你是不是先用C做原型的?或者编程语言与问题无关?开关看起来像是常闭的,因为我在数据寄存器中观察到F。当我按下S3(对应于B3)时,F值降低到7,这意味着如果按下开关,B3不再导通。我连接了接地和vcc引脚。我没有拉上或拉下gpıo销。为了处理去抖动,我有一个插入延迟的函数。我认为问题与编程语言无关。开关一端连接到gpio引脚,另一端连接到。。。?