无论是S3C2410A还是S3C2440A,其IO口B都是11位二进制数,xxx xxxx xxxx,现在控制第5、6、7、8为做输出点亮LED灯(共阳极,输出0点亮),即xx8 765x xxxx,GPBCON equ 0x56000010
GPBDAT equ 0x56000014
GPBUP equ 0x56000018
xport xmain
area Init,code,readonly
entry
export
xmain
ldr r0,=GPBCON
ldr r1,[r0]
bic r1,#0x3fC00 ;r1=xx00 0000 00xx xxxx xxxx
orr r1,#0x15400 ;r1=xx01 0101 01xx xxxx xxxx
str r1,[r0] ;r1传给GPBCON设置8765位为输出
ldr r0,=GPBUP
ldr r1,[r0]
orr r1,#0x1e0 ;r1=xx1 111x xxxx
str r1,[r0] ;开B口第8、7、6、5位上拉电阻
ldr r0,=GPBDAT
ldr r2,[r0] ;把B口最初状态保存在R2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP dr r1,[r2]
orr r1,#0x1c0
str r1,[r0]
bl delay ;BL跳转时将PC+4值自动保存在R14即LR中,也就是将程序的下一个语句地址保存在lr中
;在转移的程序后执行mov pc,lr相当于返回,这样BL相当于调用子程序,pc=lr相当于子程序返回
;;;;;;;;;;;;;;;;;;
dr r1,[r2]
orr r1,#0x1a0
str r1,[r0]
bl delay
;;;;;;;;;;;;;;;;;;;;;
ldr r1,[r2]
orr r1,#0x160
str r1,[r0]
bl delay
;;;;;;;;;;;;;;;;;;;;;;;;
ldr r1,[r2]
orr r1,#0x0e0
str r1,[r0]
bl delay
;;;;;;;;;;;;;;;;;;;;;;;;
b LOOP
delay
mov r3,#3
delay1 sub r3,r3,#1
cmp r3,#0x0
bne delay1
mov pc,lr ;这句相当于子程序返回语句
end

GPA equ 0x000000
GET d:\abc\INC\2440addr.inc
GET d:\abc\INC\Option.inc
GET d:\abc\INC\Memcfg.inc
area Init,code,readonly
CODE32
entry
xmain
start
ldr r0,=GPACON
ldr r1,=GPA
str r1,[r0]
ldr r0,=GPADAT;
LOOP2 mov r1,#0
mov r2,#1
LOOP1 str r2,[r0]
BL delay
MOV r2,r2,LSL#1
add r1,#1
cmp r1,#23
bne LOOP1
B LOOP2
delay mov r3,#5
delay1 sub r3,r3,#1
cmp r3,#0
bne delay1
mov pc,lr
end

GPBCON equ 0x56000010
GPBDAT equ 0x56000014
GPBUP equ 0x56000018
GPAOUT equ 0x0000000
GPACON equ 0x56000000
GPADAT equ 0x56000004
export xmain
area Init,code,readonly
CODE32
entry
export
GBLA nn ;设置全局变量nn
xmain
ldr r1,=GPAOUT ;调取设置A口为输出的数据
ldr r0,=GPACON ;调取A口输出的方向控制寄存器地址
str r1,[r0] ;把方向控制数据赋值给A口方向寄存器0x56000000
ldr r0,=GPADAT ;调取A口输出的寄存器地址,传递给[r0]就是输出
LOOP2 mov r1,#0 ;r1计数23次,22个输出脚循环一次流水效果
mov r2,#1 ;点亮流水灯一个灯亮
LOOP1
str r2,[r0] ;点亮一个灯
BL delay ;延迟
MOV r2,r2,LSL#1 ;左移点亮下一个,依次类推
add r1,#1 ;计数加1
cmp r1,#23 ;计数加1看够不够23,
bne LOOP1 ;不够23次,说明没有全部轮流一次,跳到LOOP1继续。
B LOOP2 ;够23次,流水灯循环1次,跳到LOOP2处从头再来
delay mov r3,#5
delay1 sub r3,r3,#1
cmp r3,#0
bne delay1
mov pc,lr
end
流水灯C语言程序
#include"S3C2440.h"
void xmain()
{
unsigned char n,m;
GPACON =0;
while(1)
{
for(n=0;n<23;n++)
{
GPADAT =1<<n;
for(m=0;m<15;m++)
GPADAT = 1<<n;
}
}
}
|