2013-11-17 实验之裸板按键控制Led灯

题目

按键控制Led等,K1控制Led1,K2控制Led2,K3控制Led3,K4控制Led4.


注意事项

注意移位操作的含义,以及保持其他引脚的状态不变。


Makefile

ctlled.bin: start.o Ctlleds.o 
	arm-linux-ld -Ttext 0 -o ctlled.elf start.o Ctlleds.o
	arm-linux-objcopy -O binary ctlled.elf ctlled.bin
	arm-linux-objdump -D ctlled.elf > ctlled.dis

start.o:start.S
	arm-linux-gcc -o start.o start.S -c

Ctlleds.o: Ctlleds.c
	arm-linux-gcc -o Ctlleds.o Ctlleds.c -c

clean:
	rm *.o *.elf *.bin *.dis *.c *s


程序实现

ctlleds.c

#define GPKCON0 (*(volatile unsigned long *)0x7F008800)
#define GPKDATA (*(volatile unsigned long *)0x7F008808)
#define GPNCON (*(volatile unsigned long *)0x7F008830)
#define GPNDATA (*(volatile unsigned long *)0x7F008834)


int main()
{
	GPKCON0 &= 0xffff>>16; //output 4,5,6,7
	GPKCON0 |= 0x1<<16 | 0x1<<20 | 0x1<<24 | 0x1<<28;
	GPNCON &= 0x0<<0 | 0x0<<2 | 0x0<<4 | 0x0<<6; //input
	GPKDATA |=0xf<<4;
	
	while(1){			
			unsigned int k = GPNDATA;	//read the value
			
			if(k & (1<<0)){
				GPKDATA |= (1<<4); //important
			}else{
				GPKDATA &= ~(1<<4);
			}
			
			if(k & (1<<1)){
					GPKDATA |= (1<<5); //important
			}else{
				GPKDATA &= ~(1<<5);
			}
			
			if(k & (1<<2)){
					GPKDATA |= (1<<6); //important
			}else{
				GPKDATA &= ~(1<<6);
			}
		
			if(k & (1<<3)){
				GPKDATA |= (1<<7); //important
			}else{
				GPKDATA &= ~(1<<7);
			}
	}
	
	return 0;	
}


start.S
.text
.global _start
_start:
	ldr r0, =0x70000000
  orr r0, r0, #0x13
 	mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)
   
	ldr r0, =0x7E004000		@write the 0 to the wathchdog
	mov r1, #0
	str r1, [r0]
	
	ldr sp, =1024*4
	bl main
main_loop:
	b main_loop




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值