共2条
1/1 1 跳转至页
EasyARM2131 EasyARM2131的键盘查询?
问
在EasyARM2131开发板上,我做键盘的查询:
先定义宏:
#define KEY1 (1<<16) // P0.16
#define KEY2 (1<<17) // P0.17
#define KEY3 (1<<18)
#define KEY4 (1<<19)
#define KEY5 (1<<20)
#define KEY6 (1<<21)
#define KEY (0x3f<<16)
在查询的程序里这么写:
R=((!IO0PIN) &KEY);
switch (R)
{
case KEY1:
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//等按键松开
……
}
break;
}
为什么不行啊。就是没反应,观察R的值,居然是0!
答 1: 跳线和配置如何???void KeyTask (void) __task {
KeyInit();
for (;;) {
if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
os_evt_set (0x0001, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
os_evt_set (0x8001, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY2))) && (IOPIN1 & (1 << LED2))) {//有KEY2键压下且LED未亮
os_evt_set (0x0002, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY2)) && (!(IOPIN1 & (1 << LED2)))){//无KEY2键压下且LED在亮
os_evt_set (0x8002, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
os_evt_set (0x0003, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
os_evt_set (0x8003, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY4))) && (IOPIN1 & (1 << LED4))) {//有KEY4键压下且LED未亮
os_evt_set (0x0004, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY4)) && (!(IOPIN1 & (1 << LED4)))){//无KEY4键压下且LED在亮
os_evt_set (0x8004, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
os_evt_set (0x0005, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
os_evt_set (0x8005, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
os_evt_set (0x0006, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
os_evt_set (0x8006, Led_Task);//
}
os_dly_wait (2);//延时20mS
}
}
void LedTask (void) __task {
OS_RESULT result;
unsigned int i;
LedInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: IOCLR1 = (1 << LED1);//点亮LED1
break;
case 0x0002: IOCLR1 = (1 << LED2);//点亮LED2
break;
case 0x0003: IOCLR1 = (1 << LED3);//点亮LED3
break;
case 0x0004: IOCLR1 = (1 << LED4);//点亮LED4
break;
case 0x0005: IOCLR1 = (1 << LED5);//点亮LED5
break;
case 0x0006: IOCLR1 = (1 << LED6);//点亮LED6
break;
case 0x8001: IOSET1 = (1 << LED1);//关掉LED1
break;
case 0x8002: IOSET1 = (1 << LED2);//关掉LED2
break;
case 0x8003: IOSET1 = (1 << LED3);//关掉LED3
break;
case 0x8004: IOSET1 = (1 << LED4);//关掉LED4
break;
case 0x8005: IOSET1 = (1 << LED5);//关掉LED5
break;
case 0x8006: IOSET1 = (1 << LED6);//关掉LED6
break;
}
os_evt_set (i, Beep_Task);//开关BEEP
os_evt_set (i, Lednum_Task);//开关Lednum
}
os_dly_wait (2);//延时20mS
}
} 答 2: ARM水鸟的16个水鸟实习包 答 3: 键盘判断处理程序uint8 (*KeyProTabl[25])()={NoKey,Key0,Key1,Key2,Key3,Key4,Key5,Key6,Key7,Key8,Key9,Keydian,OK,Resetsystem,Cheliang,Biaoding,NoShiZhong,LeftShiZhong,RightShizhog,Memory, SelfTest,InputParameter,SaveData,ReadData,SystemBackup};
/***
****************************************************************************
* 名称:GetKey()
* 功能:键盘判断处理程序
* 入口参数:
* 出口参数:返回值为此键的处理函数在键盘处理函数指针数组的位置
****************************************************************************
***/
uint8 GetKey(void)
{
uint32 i;
IO0CLR=Key_Type; //使列扫描信号为全为0
Key_value1=(IO0PIN>>8)&0X7;
if (Key_value1!=0x07) //先判断是否有键按下不等于0X07表明有键按下
{
for (i=0;i<80000;i++); //延时去颤
Key_value=(IO0PIN>>8)&0X7; //再次判断是不是干扰
if (Key_value == Key_value1) //确实有键按下而不是干扰
{
IO0SET=Key_Type; //开始扫描键盘
for ( i=0; i<8; i++)
{
IO0CLR=1<<i; //行扫描信号
Key_value=(IO0PIN>>8)&0X7; //读行值
if ( Key_value!=0x07)
break;
IO0SET=Key_Type; //恢复列信号为高为下一次扫描做准备
} //end of for
Key=(Key_value<<8)|(0XFF&(~(1<<i))); //得到键码
//IO0CLR=Key_Type;
while ((IO0PIN & 0X0000007ff)==Key); //等待按键放开
for (i=0;i<24;i++) //查取按键在按键处理程序的数组元素位置
if ( Key==Key_Tble[i] )
{
return i+1; //返回按键所对应的在按键处理程序的数组元素位置
} //end of if
} //end of if
} //end of if
return 0; //没有键按下时返回0
}
答 4: 如果菜农的水鸟包能在ADS下就好了唉,就这个小的键盘扫描搞了一天也没搞定,最后还是用if嵌套,不用witch case,就好了。真不知为什么,,,,, 答 5: 你就是打死水鸟也不会用ADS的... 答 6: 改成R=((~IO0PIN) &KEY);或R=((IO0PIN ^ KEY) &KEY);调试技术一定要"过硬",一种方法不行就用其他的替换.
再可R=((IO0PIN ^ 0xfffffff) &KEY);
一般数据要取反而不能逻辑非.
再:KEY等的定义个人认为不好... 答 7: hotpower
我试了你上面的所有方法还是不行!我改成:
if((IO0PIN&KEY1) == 0) //如KEY1按下,则向上位机发送一串实验字符
{
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//当按键松开下
}
}
else
就没问题了。不知道为什么会这样。hotpower你还有别的办法吗?
另:1、LPC213XDEF.H(情人节修正版)应该怎么用呢,这个头文件是替换ZLG的启 动代码里的哪个文件的?
2、你的blog里的好冬冬真的很多,我要系统的学习一下。 答 8: 我真让上善若水给气晕了!!!R=((!IO0PIN) &KEY);
switch (R)
{
case KEY1:
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//等按键松开
……
}
break;
}
上面的写法允许多键压下.
#define KEY1 (1<<16) // P0.16
#define KEY2 (1<<17) // P0.17
#define KEY3 (1<<18)
#define KEY4 (1<<19)
#define KEY5 (1<<20)
#define KEY6 (1<<21)
#define KEY (0x3f<<16)
KEY表明你最多要6个键(16~21)(0b00000000001111110000000000000000)
故2^6=64.
即有case 0~case63...
你只取压下的6个,却放跑了58个可能的组合!!!
不管任何情况下,switch肯定要运行的.
所以,应该用switch+case+default捕捉错误,就如同if+elseif+else一样捕捉错误
所以,你就产生了if行,switch不行的苦恼....
像键盘之类很好用软件仿真的,在程序构造,一般不要加入太多及复杂的实践处理...
等框架运行好后,再一个一个加入...当然也可分别做,直到最后在连接...
否则,把你栓着没商量... 答 9: Hotpower 息怒^_^我又试了几次,
我把R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了,我加上了default:break;但是我取掉它还是可以。你说的没错,你只取压下的6个,却放跑了58个可能的组合,但是,既然我触发了按键,switch运行到那里就应该有相应的动作啊。
答 10: 我更气晕过劲了---干脆把ADS编译器"砸了"解气R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了
我晕菜!!!
我认为
R=((~IO0PIN) &KEY);与R=((IO0PIN ^ 0xffffffff) &KEY);等值
因为KEY中有6个1 (00000000 00111111 00000000 00000000)
所以,IO0PIN ^ (xxxxxxxx xxpppppp xxxxxxxx xxxxxxxx)都对!!!
其中x为无关项,p是实测管脚位值.
我晕到了!!! &KEY实际已过滤了其他58个引脚.
都到现在你也不愿弃暗投明???
晕到~~~非让我"宣布非Keil免谈"吗??? 答 11: 我也荤了我又试了5次,的的确确就是出在取反和异或上,R=((!IO0PIN) &KEY)不行,改成R=((IO0PIN ^ 0xfffffff) &KEY);就可以了。下次在做程序时,我决定改用KEIL,因为好像深入研究KEIL的人远远多于搞ADS的。这次的嘛,已经做完了。 答 12: 期待关注一下 答 13: 问题所在!在ARM群里几个热心朋友的帮助下,最终本质的问题已经找到了。
R=((!IO0PIN) &KEY); R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);中只有第一个是不行的!‘!’运算为逻辑非,(!IO0PIN)的值只有两个,0或者1,它的值再与KEY相与不出错才怪的。而~是按位取反,效果和^ 0xfffffff是相同的。
谢谢大家。
答 14: 我试过程序了。我调试过了程序,
R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);
是对的。
有的朋友没有理解端口的实况定义含义。 答 15: d关注一下
先定义宏:
#define KEY1 (1<<16) // P0.16
#define KEY2 (1<<17) // P0.17
#define KEY3 (1<<18)
#define KEY4 (1<<19)
#define KEY5 (1<<20)
#define KEY6 (1<<21)
#define KEY (0x3f<<16)
在查询的程序里这么写:
R=((!IO0PIN) &KEY);
switch (R)
{
case KEY1:
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//等按键松开
……
}
break;
}
为什么不行啊。就是没反应,观察R的值,居然是0!
答 1: 跳线和配置如何???void KeyTask (void) __task {
KeyInit();
for (;;) {
if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
os_evt_set (0x0001, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
os_evt_set (0x8001, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY2))) && (IOPIN1 & (1 << LED2))) {//有KEY2键压下且LED未亮
os_evt_set (0x0002, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY2)) && (!(IOPIN1 & (1 << LED2)))){//无KEY2键压下且LED在亮
os_evt_set (0x8002, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
os_evt_set (0x0003, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
os_evt_set (0x8003, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY4))) && (IOPIN1 & (1 << LED4))) {//有KEY4键压下且LED未亮
os_evt_set (0x0004, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY4)) && (!(IOPIN1 & (1 << LED4)))){//无KEY4键压下且LED在亮
os_evt_set (0x8004, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
os_evt_set (0x0005, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
os_evt_set (0x8005, Led_Task);//
}
if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
os_evt_set (0x0006, Led_Task);//
}
else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
os_evt_set (0x8006, Led_Task);//
}
os_dly_wait (2);//延时20mS
}
}
void LedTask (void) __task {
OS_RESULT result;
unsigned int i;
LedInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: IOCLR1 = (1 << LED1);//点亮LED1
break;
case 0x0002: IOCLR1 = (1 << LED2);//点亮LED2
break;
case 0x0003: IOCLR1 = (1 << LED3);//点亮LED3
break;
case 0x0004: IOCLR1 = (1 << LED4);//点亮LED4
break;
case 0x0005: IOCLR1 = (1 << LED5);//点亮LED5
break;
case 0x0006: IOCLR1 = (1 << LED6);//点亮LED6
break;
case 0x8001: IOSET1 = (1 << LED1);//关掉LED1
break;
case 0x8002: IOSET1 = (1 << LED2);//关掉LED2
break;
case 0x8003: IOSET1 = (1 << LED3);//关掉LED3
break;
case 0x8004: IOSET1 = (1 << LED4);//关掉LED4
break;
case 0x8005: IOSET1 = (1 << LED5);//关掉LED5
break;
case 0x8006: IOSET1 = (1 << LED6);//关掉LED6
break;
}
os_evt_set (i, Beep_Task);//开关BEEP
os_evt_set (i, Lednum_Task);//开关Lednum
}
os_dly_wait (2);//延时20mS
}
} 答 2: ARM水鸟的16个水鸟实习包 答 3: 键盘判断处理程序uint8 (*KeyProTabl[25])()={NoKey,Key0,Key1,Key2,Key3,Key4,Key5,Key6,Key7,Key8,Key9,Keydian,OK,Resetsystem,Cheliang,Biaoding,NoShiZhong,LeftShiZhong,RightShizhog,Memory, SelfTest,InputParameter,SaveData,ReadData,SystemBackup};
/***
****************************************************************************
* 名称:GetKey()
* 功能:键盘判断处理程序
* 入口参数:
* 出口参数:返回值为此键的处理函数在键盘处理函数指针数组的位置
****************************************************************************
***/
uint8 GetKey(void)
{
uint32 i;
IO0CLR=Key_Type; //使列扫描信号为全为0
Key_value1=(IO0PIN>>8)&0X7;
if (Key_value1!=0x07) //先判断是否有键按下不等于0X07表明有键按下
{
for (i=0;i<80000;i++); //延时去颤
Key_value=(IO0PIN>>8)&0X7; //再次判断是不是干扰
if (Key_value == Key_value1) //确实有键按下而不是干扰
{
IO0SET=Key_Type; //开始扫描键盘
for ( i=0; i<8; i++)
{
IO0CLR=1<<i; //行扫描信号
Key_value=(IO0PIN>>8)&0X7; //读行值
if ( Key_value!=0x07)
break;
IO0SET=Key_Type; //恢复列信号为高为下一次扫描做准备
} //end of for
Key=(Key_value<<8)|(0XFF&(~(1<<i))); //得到键码
//IO0CLR=Key_Type;
while ((IO0PIN & 0X0000007ff)==Key); //等待按键放开
for (i=0;i<24;i++) //查取按键在按键处理程序的数组元素位置
if ( Key==Key_Tble[i] )
{
return i+1; //返回按键所对应的在按键处理程序的数组元素位置
} //end of if
} //end of if
} //end of if
return 0; //没有键按下时返回0
}
答 4: 如果菜农的水鸟包能在ADS下就好了唉,就这个小的键盘扫描搞了一天也没搞定,最后还是用if嵌套,不用witch case,就好了。真不知为什么,,,,, 答 5: 你就是打死水鸟也不会用ADS的... 答 6: 改成R=((~IO0PIN) &KEY);或R=((IO0PIN ^ KEY) &KEY);调试技术一定要"过硬",一种方法不行就用其他的替换.
再可R=((IO0PIN ^ 0xfffffff) &KEY);
一般数据要取反而不能逻辑非.
再:KEY等的定义个人认为不好... 答 7: hotpower
我试了你上面的所有方法还是不行!我改成:
if((IO0PIN&KEY1) == 0) //如KEY1按下,则向上位机发送一串实验字符
{
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//当按键松开下
}
}
else
就没问题了。不知道为什么会这样。hotpower你还有别的办法吗?
另:1、LPC213XDEF.H(情人节修正版)应该怎么用呢,这个头文件是替换ZLG的启 动代码里的哪个文件的?
2、你的blog里的好冬冬真的很多,我要系统的学习一下。 答 8: 我真让上善若水给气晕了!!!R=((!IO0PIN) &KEY);
switch (R)
{
case KEY1:
DelayNS(1); //软件延时,去抖动
if((IO0PIN&KEY1) == 0)
{
while((IO0PIN&KEY1) == 0);//等按键松开
……
}
break;
}
上面的写法允许多键压下.
#define KEY1 (1<<16) // P0.16
#define KEY2 (1<<17) // P0.17
#define KEY3 (1<<18)
#define KEY4 (1<<19)
#define KEY5 (1<<20)
#define KEY6 (1<<21)
#define KEY (0x3f<<16)
KEY表明你最多要6个键(16~21)(0b00000000001111110000000000000000)
故2^6=64.
即有case 0~case63...
你只取压下的6个,却放跑了58个可能的组合!!!
不管任何情况下,switch肯定要运行的.
所以,应该用switch+case+default捕捉错误,就如同if+elseif+else一样捕捉错误
所以,你就产生了if行,switch不行的苦恼....
像键盘之类很好用软件仿真的,在程序构造,一般不要加入太多及复杂的实践处理...
等框架运行好后,再一个一个加入...当然也可分别做,直到最后在连接...
否则,把你栓着没商量... 答 9: Hotpower 息怒^_^我又试了几次,
我把R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了,我加上了default:break;但是我取掉它还是可以。你说的没错,你只取压下的6个,却放跑了58个可能的组合,但是,既然我触发了按键,switch运行到那里就应该有相应的动作啊。
答 10: 我更气晕过劲了---干脆把ADS编译器"砸了"解气R=((!IO0PIN) &KEY);改成R=((IO0PIN ^ 0xfffffff) &KEY);最后成功了
我晕菜!!!
我认为
R=((~IO0PIN) &KEY);与R=((IO0PIN ^ 0xffffffff) &KEY);等值
因为KEY中有6个1 (00000000 00111111 00000000 00000000)
所以,IO0PIN ^ (xxxxxxxx xxpppppp xxxxxxxx xxxxxxxx)都对!!!
其中x为无关项,p是实测管脚位值.
我晕到了!!! &KEY实际已过滤了其他58个引脚.
都到现在你也不愿弃暗投明???
晕到~~~非让我"宣布非Keil免谈"吗??? 答 11: 我也荤了我又试了5次,的的确确就是出在取反和异或上,R=((!IO0PIN) &KEY)不行,改成R=((IO0PIN ^ 0xfffffff) &KEY);就可以了。下次在做程序时,我决定改用KEIL,因为好像深入研究KEIL的人远远多于搞ADS的。这次的嘛,已经做完了。 答 12: 期待关注一下 答 13: 问题所在!在ARM群里几个热心朋友的帮助下,最终本质的问题已经找到了。
R=((!IO0PIN) &KEY); R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);中只有第一个是不行的!‘!’运算为逻辑非,(!IO0PIN)的值只有两个,0或者1,它的值再与KEY相与不出错才怪的。而~是按位取反,效果和^ 0xfffffff是相同的。
谢谢大家。
答 14: 我试过程序了。我调试过了程序,
R=((IO0PIN ^ 0xfffffff) &KEY); R=((~IO0PIN) &KEY);
是对的。
有的朋友没有理解端口的实况定义含义。 答 15: d关注一下
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |