1、新建一个工程,命名为“button_led”,再在工程下新建一个文件start.s。
/* start.s */
area init,code,readonly //该伪指令定义了一个代码段,段名为Init,属性只读
b begin //跳转到begin处执行
begin
ldr sp,=1024*4 //设置堆栈,注意:不能大于4k, 因为现在可用的内只有4K存 只有4K,nand flash中的代码在复位后会移到内部ram中,此ram只有4K
export main //声明主函数Main
b main //调用C程序中的main函数
end
2、再新建一个头文件对端口进行初始化和宏定义。
/* button.h */
#ifndef _LED_
#define _LED_
#define rGPBCON (*((volatile unsigned *)0x56000010)) //定义一个寄存器变量(详细请访问链接地址:http://blog.csdn.net/yimu13/article/details/6329306)
#define rGPBDAT (*((volatile unsigned *)0x56000014)) //Port B数据寄存器 #... 要想实现对G口的配置,只要在地址0x56000060中给32位的每一位赋值就可以了#define rGPGCON ((*(volatile unsigned *)0x56000060))
#define rGPGDAT ((*(volatile unsigned *)0x56000064))
#define LED1_ON rGPBDAT&=(~(0x1<<5))
#define LED2_ON rGPBDAT&=(~(0x1<<6))
#define LED3_ON rGPBDAT&=(~(0x1<<7))
#define LED4_ON rGPBDAT&=(~(0x1<<8))
#define LED1_OFF rGPBDAT|=(0x1<<5)
#define LED2_OFF rGPBDAT|=(0x1<<6)
#define LED3_OFF rGPBDAT|=(0x1<<7)
#define LED4_OFF rGPBDAT|=(0x1<<8)
#endif
3、在工程中再新建一个源文件,button.c 。
/* button.c */
#include "dey.h"
int delay(unsigned int n)
{
while(n--);
return 0;
}
int main()
{
rGPBCON |= 0x15400;
while(1)
{
if((rGPGDAT &0x1)==0x0)
LED1_ON;
delay(1000);
if((rGPGDAT &0x8)==0x0)
LED2_ON;
delay(1000);
if((rGPGDAT &0x20)==0x0)
LED3_ON;
delay(1000);
if((rGPGDAT &0x40)==0x0)
LED4_ON;
delay(1000);
if((rGPGDAT&0x1)==0x1)
LED1_OFF;
if((rGPGDAT&0x8)==0x8)
LED2_OFF;
if((rGPGDAT&0x20)==0x20)
LED3_OFF;
if((rGPGDAT&0x40)==0x40)
LED4_OFF;
delay(1000);
if((rGPGDAT&0x80)==0x0)
{
int i=5;
while(i!=0)
{
LED1_ON;
delay(1000000);
LED2_ON;
delay(1000000);
LED3_ON;
delay(1000000);
LED4_ON;
delay(1000000);
LED1_OFF;
delay(1000000);
LED2_OFF;
delay(1000000);
LED3_OFF;
delay(1000000);
LED4_OFF;
delay(1000000);
i--;
}
}
if((rGPGDAT &0x800)==0x0)
{
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
}
}
return 0;
}
总结:以上代码能编译通过,但如果对每个键在button.h中进行宏定义,则编译能通过,但得不到正确的结果。