TQ210裸机编程(3)——按键(查询法)

首先查看TQ210的底板原理图


这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0

可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚。

这次编程使用查询法,需要设置这两个引脚为输入模式,然后循环读取引脚状态,当用户按下按键时,对应引脚为低电平,同时改变LED状态。


查看S5PV210芯片手册

start.S

.global _start				@声明一个全局的标号
_start:
	bl main					@跳转到C函数去执行
halt:
	b halt					@死循环


key.c

#define GPC0CON		*((volatile unsigned int *)0xE0200060)
#define GPC0DAT		*((volatile unsigned int *)0xE0200064)

#define GPH0CON		*((volatile unsigned int *)0xE0200C00)
#define GPH0DAT		*((volatile unsigned int *)0xE0200C04)

void delay(volatile unsigned int t)
{
	volatile unsigned int t2 = 0xFFFF;
	while (t--)
		for (; t2; t2--);
}

int main()
{
	int key_val = 0;
	int bit;
	GPC0CON &= ~(0xFF << 12);
	GPC0CON |= 0x11 << 12;		// 配置GPC0_3和GPC0_4为输出:LED1和LED2
	
	GPH0CON &= ~(0xFF << 0);	// 配置GPH0_0和GPH0_1为输入:key1和key2
	
	while (1)
	{
		key_val = GPH0DAT & 0x3;
		if (key_val)
		{
			delay(500000);		// 防抖延时
			key_val = GPH0DAT & 0x3;
			
			if (key_val)
			{
				if (0x01 == key_val)		// key1
					GPC0DAT ^= 1 << 3;		// toggle LED1
				else if (0x02 == key_val)	// key2
					GPC0DAT ^= 1 << 4;		// toggle LED2
			}
		}
	}
	
	return 0;
}


Makefile

key.bin: start.o key.o
	arm-linux-ld -Ttext 0x20000000 -o key.elf $^
	arm-linux-objcopy -O binary key.elf $@
	arm-linux-objdump -D key.elf > key.dis
	
key.o : key.c
	arm-linux-gcc -c $< -o $@
start.o : start.S
	arm-linux-gcc -c $< -o $@
	
clean:
	rm *.o *.elf *.bin *.dis


下载程序方法参加《TQ210裸机编程(1)——点亮一个LED》

下载程序运行后:

按下key1,LED1点亮,再次按下key1,LED1熄灭

按下key2,LED2点亮,再次按下key2,LED2熄灭

原文地址:https://www.cnblogs.com/suncoolcat/p/3367811.html