無論是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;
}
}
}
|