ARM学习——按键控制LED(裸机)

  • 实现目标,通过3个按键控制对应的3个灯的亮灭,当没有按键按下时,3个灯灭。
    c语言程序代码:
//led1,led2,led4  GPF4,GPF5,GPF6
//key1,key2,key3  GPF0 GPF2 GPG3
#define GPFCON  (*(volatile unsigned long *) 0x56000050)
#define GPFDAT  (*(volatile unsigned long *) 0x56000054)
#define GPGCON  (*(volatile unsigned long *) 0x56000060)
#define GPGDAT  (*(volatile unsigned long *) 0x56000064)
#define GPF4_out (1<<4*2)
#define GPF5_out (1<<5*2)
#define GPF6_out (1<<6*2)
#define GPF0_in ~(3<<0*2)
#define GPF2_in ~(3<<2*2)
#define GPG3_in ~(3<<3*2)
enum LED{led1,led2,led3};
void led_init(void)
{
   GPFCON = GPF4_out|GPF5_out|GPF6_out&GPF0_in&GPF2_in;
   GPGCON &= GPG3_in;
}
void led_on(enum LED led_name)
{
switch(led_name)
{
 case led1:
  GPFDAT &= (~(1<<4));
 break;
 case led2:
  GPFDAT &= (~(1<<5));
 break;
 case led3:
  GPFDAT &= (~(1<<6));
 break;
 default:
 break;
}
}
void led_off(enum LED led_name)
{
switch(led_name)
{
 case led1:
  GPFDAT |= (1<<4);
 break;
 case led2:
  GPFDAT |= (1<<5);
 break;
 case led3:
  GPFDAT |= (1<<6);
 break;
 default:
 break;
}
}
unsigned char keyscan(void)
{
unsigned char key=0;
if((GPFDAT&(1<<0))==0)
 key=1;
if((GPFDAT&(1<<2))==0)
 key=2;
if((GPGDAT&(1<<3))==0)
 key=3;
return key;
}
void delay(volatile unsigned long time)
{
for(;time>0;time--);
}
int main(void)
{
unsigned char key=0;
led_init(); //led init
while(1)
{
 key=keyscan();
 switch(key)
 {
  case 1:
   led_on(led1);
  break;
  case 2:
   led_on(led2);
  break;
  case 3:
   led_on(led3);
  break;
  default:
   led_off(led1);
   led_off(led2);
   led_off(led3);
  break;
 }
}
return 0;
}

汇编语言程序代码:

.text
.global _start
_start:
 LDR  R0,=0x53000000
 MOV R1,#0x00
 STR R1,[R0]
 LDR SP,=1024*4
 BL main
HALT_LOOP:
 B HALT_LOOP

编译与链接Makefile

led.bin: crt0.s led.c 
 arm-linux-gcc -g -c -o crt0.o crt0.s
 arm-linux-gcc -g -c -o led.o led.c
 arm-linux-ld -Ttext 0x00000000 -g crt0.o led.o -o led_elf
 arm-linux-objcopy -O binary -S led_elf led.bin
clean:
 rm -f led.bin led_elf *.o
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值