极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16445|回复: 7

关于中断 按键的疑问?

[复制链接]
发表于 2016-3-24 21:29:56 | 显示全部楼层 |阅读模式
想做这么一个程序,达到以下目的。

有红灯,绿灯各一个
按钮A ,B ,C各一个,

程序启动
1.灯不亮
2.按下C键,红灯闪烁,再按C键无动作
3.按下A键,红灯常亮,要一按下A键立即切换(用中断实现吗?)
4.按下B键,还原到步骤1循环。

可增加
按下C键后,按B键到步骤1.

研究了好久都没法实现,请各位大神指教!!
回复

使用道具 举报

发表于 2016-3-24 22:32:48 | 显示全部楼层
不用中断应该也能实现,但好像没有绿灯什么事~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-24 23:32:34 | 显示全部楼层
janeasy 发表于 2016-3-24 22:32
不用中断应该也能实现,但好像没有绿灯什么事~

哈哈哈 打漏了!!

想做这么一个程序,达到以下目的。

有红灯,绿灯各一个
按钮A ,B ,C各一个,

程序启动
1.灯不亮
2.按下C键,红灯闪烁,再按C键无动作
3.按下A键,红灯常亮,要一按下A键立即切换(用中断实现吗?)
4.再按下C键,红灯灭,绿灯亮。
5.按下B键,回到步骤1循环。



研究了好久都没法实现,请各位大神指教!!
回复 支持 反对

使用道具 举报

发表于 2016-3-25 11:22:17 | 显示全部楼层
//红灯6,绿7,按键ABC,依次8,9,10

  1. bool isBtnPressed[3]={0,0,0},isBtnCAC =0; //按C后按A标记
  2. byte delayTimes=0;  //闪烁计数
  3. int FlashDelay=500; //闪烁间隔时间(ms)

  4. void setup() {
  5.   for(byte i=6;i<11;i++){
  6.     pinMode(i,INPUT);
  7.     if (i<8) pinMode(i,OUTPUT);
  8.   }
  9. }

  10. void loop() {//B键后 数据清零
  11.   if (isBtnPressed[1]) {
  12.     for(byte i=0;i<3;i++){
  13.       isBtnPressed[i]=0;
  14.       if (i>0)digitalWrite(i+5,LOW);
  15.     }
  16.     isBtnCAC =0;
  17.   } // C A C键 关红亮绿
  18.   else if (isBtnPressed[2] && isBtnPressed[0] && isBtnCAC){
  19.     digitalWrite(7,HIGH);
  20.     digitalWrite(6,LOW);
  21.   }
  22.   else if ((isBtnPressed[2] && !delayTimes)|| isBtnPressed[0]) {
  23.     digitalWrite(6,!digitalRead(6) | isBtnPressed[0]);  //闪烁或常亮
  24.     isBtnCAC=isBtnPressed[2] && isBtnPressed[0];  //按C后A,标志
  25.     isBtnPressed[2]=!(isBtnPressed[2] && isBtnPressed[0]);  //按C后A,清除C标志                                                
  26.   }
  27.   // 读取按键
  28.   for(byte i=0; i<3;i++){
  29.     if (digitalRead(i+8)){  //读取按键
  30.       delay(50);
  31.       delayTimes = ++delayTimes % (FlashDelay /50);   //闪烁延时计次
  32.       if (digitalRead(i+8)) isBtnPressed[i]=1;
  33.     }
  34.   }
  35.   delay(50);
  36.   delayTimes = ++delayTimes % (FlashDelay /50);  //闪烁延时计次
  37. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-31 11:35:40 | 显示全部楼层
本帖最后由 dovechan 于 2016-3-31 11:41 编辑
janeasy 发表于 2016-3-25 11:22
//红灯6,绿7,按键ABC,依次8,9,10

bool isBtnPressed[3]={0,0,0},isBtnCAC =0; //按C后按A标记


非常感激!!对我很有帮助!!
试了一下,能实现原本设想的功能。
但是步骤4,按下C键,红灯灭,绿灯亮,这一步也是要求立即切换可以实现吗?
因为根据您写的程序,我试了一下,步骤4按下C键,有时不能立刻切换,要再按几次。
设想是需要立刻切换的,帖子没写清楚,抱歉!
能麻烦您为我修改一下吗??
回复 支持 反对

使用道具 举报

发表于 2016-3-31 15:00:04 | 显示全部楼层
本帖最后由 janeasy 于 2016-4-1 18:19 编辑
dovechan 发表于 2016-3-31 11:35
非常感激!!对我很有帮助!!
试了一下,能实现原本设想的功能。
但是步骤4,按下C键,红灯灭,绿灯 ...


测试了一下,逻辑上有个错误,正好在熟悉位运算就改了一下

  1. byte delayTimes=0, BtnPressed=0; //闪烁计数 // 按键ABC对应 1-3 位,4位CA键标记,7、8位 led状态
  2. int FlashDelay=500; //闪烁间隔时间(ms),50的整数倍

  3. void setup() {
  4.   for(byte i=6;i<11;i++){
  5.     pinMode(i,INPUT);
  6.     if (i<8) pinMode(i,OUTPUT);
  7.   }
  8.   Serial.begin(9600);
  9. }
  10. void loop() {//B键后 数据清零
  11.   if (BtnPressed >> 1 & 1)  BtnPressed=0;  //B键清零
  12.   if (BtnPressed & 1 && BtnPressed >>2 &1){  //A 和 C按键处理 // 下一行:清除led状态 | 绿灯 | 红灯 | CAC键标记
  13.       BtnPressed = BtnPressed & 0x3f | (BtnPressed >> 3 & 1) << 7 | !(BtnPressed >> 3 & 1)<< 6 | 8;
  14.       if (BtnPressed >>3) BtnPressed= BtnPressed & 0xfb;  //按C后A,清除C标记
  15.   }else if ((!delayTimes && BtnPressed >>2 &1) || BtnPressed == 1)
  16.       BtnPressed = BtnPressed & 0xbf | (!digitalRead(6) | BtnPressed & 1) << 6;  //清除红灯状态 | 闪烁 | 常亮
  17.   digitalWrite(6,BtnPressed >> 6 & 1); 第六位状态
  18.   digitalWrite(7,BtnPressed >> 7 & 1); 第七位状态
  19.   // 读取按键
  20.   for(byte i=0; i<3;i++){
  21.     if (digitalRead(i+8)){  //读取按键
  22.       delay(50);
  23.       delayTimes = ++delayTimes % (FlashDelay /50);   //闪烁延时计次
  24.       if (digitalRead(i+8)){
  25.         BtnPressed = BtnPressed | (1<< i);
  26.         // 按键状态调试输出
  27.        break;
  28.       }
  29.     }
  30.   }
  31.   delay(50);
  32.   delayTimes = ++delayTimes % (FlashDelay /50);  //闪烁延时计次
  33. }
复制代码


这部分可以用来输出按键状态,放在上面调试输出的位置,没啥问题可以不用
  1. Serial.print("KeyStatus:");
  2. for(byte j=0;j<4;j++)
  3.    Serial.print(BtnPressed >> (3-j) & 1);
  4. Serial.println();
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-1 20:50:27 | 显示全部楼层
janeasy 发表于 2016-3-31 15:00
测试了一下,逻辑上有个错误,正好在熟悉位运算就改了一下

byte delayTimes=0, BtnPressed=0; //闪烁 ...

有错误信息提示,不能编译

Arduino:1.6.7 (Windows 10), 开发板:"Arduino/Genuino Uno"

sketch_apr01a:18: error: stray '\265' in program

   digitalWrite(6,BtnPressed >> 6 & 1); 第六位状态

   ^

sketch_apr01a:18: error: stray '\332' in program

sketch_apr01a:18: error: stray '\301' in program

sketch_apr01a:18: error: stray '\371' in program

sketch_apr01a:18: error: stray '\316' in program

sketch_apr01a:18: error: stray '\273' in program

sketch_apr01a:18: error: stray '\327' in program

sketch_apr01a:18: error: stray '\264' in program

sketch_apr01a:18: error: stray '\314' in program

sketch_apr01a:18: error: stray '\254' in program

sketch_apr01a:19: error: stray '\265' in program

   digitalWrite(7,BtnPressed >> 7 & 1); 第七位状态

   ^

sketch_apr01a:19: error: stray '\332' in program

sketch_apr01a:19: error: stray '\306' in program

sketch_apr01a:19: error: stray '\337' in program

sketch_apr01a:19: error: stray '\316' in program

sketch_apr01a:19: error: stray '\273' in program

sketch_apr01a:19: error: stray '\327' in program

sketch_apr01a:19: error: stray '\264' in program

sketch_apr01a:19: error: stray '\314' in program

sketch_apr01a:19: error: stray '\254' in program

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino: In function 'void loop()':

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino:14:31: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]

       BtnPressed = BtnPressed & 0x3f | (BtnPressed >> 3 & 1) << 7 | !(BtnPressed >> 3 & 1)<< 6 | 8;

                               ^

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino:17:70: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]

       BtnPressed = BtnPressed & 0xbf | (!digitalRead(6) | BtnPressed & 1) << 6;  //清除红灯状态 | 闪烁 | 常亮

                                                                      ^

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino:17:31: warning: suggest parentheses around arithmetic in operand of '|' [-Wparentheses]

       BtnPressed = BtnPressed & 0xbf | (!digitalRead(6) | BtnPressed & 1) << 6;  //清除红灯状态 | 闪烁 | 常亮

                               ^

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino:24:51: warning: operation on 'delayTimes' may be undefined [-Wsequence-point]

       delayTimes = ++delayTimes % (FlashDelay /50);   //闪烁延时计次

                                                   ^

C:\Users\dove\AppData\Local\Temp\arduino_6ad822af81492744739d797a46934c03\sketch_apr01a.ino:33:47: warning: operation on 'delayTimes' may be undefined [-Wsequence-point]

   delayTimes = ++delayTimes % (FlashDelay /50);  //闪烁延时计次

                                               ^

exit status 1
stray '\265' in program

  报告将会包含更多的信息
  "在编译时,输出详细信息"
  在 文件>首选项 中启用
回复 支持 反对

使用道具 举报

发表于 2016-4-1 21:01:08 | 显示全部楼层
复制后斜线没有了,在第六位和第七位(18,19行)几个黑字前加上//或删除汉字。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-18 12:32 , Processed in 0.045774 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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