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://www.voidcn.com/article/p-nwhhuwdl-tb.html)
#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中进行宏定义,则编译能通过,但得不到正确的结果。