---恢复内容开始---
1:按键原理图
按键按下的时候EINT2、EINT3、KP_COL0-3为低电平;
EINT2、EINT3引脚接在GPH0_2、GPH0_3引脚,引脚配置为输入模式,当引脚检测为低电平的时候说明有按键按下,
KP_COL0-3引脚为GPH2_0~GPH2_3,,引脚配置为输入模式,当引脚检测为低电平的时候说明有按键按下,
2:代码实战
轮询方式检测有无按键
/* * s5pv210裸机实验 * * key * */ #define _REG_GPH0CON (*(volatile unsigned int *)0xE0200C00) #define _REG_GPH0DAT (*(volatile unsigned int *)0xE0200C04) #define _REG_GPH2CON (*(volatile unsigned int *)0xE0200C40) #define _REG_GPH2DAT (*(volatile unsigned int *)0xE0200C44) void led_blink(void); void led_off(void); void key_init(void) { //EINT2配置为输入模式 _REG_GPH0CON &= ~(0xFF<<8); //GPH2_0~GPH2_3置为输入 _REG_GPH2CON &= ~(0xFFFF<<0); } void key_polling(void) { key_init(); while (1) { if (!(_REG_GPH0DAT & (0x1<<2))) { led_blink(); } if (!(_REG_GPH0DAT & (0x1<<3))) { led_blink(); } if (!(_REG_GPH2DAT & (0x1<<0))) { led_blink(); } if (!(_REG_GPH2DAT & (0x1<<1))) { led_blink(); } if (!(_REG_GPH2DAT & (0x1<<2))) { led_blink(); } if (!(_REG_GPH2DAT & (0x1<<3))) { led_blink(); } } }
按键消抖:消抖的原理就是在处理按键的时候加上一个20ms的延时程序;代码如下:
if (!(_REG_GPH0DAT & (0x1<<2))) { delay20ms(); if (!(_REG_GPH0DAT & (0x1<<2))) { led_blink(); } }
3:以中断模式初始化按键
外部中断设置需要涉及到4个寄存器:
1:接线引脚要设置为中断模式;
2:设置中断触发的方式;
3:中断掩码设置为使能中断;
4:中断挂起要设置为0,发生中断以后,中断处理函数要把中断挂起为重新写为0;
寄存器介绍:
GPH0CON寄存器:接入中断的引脚要设置为EXT_INT中断模式
EXT_INT_0_CON寄存器:设置中断发生的模式 上升沿 下降沿 高电平 低电平
EXT_INT_0_MASK:中断掩码要设置为0;
EXT_INT_0_PEND 清中断挂起 我们初始化的时候可以通过写1来进行清除中断,中断处理完之后,我们也要向这个寄存器写1来清除中断。
实战代码:
#define EXT_INT_0_CON 0xE0200E00 #define EXT_INT_2_CON 0xE0200E08 #define EXT_INT_0_PEND 0xE0200F40 #define EXT_INT_2_PEND 0xE0200F48 #define EXT_INT_0_MASK 0xE0200F00 #define EXT_INT_2_MASK 0xE0200F08 #define _REG_EXT_INT_0_CON (*(volatile unsigned int *)EXT_INT_0_CON) #define _REG_EXT_INT_2_CON (*(volatile unsigned int *)EXT_INT_2_CON) #define _REG_EXT_INT_0_PEND (*(volatile unsigned int *)EXT_INT_0_PEND) #define _REG_EXT_INT_2_PEND (*(volatile unsigned int *)EXT_INT_2_PEND) #define _REG_EXT_INT_0_MASK (*(volatile unsigned int *)EXT_INT_0_MASK) #define _REG_EXT_INT_2_MASK (*(volatile unsigned int *)EXT_INT_2_MASK) //中断方式初始化按键 void key_inter_init(void) { //ENIT2、ENIT3引脚设置为中断模式 _REG_GPH0CON |= (0xFF<<8); //ENIT16、ENIT17、ENIT18、ENIT19引脚设置为中断模式 _REG_GPH2CON |= (0xFFFF<<0); //设置ENIT2、ENIT3为下降沿触发 _REG_EXT_INT_0_CON &= ~(0xFF<<8); _REG_EXT_INT_0_CON |= ((0x2<<8) | (0x2<<12)); //设置ENIT16、ENIT17、ENIT18、ENIT19为下降沿触发 _REG_EXT_INT_2_CON &= ~(0xFFFF<<0); _REG_EXT_INT_0_CON |= ((0x2<<0) | (0x2<<4) | (0x2<<8) | (0x2<<12)); //使ENIT2、ENIT3能外部中断; _REG_EXT_INT_0_MASK &= ~(0x3<<2); //使ENIT16、ENIT17、ENIT18、ENIT19能外部中断; _REG_EXT_INT_2_MASK &= ~(0xF<<0); /* //清ENIT2、ENIT3中断挂起 _REG_EXT_INT_0_PEND |= (0x3<<2); //清ENIT16、ENIT17、ENIT18、ENIT19中断挂起 _REG_EXT_INT_2_PEND |= (0xF<<0); */ clean_int_pend(); }