这个程序也比较简单,相对上一篇博文,具有一样的编码过程,不过还是把贴出来分享下.
首先看原理图(LED):
通过看这个原理图,我们晓得如下:
1:nLED_1/2/3/4如果是低电平,那么LED将会点亮;
2:nLED_1/2/3/4对应的IO口是:GPB5/6/7/8
好的,那么我们看芯片手册,往往我们要看的是GPBCON, GPBDAT,GPBUP.
通过上面的手册,我们可以编码如下:
;效果:led亮,beeper蜂鸣;led灭,beeper停止蜂鸣
AREA ledwithbeeper, CODE, READWRITE ;定义代码段,可读可写
ENTRY ;定义程序入口
pGPBCON EQU 0x56000010 ;定义宏GPBCON
pGPBDAT EQU 0x56000014 ;定义宏GPBDAT
pGPBUPEQU 0x56000018 ;定义宏GPBUP
start
LDRR0, =pGPBCON;加载pGPBCON
LDR R1, [R0];R0的值赋给R1,进而对R1进行操作
BIC R1, R1, #0x3 ;最低两位清0
BIC R1, R1, #(0xff << 10) ;GPB5/6/7/8对应的10,11,12,13...17清零
ORR R1, #0x01 ;R1最低位置1
ORR R1, R1, #(0x55 << 10) ;给GPB5/6/7/8设置为01输出模式,参考芯片对应寄存器设置
STR R1, [R0] ;将配置好的R1赋值给R0
LDR R0, =pGPBUP ;加载GPBUP
MOV R1, #0xff ;将上拉电阻禁用
STR R1, [R0] ;配置好的R1写入R0
led_on
LDR R0, =pGPBDAT ;GPBDAT加载到R0
MOV R1, #0x01 ;给led端口写低电平,而且蜂鸣器的第一位置为高电平
STR R1, [R0] ;将配置好的R1写进去
MOV R2, #0x100000 ;延迟函数初始化R2
BLdelay ;跳转到delay处,并且保存PC值到LR寄存器
Bled_off ;执行完delay代码跳转到led_off处
led_off
LDR R0, =pGPBDAT ;GPBDAT加载到R0
MOV R1, #0x1e0 ;给led端口写高电平,而且蜂鸣器的第一位置为低电平
STR R1, [R0] ;将配置好的重新写入GPBDAT寄存器
MOV R2, #0x100000 ;延迟函数初始化R2
BLdelay ;跳转到delay处,并且保存PC值到LR寄存器
Bled_on ;执行完delay代码跳转到led_off处
delay
SUB R2, R2, #0x01 ;给R2赋值
CMP R2, #0x0 ;比较R2跟0的大小
BNEdelay ;如果不相等,就接着执行延迟
MOV PC, LR ;如果相等了,就直接从LR读取上次保存的,也就是跳出程序
NOP ;空指令
END;代码结束标志
具体源代码可以在这里下载到:
S3C2440 点亮led灯详解(基于MDK)源码下载
文章的脚注信息由WordPress的wp-posturl插件自动生成
|2|left
打赏
微信扫一扫,打赏作者吧~