这个程序也比较简单,相对上一篇博文,具有一样的编码过程,不过还是把贴出来分享下.
首先看原理图(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 pGPBUP EQU 0x56000018 ;定义宏GPBUP start LDR R0, =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 BL delay ;跳转到delay处,并且保存PC值到LR寄存器 B led_off ;执行完delay代码跳转到led_off处 led_off LDR R0, =pGPBDAT ;GPBDAT加载到R0 MOV R1, #0x1e0 ;给led端口写高电平,而且蜂鸣器的第一位置为低电平 STR R1, [R0] ;将配置好的重新写入GPBDAT寄存器 MOV R2, #0x100000 ;延迟函数初始化R2 BL delay ;跳转到delay处,并且保存PC值到LR寄存器 B led_on ;执行完delay代码跳转到led_off处 delay SUB R2, R2, #0x01 ;给R2赋值 CMP R2, #0x0 ;比较R2跟0的大小 BNE delay ;如果不相等,就接着执行延迟 MOV PC, LR ;如果相等了,就直接从LR读取上次保存的,也就是跳出程序 NOP ;空指令 END ;代码结束标志
具体源代码可以在这里下载到:
S3C2440 点亮led灯详解(基于MDK)源码下载
http://www.jyguagua.com/bbs/forum.php?mod=viewthread&tid=179&fromuid=1
文章的脚注信息由WordPress的wp-posturl插件自动生成