设置个标注位,按键翻转标注位,检测标注位决定是否报警。 |
根据上面的建议修改的程序 #include "reg51.h" void delay(unsigned int i); sbit K=P0^0; sbit beep=P1^0; sbit green=P1^1; sbit red=P1^2; unsigned char Flag = 0; void main() { green=0; red=1; while(1) { if(K==0) { while(K==0); Flag = ~Flag; } if(Flag) { green=1; red=0; beep=0; delay(100); red=1; beep=1; } else { green=0; red=1; beep=1; } } } void delay(unsigned int i) { unsigned int k; for(k=0;k<i;k++); } |
rctty 发表于 2022-9-23 17:33 你好,请问能不能帮我写一下具体的程序,初学单片机然后有些还不是很懂,谢谢 |
munuc_w 发表于 2022-9-23 15:12 可不可以写一下具体程序,初学单片机,好多都还不懂 |
rctty 发表于 2022-9-23 16:04 这里的K == 0 改成按下到弹起整个过程的状态,可以通过另一个变量来解决, 比如改成 b == 1, 就有 先判断按下到谈起的状态 if(K == 0)//按钮按下 { while(K == 0);//等待按钮弹起 b = 1; } 当然,这里的while强制等待是不太合适的,这样会卡住单片机的运行,可以通过定时器之类的方法进行改善 |
用一个变量做标识, char a = 1; if(K == 0)//这是检测到按下的状态? { if(a) { a = 0; //报警亮灯代码 // } else { a = 1; //解除报警,灭灯代码 // } } 不过你这个按键识别应该在软件上做一个防抖动滤波 |
可以采用计数的方法,定义一个变量,初始值为0,按一次按键加1,然后判断变量的值,当变量等于1时报警,为2时接触报警,同时清变量。 |