为了账号安全,请及时绑定邮箱和手机立即绑定

有一段函数判断是否有按键被按下代码如下,求理解

有一段函数判断是否有按键被按下代码如下,求理解

慕无忌1623718 2022-10-01 14:10:47
static int iskey_down(unsigned long irq){int reg, gpio_no;irq_no = (int irq);irq_no = irq_no -44; //EINT4~29 , 20~23 //此处含义?????if(irq_no<8){reg = _raw_read(S3C2410_GPFDAT);gpio_no = irq_no;}else{reg = raw_readl(S3C2410_GPGDAT);gpio_no = irq_no - 8; //此处减8的含义???}if(reg&(1<gpio_no))return 0;elsereturn 1; //return 的返回值0和1有什么区别????}
查看完整描述

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; //按键被按下了噢~~~
}



查看完整回答
反对 回复 2022-10-06
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

irq_on是怎么定义的? 来个完整代码吧。 return的值就是告诉调用者程序运行的情况

查看完整回答
反对 回复 2022-10-06
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信