S3C2440 点亮led灯详解(基于MDK)

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: S3C2440 点亮led灯详解(基于MDK)

这个程序也比较简单,相对上一篇博文,具有一样的编码过程,不过还是把贴出来分享下.

首先看原理图(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

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: S3C2440 点亮led灯详解(基于MDK)

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: