- 实现目标,通过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