按键部分程序不理解,请大家帮忙看下
void key_scan(void){
present_key_dig++;
if(present_key_dig>=3900)//延时?
present_key_dig=1;
if(key_down)
return;
if(pre_key_dig!=present_key_dig)
{if(pre_key_dig!=0)return;
else prekey=0; //松手检测?
}
elseif( pre_key_dig==present_key_dig) prekey=1;
if(P3.4&&!P12.2&&!P12.1)
{
keyesc=0;
pre_key_dig=0;
present_key_dig=1;
return;
}
else if( !P3.4&&P12.2&&P12.1)
keyesc=1;
if(keyesc)
{
return; }
else if(!prekey)
{
pre_key_dig=present_key_dig;
return;
}
if(!P3.4)
{
if(debuge_f==0)
{
key_down=1;
debuge_f=1;
on_led=1;
off_led=0;
out_set=0;
}
else
{
debuge_f=0;
key_down=1;
l_move_t=0;
l_move_s=0;
}
}
else if(P12.2&&debuge_f)
{
if(l_move_s>=4)l_move_s=0;
l_move_s++;
debug_s_f=1;
wr_f=1;
debug_t_f=0;
key_down=1;
l_move_t=0;
}
else if(P12.1&&debuge_f)
{
if(l_move_t>=2)l_move_t=0;
l_move_t++;
debug_t_f=1;
debug_s_f=0;
l_move_s=0;
key_down=1;
wr_f=1;
}
keyesc=1; //??
} pre_key_dig keyesc=1表示什么含义,没看明白
void key_scan(void)
{
present_key_dig++;
if(present_key_dig>=3900)//延时?
present_key_dig=1;
if(key_down)
return;
if(pre_key_dig!=present_key_dig)
{if(pre_key_dig!=0)return;
else prekey=0; //松手检测?
}
elseif( pre_key_dig==present_key_dig) prekey=1;
if(P3.4&&!P12.2&&!P12.1)
{
keyesc=0;
pre_key_dig=0;
present_key_dig=1;
return;
}
else if( !P3.4&&P12.2&&P12.1)
keyesc=1;
if(keyesc)
{
return; }
else if(!prekey)
{
pre_key_dig=present_key_dig;
return;
}
if(!P3.4)
{
if(debuge_f==0)
{
key_down=1;
debuge_f=1;
on_led=1;
off_led=0;
out_set=0;
}
else
{
debuge_f=0;
key_down=1;
l_move_t=0;
l_move_s=0;
}
}
else if(P12.2&&debuge_f)
{
if(l_move_s>=4)l_move_s=0;
l_move_s++;
debug_s_f=1;
wr_f=1;
debug_t_f=0;
key_down=1;
l_move_t=0;
}
else if(P12.1&&debuge_f)
{
if(l_move_t>=2)l_move_t=0;
l_move_t++;
debug_t_f=1;
debug_s_f=0;
l_move_s=0;
key_down=1;
wr_f=1;
}
keyesc=1; //??
} 重新排版了下, 小声的问下,这是什么CPU?还有P12? 写的很分散,也繁琐,帮你整理了一下。
void key_scan(void){
present_key_dig++;
if(present_key_dig>=3900)present_key_dig=1; //延时?
if(key_down)return;
if(pre_key_dig!=present_key_dig){
if(pre_key_dig!=0)return;else prekey=0; //松手检测?
}else if( pre_key_dig==present_key_dig) prekey=1;
if(P3.4&&!P12.2&&!P12.1){
keyesc=0;
pre_key_dig=0;
present_key_dig=1;
return;
}else if( !P3.4&&P12.2&&P12.1) keyesc=1;
if(keyesc){
return;
}else if(!prekey){
pre_key_dig=present_key_dig;
return;
}
if(!P3.4){
if(debuge_f==0){
key_down=1;
debuge_f=1;
on_led=1;
off_led=0;
out_set=0;
}else{
debuge_f=0;
key_down=1;
l_move_t=0;
l_move_s=0;
}
}else if(P12.2&&debuge_f){
if(l_move_s>=4)l_move_s=0;
l_move_s++;
debug_s_f=1;
wr_f=1;
debug_t_f=0;
key_down=1;
l_move_t=0;
}else if(P12.1&&debuge_f){
if(l_move_t>=2)l_move_t=0;
l_move_t++;
debug_t_f=1;
debug_s_f=0;
l_move_s=0;
key_down=1;
wr_f=1;
}
keyesc=1; //
}
三个IO是接三个按键?为何有低有效,有高有效?KEY_DOWN在被=1后,没地方=0。
前边有个不等于,这里pre_key_dig==present_key_dig再==有意思?
xiaobendan 发表于 2018-1-11 16:18
写的很分散,也繁琐,帮你整理了一下。
三个IO是接三个按键?为何有低有效,有高有效?KEY_DOWN在被=1后, ...
KEY_DOWN应该是个标志,等待后面的按键处理程序识别后清零,pre_key_dig估计也是个标志,外面的程序处理完后就置1,避免按键还没松开程序又去处理一次,程序里使用了大量外部标志,可读性和通用性极差,lz没必要借鉴 kcfoo1 发表于 2018-1-12 15:00
KEY_DOWN应该是个标志,等待后面的按键处理程序识别后清零,pre_key_dig估计也是个标志,外面的程序处理 ...
是,可读性不太好
楼主还是参考一下以前那个老师发的状态机的方法比较好 楼主,你的程序可读性真不太好啊,没有注释,大家没动力帮你分析啊{:lol:} xiaobendan 发表于 2018-1-12 16:00
是,可读性不太好
楼主还是参考一下以前那个老师发的状态机的方法比较好 ...
哪个老师发的状态机啊?
关键字是什么,我也学习下状态机,谢谢! 这个按键程序看得真叫人蛋疼,,,实在是想不通要实现什么按键功能、把代码写的如此复杂? NFC 发表于 2018-1-12 16:39
哪个老师发的状态机啊?
关键字是什么,我也学习下状态机,谢谢!
上次发帖一下忘了老师姓啥了,马老师啊,老前辈了。果然人到40往后脑子 不行了。
搜索状态机按键,有很多可以参考的东西啊
xiaobendan 发表于 2018-1-12 17:50
上次发帖一下忘了老师姓啥了,马老师啊,老前辈了。果然人到40往后脑子 不行了。
搜索状态机按键,有很多 ...
感谢。我写按键程序也和楼主差不多,只是可读性强一些。总是把按键功能写在按键里面,显得很混乱,也学习下状态机。 好的,我去参考参考,搜索下, 这样的代码没有看的必要
页:
[1]