- 打卡等级:偶尔看看II
- 打卡总天数:27
- 最近打卡:2025-10-16 09:14:19
已绑定手机
注册会员
- 积分
- 138
|
发表于 2025-10-5 14:54:58
|
显示全部楼层
#include "keymatrix.h"
const u8 correct_password[]={1,2,3,4,5,6};
u8 time=0;
typedef enum {
IDLE,
ROW_DETECT,
COL_DETECT,
RELEASE_DEBOUNCE
} KEY_MAT_STATE;
typedef enum {
P_IDLE,
INPUTTING,
VERIFYING,
SUCCESS,
FAILURE,
FUN_LIST,
FUN_RUN
} PASSWORD_STATE;
typedef struct {
KEY_MAT_STATE state;
u8 key_current_value;
u16 debounce;
u8 key_value;
} KEY_MAT_STRUCT;
typedef struct {
PASSWORD_STATE password_state; //状态
u8 password_current[6]; //密码缓冲
u8 password_length; //密码长度
u16 password_lock_time; //锁定时间
u8 password_failed_cnt; //失败次数
u8 password_input_length; //当前输入长度
const u8 *password_correct; //正确密码
} PASSWORD_STRUCT;
PASSWORD_STRUCT password = {
P_IDLE,{16,16,16,16,16,16},6,3000,0,0,correct_password
};
KEY_MAT_STRUCT key_mat={IDLE,255,0,255};
void Key_Matrix_Scan(void)
{
switch (key_mat.state) {
case IDLE:
ROW1 = 1;
ROW2 = 1;
COL1 = 0;
COL2 = 0;
COL3 = 0;
COL4 = 0;
if ((!ROW1 && ROW2) || (ROW1 && !ROW2))
{
key_mat.state =ROW_DETECT;
key_mat.debounce = 0;
}
break;
case ROW_DETECT:
if (++key_mat.debounce == DEBOUNCE_TIME_10MS)
{
if ((!ROW1 && ROW2) || (ROW1 && !ROW2))
{
if (!ROW1) {key_mat.key_current_value = 1;}
else if (!ROW2) {key_mat.key_current_value = 5;}
ROW1 = 0;
ROW2 = 0;
COL1 = 1;
COL2 = 1;
COL3 = 1;
COL4 = 1;
key_mat.state = COL_DETECT;
key_mat.debounce = 0;
}else
key_mat.state = IDLE;
}
break;
case COL_DETECT:
if (++key_mat.debounce == DEBOUNCE_TIME_10MS)
{
if (COL1 == 0) {key_mat.key_current_value += 0;}
else if (COL2 == 0) {key_mat.key_current_value += 1;}
else if (COL3 == 0) {key_mat.key_current_value += 2;}
else if (COL4 == 0) {key_mat.key_current_value += 3;}
key_mat.state = RELEASE_DEBOUNCE;
}
break;
case RELEASE_DEBOUNCE:
if (COL1 && COL2 && COL3 && COL4)
{
key_mat.key_value = key_mat.key_current_value;
key_mat.key_current_value = 255;
key_mat.state = IDLE;
}
break;
default:
key_mat.state = IDLE;
break;
}
}
void Password_Detct()
{
static u8 i;
switch (password.password_state) {
case P_IDLE:
if (key_mat.key_value != 255)
{
password.password_state=INPUTTING;
}
break;
case INPUTTING:
if (key_mat.key_value != 255)
{
printf("%d\n",key_mat.key_value );
password.password_current[password.password_input_length] = key_mat.key_value;
key_mat.key_value=255;
SEG_Display_Buffer[password.password_input_length] = 16;
password.password_input_length++;
if (password.password_input_length > (password.password_length-1))
{
password.password_input_length=0;
password.password_state=VERIFYING;
}
}
break;
case VERIFYING:
for (i = 0; i < password.password_length; i++) {
if (password.password_current[i] == password.password_correct[i])
{
password.password_state = SUCCESS;
}else
password.password_state = FAILURE;
}
break;
case SUCCESS:
SEG_Display_Buffer[0]=17;
SEG_Display_Buffer[1]=17;
SEG_Display_Buffer[2]=17;
SEG_Display_Buffer[3]=17;
SEG_Display_Buffer[4]=17;
SEG_Display_Buffer[5]=17;
SEG_Display_Buffer[6]=17;
SEG_Display_Buffer[7]=10;
password.password_state=FUN_LIST;
break;
case FAILURE:
SEG_Display_Buffer[0]=17;
SEG_Display_Buffer[1]=17;
SEG_Display_Buffer[2]=17;
SEG_Display_Buffer[3]=17;
SEG_Display_Buffer[4]=17;
SEG_Display_Buffer[5]=17;
SEG_Display_Buffer[6]=17;
SEG_Display_Buffer[7]=11;
password.password_state=P_IDLE;
break;
case FUN_LIST:
switch (key_mat.key_value) {
case 1:
SEG_Display_Buffer[0]=key_mat.key_value;
time=60;
password.password_state=FUN_RUN;
break;
case 2:
SEG_Display_Buffer[0]=key_mat.key_value;
time=90;
password.password_state=FUN_RUN;
break;
case 3:
password.password_state=P_IDLE;
break;
default:
break;
}
break;
case FUN_RUN:
fun_list();
if (key_mat.key_value == 3 || time == 0)
{
password.password_state = FUN_LIST;
key_mat.key_value = 255;
time = 0;
SEG_Display_Buffer[0]=0;
SEG_Display_Buffer[6]=0;
SEG_Display_Buffer[7]=0;
}
default:
// default code
break;
}
}
void fun_list(void)
{
// SEG_Display_Buffer[0]=17;
SEG_Display_Buffer[1]=17;
SEG_Display_Buffer[2]=17;
SEG_Display_Buffer[3]=17;
SEG_Display_Buffer[4]=17;
SEG_Display_Buffer[5]=17;
SEG_Display_Buffer[6]=time/10;
SEG_Display_Buffer[7]=time%10;
}
void fun_handel()
{
time--;
}
冲哥,这是我写的简易洗衣机面板的小程序 |
|