2 回答
TA贡献1877条经验 获得超1个赞
S3C2410_GPFDAT口上接了8个按键,S3C2410_GPGDAT中上接了8个按键,
一个bit位代表一个按键,一共16个按键。
当有按键按下时,通过轮询或中断方式知道了有按键信息,然后传进了一个irq号的参数,这个参数数值是44+(0~15)=44~59,这个数据可能是根据的接的中断号或者其它某些硬件的设计规则得到的(具体看你设备硬件的连接及配置),代表着哪一个按键按下了。
static int iskey_down(unsigned long irq)
{
int reg, gpio_no;
irq_no = (int irq); // 取得中断号(按键标识)
irq_no = irq_no -44; //EINT4~29 , 20~23 //减掉偏移量44得到0~15的键码,分别代表16个按键中的一个
if(irq_no<8) // 如果0~7,那就是按在GPFDAT口上的8个按键
{
reg = _raw_read(S3C2410_GPFDAT); //读取GPFDATA口上的按键状态,每bit代表一个按键
gpio_no = irq_no; // 具体按键数值在GPFDATA中的位置(0~7)和按键编号(0~7)对应(0:7~0:7),可以直接用于后面取出具体的bit位
}
else
{
reg = raw_readl(S3C2410_GPGDAT); //读取GPGDATA口上的按键状态,每bit代表一个按键
gpio_no = irq_no - 8; // 具体按键数值在GPGDATA中的位置(0~7)和按键编号(8~15)有一个偏移的映射关系,所以直接减8让它位对应(0:7~0:7),以便于后面取出具体的bit位
}
if(reg&(1<gpio_no)) // 如果对应的按键bit位没有按下(此时gpio_no就代表着相应的按键在对应键盘状态数值中的bit位的位置第0~7位)
return 0; //按键没有按下或者松开了噢
else
return 1; //按键被按下了噢~~~
}
- 2 回答
- 0 关注
- 70 浏览
添加回答
举报