GPBCON控制器控制LED显示

GPBCON是用来设置输入输出属性的,也就是说,你不是要控制LED吗?现在你知道了LED的引脚有GPB0,GPB1,而GPBCON又是控制这些引脚的属性,那么现在我们要控制它闪烁就要设置这些引脚的属性为输出。那么如何设置呢?我们的引脚是GPB0,GPB1,而GPBCON是两位控制一个引脚,所以应该是0101(这里手册上说的很清楚),GPBCON寄存器的低22位都是用来控制引脚的属性,其中每两位控制一个引脚,如[1:0]来控制GPB0也就是第0个引脚,[21:20]来控制GPB10也就是第11个引脚,而在板子上面每个LED一般都有两个引脚,所以两个引脚都要设置,设置为00则表示输入状态,01表示输出状态(一般是高位在前,如GPB0[1:0]也就是第1位为0,第0位为1),10为特殊功能,11保留待用.

即GPBCON=0X5(0101二进制换为16进制就是5)

GPBDAT是用来读写引脚的,这个更重要了。我们要控制第一个,第二个引脚。
#define    LED3_ON()    (GPBDAT &= ~(0x1))   当LED3亮的时候,把GPBDAT的最后一位置0 (GPB0是最后一位撒)
#define    LED4_ON()    (GPBDAT &= ~(0x2))   当LED4亮的时候,把GPBDAT的倒数第二位置0 (GPB1倒。第二撒)
#define    LED3_OFF()   (GPBDAT |= (0x1))当LED3 灭的时候,把GPBDAT的最后一位置1 (GPB0是最后一位撒)
#define    LED4_OFF()   (GPBDAT |= (0x2))当LED4 灭的时候,把GPBDAT的倒数第二位置1 (GPB1倒数第二撒)

GPBUP是端口上拉寄存器 端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止,当对应bit为0,这个引脚的上拉寄存器是允许的,当为1时,上拉寄存器是禁止的。

这里我们把它禁止掉GPBUP=0xffff;

说到这里,应该差不多了。可以亮,可以灭,但是要闪烁,我们必须还需要一个延时程序。
delay:
sub   r0,r0,#1
cmp  r0,#0x0
bne   delay
mov  pc,lr

现在作为一个LED闪烁的必要准备工作已经完成了,下面就是凑成一个完整的程序就OK了。
需要两个程序,一个汇编,一个C文件。

汇编程序用来入口以及那个延时程序,C程序用来处理亮,灭。显示闪烁效果。

具体代码如下:led.s
.text
.global _start
ldr sp,=1024*4
.extern main
bl main
.global delay
delay:
sub   r0,r0,#1
cmp  r0,#0x0
bne   delay
mov  pc,lr
.end

led.c
extern void delay(int time);
#define GPBCON        (*(volatile unsigned *)0x56000010)
#define GPBDAT        (*(volatile unsigned *)0x56000014)
#define GPBUP        (*(volatile unsigned *)0x56000018)   
#define    LED3_ON()    (GPBDAT &= ~(0x1))  
#define    LED4_ON()    (GPBDAT &= ~(0x2))   
#define    LED3_OFF()   (GPBDAT |= (0x1))
#define    LED4_OFF()   (GPBDAT |= (0x2))
void Main()
{
     GPBCON=0x5;
     [size=-1]GPBUP =0xffff;
      while(1)
     {
      LED3_ON();
      delay(0xfffff);
      LED4_ON();
      delay(0xfffff);
      LED3_OFF() ;
     delay(0xfffff);
      LED4_OFF();
    delay(0xfffff);   
    }
}

累死我了,不知道打错没,若有错误请指出啊。因为我上网时用一个机器,写程序是另一个机器(不能上网,因为盗版的问题),所以代码不能拷贝。有错误的地方望见谅啊。。

末了,写写在linux上怎么编译吧,因为开始在这里我还卡了一下,所以觉得应该有必要写出来(还是只是我比较弱,大家早就知道了啊)
  arm-linux-gcc -g -c -o led.o led.s
  arm-linux-gcc -g -c -o led_on.o led.c
  arm-linux-ld -Ttext 0x0000000 -g led.o led_on.o  -o led_on_c.o
  arm-linux-objcopy -O binary -S led_on_c.o led_on  (注意这里O跟S是大写)

 

 

如有下面一段代码:

#define GPBCON                  (*(volatile unsingned long *)0x56000010)
#define GPBDAT                  (*(volatile unsingned long *)0x56000014)
#define GPB5_out                (1<<(5*2))
GPBCON=GPB5_out;                //GPB5引脚设置为输出
GPBDAT&=~(1<<5);                //GPB5输出低电平
可以看到第三句,因为GPB5也就是第5个引脚,GPBCON对应控制它的也就是[11:10],所以需要将0x1左移10位也就是得到第11,10位为01,看到第5句,GPBDAT寄存器的低11位也是分别用来对应11个引脚的数值状态,为0则表示LED灭,为1则表示LED亮,所以需要将0x1左移5位然后取反,然后和GPBDAT相与,这样只会将第5位置为0.

 

你可能感兴趣的:(GPBCON控制器控制LED显示)