关于单片机按键移位的问题,程序如下

#include<reg51.h>#include<intrins.h>unsignedcharscan_key();voidproc_key(unsignedchark... #include <reg51.h>
#include <intrins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit K1 = P0^0; //对应按钮K1
sbit K2 = P0^1; //对应按钮K2
main()
{
unsigned char key_s,key_v;
key_v = 0x03;
P2 = 0xfe;
while(1)
{
key_s = scan_key();
if(key_s != key_v)
{
delayms(10);
key_s = scan_key();
if(key_s != key_v)
{
key_v = key_s;
proc_key(key_v);
}
}
}
}
unsigned char scan_key()
{
unsigned char key_s;
key_s = 0x00;
key_s |= K2;
key_s <<= 1;
key_s |= K1;
return key_s;
}
void proc_key(unsigned char key_v)
{
if((key_v & 0x01) == 0)
{
P2 = _cror_(P2,1);
}
else if((key_v & 0x02) == 0)
{
P2 = _crol_(P2, 1);
}
}
void delayms(unsigned char ms) // 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}

在while循环中,key_v被赋值等于key_s的值,要么是0x01,要么是0x02,在下一次的按键时,如果和上一次的按键相同,怎么能达到if语句的条件?
展开
 我来答
百度网友6eab688
2012-07-27 · TA获得超过4691个赞
知道大有可为答主
回答量:962
采纳率:50%
帮助的人:945万
展开全部
分三种情况,1. 按下, 2. 防抖,3. 抬起
第1和2中,你估计已经明白
然后第3种,当抬起时,由于key_v记录的是按下的值,0x01或0x02,抬起后key_s变为0x03,所以程序会执行proc_key过程,但由于两个条件都未满足,也就是啥也没做就退出来了。现在key_v变成了 0x03,等待下次按下了。
百度网友44d8da7
2012-07-29 · TA获得超过151个赞
知道答主
回答量:198
采纳率:0%
帮助的人:80.6万
展开全部
我也想知道,破任务造就破答案
111111
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式