蓝桥杯单片机按键进阶
蓝桥杯单片机按键进阶
——基于柳离风老师模板及按键进阶教程
文章目录
- 蓝桥杯单片机按键进阶
- 1、按键测试-按下生效
- 2、按键进阶-松手生效
- 3、按键进阶-按键禁用(未完待续)
1、按键测试-按下生效
key.c
#include "key.h"/*** @brief 独立按键扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan1(void)
{uchar key = 0; //按键值static bit key_up = 1; //按键松开标志,1松开0按下if((key_up == 1) && (P30 == 0 || P31 == 0 || P32 == 0 || P33 == 0)){key_up = 0;if(P30 == 0) key = 7;else if(P31 == 0) key = 6;else if(P32 == 0) key = 5;else if(P33 == 0) key = 4;return key;}else if(P30 == 1 && P31 == 1 && P32 == 1 && P33 == 1)key_up = 1;return 0;
}/*** @brief 矩阵键盘扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan2(void)
{uchar key = 0; //按键值static bit key_up = 1; //按键松开标志,1松开0按下P44 = P42 = 1; //列扫描P32 = P33 = 0;if((key_up == 1)&&(P44 == 0 || P42 == 0)){if(P44 == 0) key = 7;else if(P42 == 0) key = 11;else return 0;key_up = 0; //标志按下P44 = P42 = 0;P32 = P33 = 1; //行扫描if(P32 == 0) key = key - 2;else if(P33 == 0) key = key - 3;return key;}else if(P44 == 1 && P42 == 1)key_up = 1; //松开return 0;
}
main.c
//按键处理任务
void key_task(void)
{uchar key_num;if(key_dly<10)return;key_dly = 0;
// key_num = key_scan1();key_num = key_scan2();switch (key_num){/* 独立按键 */
// case 4: num++;
// break;
// case 5: num--;
// break;
// case 6: flag_L1 ^= 1;
// break;
// case 7: state_display = (state_display+1)%2;
// break;/* 矩阵键盘 */case 4: num++;break;case 5: num--;break;case 8: flag_L1 ^= 1;break;case 9: state_display = (state_display+1)%2;break;}
}
2、按键进阶-松手生效
key.c
#include "key.h"/*** @brief 独立按键扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan1(void)
{uchar key = 0; //按键值static bit key_up = 1; //按键松开标志,1松开0按下static bit flag_s4 = 0; //按键4按下标志if((key_up == 1) && (P30 == 0 || P31 == 0 || P32 == 0 || P33 == 0)){key_up = 0;if(P30 == 0) key = 7;else if(P31 == 0) key = 6;else if(P32 == 0) key = 5;else if(P33 == 0){flag_s4 = 1; //标记按下key = 4;}return key;}else if(P30 == 1 && P31 == 1 && P32 == 1 && P33 == 1){key_up = 1;if(flag_s4 == 1){flag_s4 = 0;return 40; //松手生效}}return 0;
}/*** @brief 矩阵键盘扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan2(void)
{uchar key = 0; //按键值static bit key_up = 1; //按键松开标志,1松开0按下static bit flag_s4 = 0; //按键4按下标志P44 = P42 = 1; //列扫描P32 = P33 = 0;if((key_up == 1)&&(P44 == 0 || P42 == 0)){if(P44 == 0) key = 7;else if(P42 == 0) key = 11;else return 0;key_up = 0; //标志按下P44 = P42 = 0;P32 = P33 = 1; //行扫描if(P32 == 0) key = key - 2;else if(P33 == 0){key = key - 3;if(key == 4) flag_s4 = 1; //标记按下,这里判断键值是因为有两种可能s8,s4}return key;}else if(P44 == 1 && P42 == 1){key_up = 1; //松开if(flag_s4 == 1){flag_s4 = 0;return 40; //松手生效}}return 0;
}
main.c
//按键处理任务
void key_task(void)
{uchar key_num;if(key_dly<10)return;key_dly = 0;
// key_num = key_scan1();key_num = key_scan2();switch (key_num){/* 独立按键 */
// case 4: state_display = 1;//按下显示界面1
// break;
// case 5: num--;
// break;
// case 6: num++;
// break;
// case 7: flag_L1 ^= 1;
// break;
// case 40: state_display = 0;//松手显示界面0
// break;/* 矩阵键盘 */case 4: state_display = 1;//按下显示界面1break;case 5: num--;break;case 8: num++;break;case 9: flag_L1 ^= 1;break;case 40: state_display = 0;//松手显示界面0break;}
}
3、按键进阶-按键禁用(未完待续)
key.c
main.c