s5pv210——按键

---恢复内容开始---

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();
}

 

posted @ 2017-01-27 18:58  biaohc  阅读(1207)  评论(0编辑  收藏  举报