蓝桥杯单片机按键进阶
——基于柳离风老师模板及按键进阶教程
文章目录
- 蓝桥杯单片机按键进阶
- 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;//按下显示界面1
break;
case 5: num--;
break;
case 8: num++;
break;
case 9: flag_L1 ^= 1;
break;
case 40: state_display = 0;//松手显示界面0
break;
}
}
3、按键进阶-按键禁用(未完待续)
key.c
main.c



















