OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9716|回复: 7

按键扫描

[复制链接]

51

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2012-5-20
在线时间
0 小时
发表于 2012-5-24 07:31:42 | 显示全部楼层 |阅读模式
u8 KEY_Scan(void)
{  
 static u8 key_up=1;//按键按松开标志 
 JTAG_Set(JTAG_SWD_DISABLE);
 if(key_up&&(KEY0==0||KEY1==0||KEY2==1))
 {
  delay_ms(10);//去抖动 
  key_up=0;
  if(KEY0==0)
  {
   JTAG_Set(SWD_ENABLE);
   return 1;
  }else if(KEY1==0)
  {
   JTAG_Set(SWD_ENABLE);
   return 2;
  }else if(KEY2==1)
  {
   JTAG_Set (SWD_ENABLE);
   return 3;
  }
  }else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;       
 JTAG_Set(SWD_ENABLE);
 return 0;// 无按键按下

1、这里的u8 KEY_Scan(void) 定义无返回值,那么IF语句内的return=0/1/2/3 还有什么作用呢,我在书中看到的解释是对于不带回值的函数,应当用“void”定义为无类型,这样,系统就保证不使函数带回任何值,即禁止在调用的函数中使用被调用函数的返回值。此时在函数体中不得出现有返回值的return语句。
2、另外没看出key_up松开标志在程序中的作用(难道是防止出现有其他按键同时按的影响,而导致没有优先级),请指教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-4-29
在线时间
0 小时
发表于 2012-5-24 08:39:10 | 显示全部楼层
u8 不就是返回一个8位的 无符号值吗?
1.环保数采仪监控系统?2.物联网、管网监控系统?3.水文水利监控系统?4.油烟在线监控系统.?5.智能小区水电表监控系统.?提供各种自动化监控解决方案!?有需要请联系,QQ 237324479!
回复 支持 反对

使用道具 举报

0

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-4-29
在线时间
0 小时
发表于 2012-5-24 08:40:40 | 显示全部楼层
key_up  在if(key_up&&(KEY0==0||KEY1==0||KEY2==1)) 中不就用到了, 就是如果有按键按下了, 就不进行键盘的扫描,这不就对了
1.环保数采仪监控系统?2.物联网、管网监控系统?3.水文水利监控系统?4.油烟在线监控系统.?5.智能小区水电表监控系统.?提供各种自动化监控解决方案!?有需要请联系,QQ 237324479!
回复 支持 反对

使用道具 举报

51

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2012-5-20
在线时间
0 小时
 楼主| 发表于 2012-5-24 08:45:37 | 显示全部楼层
回复【3楼】MartinARM:
---------------------------------
key_up  在if(key_up&&(KEY0==0||KEY1==0||KEY2==1)) 中写的是key_up=1,那么我感觉着个没必要呢,因为当再次进入key_scan时static u8 key_up=1;不又重新赋值为1了吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-24 09:02:31 | 显示全部楼层
回复【4楼】beisiqiu:
---------------------------------
静态变量,不会重新赋值!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
发表于 2012-5-24 09:06:12 | 显示全部楼层
回复【4楼】beisiqiu:
---------------------------------
有用,key_up不为1的话就进不去循环了,在循环里面把它清零。书上不是说按键按一次要松开吗?就是这么实现的,LZ可以顺着程序理一理思路^_^(前几天我也纠结了好久,经别人指点才想通的,感觉编程好难的说,不知道怎么用程序去描述一种现象……)
STM32好难……
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
发表于 2012-5-24 09:07:24 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
发帖的时候还没看见原子前辈的回复,小弟是要回复LZ的……
STM32好难……
回复 支持 反对

使用道具 举报

51

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2012-5-20
在线时间
0 小时
 楼主| 发表于 2012-5-24 10:05:23 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子师兄说的懂了
有一个地方有个疑问,求您指教
u8 KEY_Scan(void) 
{   
 static u8 key_up=1;//按键按松开标志  
 JTAG_Set(JTAG_SWD_DISABLE); 
 if(key_up&&(KEY0==0||KEY1==0||KEY2==1)) 
 { 
  delay_ms(10);//去抖动  
  key_up=0; 
  if(KEY0==0) 
  { 
   JTAG_Set(SWD_ENABLE); 
   return 1; 
  }else if(KEY1==0) 
  { 
   JTAG_Set(SWD_ENABLE); 
   return 2; 
  }else if(KEY2==1) 
  { 
   JTAG_Set (SWD_ENABLE); 
   return 3; 
  } 
  }else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;        
 JTAG_Set(SWD_ENABLE); 
 return 0;// 无按键按下 

假设现在是key0按下,那么
if(KEY0==0) 
  { 
   JTAG_Set(SWD_ENABLE); 
   return 1; 
  }
执行完以后,返回一个1,但是程序还要继续执行啊,继续执行
 JTAG_Set(SWD_ENABLE); 
 return 0;// 无按键按下 
此时不就又返回一个0吗?(不知道是我哪理解错了,求指教)
我认为改为这样是对的,但是调试后不对,不知道为什么是哪理解错了。
else if(KEY0==1&&KEY1==1&&KEY2==0)
   {
   key_up=1;     
   JTAG_Set(SWD_ENABLE);
   return 0;// 无按键按?
   }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 01:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表