长按双按双击经过16届蓝桥杯的洗礼一次是超声波的袭击还有就是按键了去年没有写出来双按按键今年对此研究了一下对按键进行新的扩展包括长按双击双按等等还有些按键可以在此基础上进行延伸。话不多说下面给大家分享一下我的按键研究比赛临近希望对大家有帮助我学习的按键是西风所以扩展的代码模型也是西风的风格代码源码在最后可以直接下到板子中调试现象文章目录长按双按双击一、按键底层二、长按按键三、双按按键四、双击按键五、代码源码这里出现的变量a是我对每一步按键的验证单击按键a1双击按键a2长按超过两秒a4双按a5一、按键底层1.按键读取函数unsignedcharkey_read(){unsignedcharkey_num0;P440;P42P35P341;if(P330)key_num4;if(P320)key_num5;if(P310)key_num6;if(P300)key_num7;P420;P44P35P341;if(P330)key_num8;if(P320)key_num9;if(P310)key_num10;if(P300)key_num11;P350;P42P44P341;if(P330)key_num12;if(P320)key_num13;if(P310)key_num14;if(P300)key_num15;P340;P42P35P441;if(P330)key_num16;if(P320)key_num17;if(P310)key_num18;if(P300)key_num19;returnkey_num;}2.按键调用voidkey(){if(key_flag)return;key_flag1;key_valkey_read();key_downkey_val(key_val^key_old);key_up~key_val(key_val^key_old);key_oldkey_val;if(key_down4){a1;}}3.按键刷新10ms一次定时器中voidServiceTimer2()interrupt12{if(key_flag10)key_flag0;}二、长按按键1.在第一个底层按键的基础上key()函数中加入以下代码判断当按键5按下时给flag置1用来在定时器里面开始计时else if进行第二次按键判断if((key_down5)(flag0)){flag1;}elseif((key_down5)(flag1)){a2;flag0;}2.在定时器里面判断flag1时开始计时if(flag1){count;if(count1000){count0;flag0;}}三、双按按键1.在第一个底层按键的基础上key()函数中加入以下代码判断按键9按下时开始计时接着判断上一次按键还是9并且长按的时间大于2秒a4注意别忘了计数值和标志位清零if(key_down9){flag_chang1;}if((key_old9)(count_chang2000)){count_chang0;a4;flag_chang0;}if(key_old!9){count_chang0;}2.在定时器里面判断当flag_chang1时开始计数if(flag_chang1){count_chang;}四、双击按键1.这部分超出原本的按键模块我们需要新建函数如下用来返回按键6和按键7的值当两个都按下值为1时才会返回1bits6s7(){bit s6,s7;P440;P42P35P341;s6(P310)?1:0;s7(P300)?1:0;return(s6s7)?1:0;}2.在key()函数中添加以下代码仿照底层的按键部分对我们的s6s7进行同样操作如果key_down_s6s7为真即值为1时发生按键操作key_val_s6s7s6s7();key_down_s6s7key_val_s6s7(key_val_s6s7^key_old_s6s7);key_old_s6s7key_val_s6s7;if(key_down_s6s7){a5;}五、代码源码#includeSTC15F2K60S2.Hunsignedcharsmg_buff[8];unsignedcharsmg_duanma[10]{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsignedcharkey_old,key_down,key_up,key_val;unsignedcharkey_flag;bit flag,flag_chang,flag_a;unsignedintcount,count_chang,count_a;unsignedchara;voidxunaze(unsignedcharY){P2((P20x1f)|(Y5));}voidSMG_Bit(){unsignedcharpos;xunaze(7);P00xff;xunaze(6);P00x01pos;xunaze(7);P0smg_buff[pos];pos(pos1)%8;}voidSMG_Display(){smg_buff[0]smg_duanma[1];smg_buff[1]smg_duanma[1];smg_buff[2]smg_duanma[1];smg_buff[3]smg_duanma[1];smg_buff[4]smg_duanma[1];smg_buff[5]smg_duanma[1];smg_buff[6]smg_duanma[1];smg_buff[7]smg_duanma[a];}voidTimer2Init(void)//1毫秒12.000MHz{AUXR|0x04;//定时器时钟1T模式T2L0x20;//设置定时初始值T2H0xD1;//设置定时初始值AUXR|0x10;//定时器2开始计时IE2|0x04;EA1;}unsignedcharkey_read(){unsignedcharkey_num0;P440;P42P35P341;if(P330)key_num4;if(P320)key_num5;if(P310)key_num6;if(P300)key_num7;P420;P44P35P341;if(P330)key_num8;if(P320)key_num9;if(P310)key_num10;if(P300)key_num11;P350;P42P44P341;if(P330)key_num12;if(P320)key_num13;if(P310)key_num14;if(P300)key_num15;P340;P42P35P441;if(P330)key_num16;if(P320)key_num17;if(P310)key_num18;if(P300)key_num19;returnkey_num;}bits6s7(){bit s6,s7;P440;P42P35P341;s6(P310)?1:0;s7(P300)?1:0;return(s6s7)?1:0;}bits10s11(){bit s10,s11;P420;P44P35P341;s10(P310)?1:0;s11(P300)?1:0;return(s10s11)?1:0;}unsignedcharkey_old_s10s11,key_val_s10s11,key_down_s10s11;unsignedcharkey_old_s6s7,key_val_s6s7,key_down_s6s7;voidkey(){if(key_flag)return;key_flag1;key_valkey_read();key_downkey_val(key_val^key_old);key_up~key_val(key_val^key_old);key_oldkey_val;key_val_s6s7s6s7();key_down_s6s7key_val_s6s7(key_val_s6s7^key_old_s6s7);key_old_s6s7key_val_s6s7;key_val_s10s11s10s11();key_down_s10s11key_val_s10s11(key_val_s10s11^key_old_s10s11);key_old_s10s11key_val_s10s11;if(key_down_s10s11){flag_a1;}if((key_old_s10s11)(count_a1500)){a6;flag_a0;count_a0;}if(key_old_s10s110){count_a0;}if(key_down_s6s7){a5;}if(key_down4){a1;}if((key_down5)(flag0)){flag1;}elseif((key_down5)(flag1)){a2;flag0;}if(key_old8){a3;}if(key_up8){a0;}if(key_down9){flag_chang1;}if((key_old9)(count_chang2000)){count_chang0;a4;flag_chang0;}if(key_old!9){count_chang0;}}voidServiceTimer2()interrupt12{if(key_flag10)key_flag0;if(flag1){count;if(count1000){count0;flag0;}}if(flag_chang1){count_chang;}if(flag_a1){count_a;}SMG_Bit();}voidmain(){Timer2Init();while(1){key();SMG_Display();}}以上是我的学习分享大家遇到什么问题发在评论区一起交流哦欢迎大家多多评论如果有代码语法不对的地方也请指教