ARM汇编示例—按键LED(循环)

汇编程序是学习硬件非常好的切入点,虽然程序用C来写回比较方便,但是要想真正了解一款硬件,还是得从体系结构和汇编指令上下点功夫。

一下是一个最基础的ARM 汇编程序,程序的功能是按键,然后在LED上显示出来是哪个键按了下去。

;引脚连线
;
GPF0~GPF3 K1~K4
;
GPF4~GPF7 LED1~LED4
;
GPG3 K5
;
GPG11 K6
;
GPxCON的配置寄存器每个引脚都占两位,00表示表示输入,01表示输出
;
GPxDAT寄存器表示引脚的高低电平状态,读写数据在这个寄存器里进行
;
程序结果:按Kx,则LED就根据x的二进制表示出来

GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPGCON EQU 0x56000060
GPGDAT EQU 0x56000064

    AREA KEY_LED, CODE, READONLY 
;这里表示此区域是只读代码"KEY_LED"
    EXPORT    _ENTRY ;引入程序入口,这里跟连接器有关系

;程序入口
_ENTRY

    
;初始化GPIO的配置
    ;这里包括K1~K4输入配置和LED1~LED4的配置
    ldr r0, =GPFCON
    
mov r1, #0x5500
    
str r1, [r0]
    
    
;K5和K6的配置
    ldr r0, =GPGCON
    ldr r1, =0xff3fff3f
    
str r1, [r0]
    
    
;初始化将led都熄灭
    ldr r0, =GPFDAT
    
mov r1, #0xf0
    
str r1, [r0]    

;循环测试各按键状态,并修改led状态
LOOP
    
    
;测试按键1 GPF0
    ldr r0, =GPFDAT        ;将GPF的数据寄存器地址放入r0
    ldr r1, [r0]          ;读取GPF数据寄存器
    tst r1, #0x01         ;测试GPF0是否变0(K1按下),若是按下,EQ置1,否则NE置1
    andeq r1, r1, #0xef ;若是EQ为1,将GPF4置0(点亮),其他不变
    orrne r1, r1, #0x10 ;若是NE为1,将GPF4置1(熄灭),其他不变
    str r1, [r0]        ;将LED状态写入GPF数据寄存器
    
    
;测试按键2 GPF2
    ldr r0, =GPFDAT
    ldr r1, [r0]
    tst r1, #0x02
    andeq r1, r1, #0xdf
    orrne r1, r1, #0x20
    
str r1, [r0]
    
    
;测试按键3 GPF3
    ldr r0, =GPFDAT
    ldr r1, [r0]
    tst r1, #0x04
    andeq r1, r1, #0xcf
    orrne r1, r1, #0x30
    
str r1, [r0]

    
;测试按键4 GPF04
    ldr r0, =GPFDAT
    ldr r1, [r0]
    tst r1, #0x08
    andeq r1, r1, #0xbf
    orrne r1, r1, #0x40
    
str r1, [r0]
    
    
;测试按键5 GPG3
    ldr r0, =GPGDAT
    ldr r1, [r0]
    ldr r0, =GPFDAT
    ldr r2, [r0]
    tst r1, #0x0008
    andeq r2, r2, #0xaf
    orrne r2, r2,  #0x50
    
str r2, [r0]
    
    
;测试按键5 GPG11
    ldr r0, =GPGDAT
    ldr r1, [r0]
    ldr r0, =GPFDAT
    ldr r2, [r0]
    tst r1, #0x0800
    andeq r2, r2, #0x9f
    orrne r2, r2,  #0x60
    
str r2, [r0]

    b    LOOP

    END


 本程序在ARM920T中运行成功

posted @ 2010-08-11 19:37  sunjian  阅读(3365)  评论(0)    收藏  举报