发光管二极管的发光原理:
当发光二极管中流过的电流达到一定值时,二极管便会发光,一般情况下,这个电流值是3~10mA(稍微大于10mA也可以,不过最好不要大于20mA,否则二极管会被烧坏),所以我们要点亮发光二极管就是让他流过的电流在这个范围内。
我们可以在二极管的阳极端加上上拉电阻,并且加上VCC,阴极端接在单片机的接口。由电路知识可知,当阴极端为低电平时,二极管导通,发光。即单片机接口输出低电平时,二极管发光。所以,我们要点亮二极管,就是要让单片机接口输出低电平。
关于端口上拉寄存器(GPBUP)作用的问题
1) 通常用于输出时,需要上拉,以便增加输出电流的能力;
(s3c2440芯片手册有说明: GPBUP对应位是 0:使能; 1:禁止。GPBUP reset值是0x0)
2) 不需要上拉的情况较复杂,举例说,一种情况下是:如果做为A/D输入口,就不应该上拉,以免影响实际的输入电平;还有一种是:CPU低功耗睡眠状态,上拉电阻有可能切断,降低功耗(这取决于不同芯片).
3)上拉禁止:输出端相当于一个OC门或OD门
http://www.jyguagua.com/?p=395
首先看原理图(LED):
1:nLED_1/2/3/4如果是低电平,那么LED将会点亮;
2:nLED_1/2/3/4对应的IO口是:GPB5/6/7/8
好的,那么我们看芯片手册,往往我们要看的是GPBCON, GPBDAT,GPBUP.
控制 LED 闪烁:
以下是本人在mini2440开发板自己亲自总结的点灯程序,我不知道你用的是什么开发板,相信以你的能力转换一下就可以解决了!要使他 “不停的闪烁”其实就是利用循环控制相应寄存器的输出输入状态!
@***************
@file:head.s
@功能:点亮两个led灯
@***************
@下面三行为工业流程,固定写法
.text
.global _start
_start:
ldr r0,=0x56000010 @将r0设置为GPBCON寄存器,并装载GPBCON寄存器的地址
ldr r1,=0x15400 @设置GPB5-8四个引脚为输出状态(CPU发出信号给GPB引脚)
str r1,[r0] @把寄存器中的数据r1写道内存中去
ldr r0,=0x56000014 @将r0设置为GPBDAT寄存器,并装载GPBDAT寄存器的地址
flash:
ldr r1,=0x180 @对GPBDAT寄存器的5-8位进行设置
str r1,[r0] @把寄存器中的数据r1写道内存中去,四个灯的状态两不亮
bl wait @跳转的同时保存下一条指令的地址给链接寄存器
ldr r1,=0x1e0 @对GPBDAT寄存器的5-8位进行设置
str r1,[r0] @把寄存器中的数据r1写道内存中去,四个灯的状态全不亮
bl wait
b flash
@下面一个循环(相当延时)
wait:
ldr r2,=0xfff0
loop:
subs r2,r2,#1
bne loop
mov pc,lr @利用链接寄存器跳回去
stop:
b stop
我的代码:
/* add for my2440 led set */
#ifdef CONFIG_S3C2440
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
ldr r0,=GPBCON /* set GPBCON to be output mode */
ldr r1,=0x15400
str r1,[r0]
ldr r0,=GPBDAT /* set output data value */
flash:
ldr r1,=0x160 /* set the third led on, the other led off */
str r1,[r0]
bl wait
ldr r1,=0x80
str r1,[r0]
bl wait
b flash
wait:
ldr r2,=0xfff0
loop:
subs r2,r2,#1
bne loop
mov pc,lr
#endif
http://page.renren.com/601407746/note/848699398?op=next&curTime=1338033600000