xiaoxia9623
发表于 2025-9-30 22:04:10
158470501 发表于 2025-9-30 15:03
知道吗?
uutamiwn
发表于 2025-10-1 16:47:09
学习了 今天开始下载规格书学习
白水大虾2016
发表于 2025-10-2 15:13:25
单片机学徒 发表于 2024-12-3 11:17
兑换了个芯片,回来搭最小系统板跟着学习吧
我也是,咱们共同加油吧!
dyx811
发表于 2025-10-2 17:13:08
我搭建了个普通的TTL下载电路,直接连接这颗U的P3.0和P3.1,希望能成功!
汇秀金禾
发表于 2025-10-2 23:33:42
请问现在还可以有送吗?
sdwg0546
发表于 2025-10-3 16:37:29
typedef enum {
IDLE,
DETECT,
RELEASE_DEBOUNCE
} KEY_MAT_STATE;
typedef struct {
KEY_MAT_STATE state;
u8 key_num;
u16 debounce;
u8 pressed_cnt; //按下次数计数
} KEY_MAT_STRUCT;
KEY_MAT_STRUCT key_mat={IDLE,11,0,0};
void Key_Matrix_Scan()
{
static u8 temp=11;
ROW1=1;
ROW2=1;
COL1=0;
COL2=0;
COL3=0;
COL4=0;
switch (key_mat.state) {
case IDLE:
if (ROW1==0&&ROW2==1)
{
key_mat.debounce=0;
key_mat.state=DETECT;
}else if (ROW1==1&&ROW2==0)
{
key_mat.debounce=0;
key_mat.state=DETECT;
}
break;
case DETECT:
if (++key_mat.debounce>=DEBOUNCE_TIME_10MS)
{
if (ROW1==0&&ROW2==1)
{
temp=1;
key_mat.debounce=0;
}else if (ROW1==1&&ROW2==0)
{
temp=5;
key_mat.debounce=0;
}
printf("temp1=%d\n",temp );
ROW1=0;
ROW2=0;
COL1=1;
COL2=1;
COL3=1;
COL4=1;
printf("temp2=%d\n",temp );
if (!COL1)
{
printf("temp3=%d\n",temp );
key_mat.state=RELEASE_DEBOUNCE;
key_mat.debounce=0;
break;
}else if (!COL2)
{
temp +=1;
printf("temp4=%d\n",temp );
key_mat.state=RELEASE_DEBOUNCE;
key_mat.debounce=0;
break;
}else if (!COL3)
{
temp +=2;
key_mat.state=RELEASE_DEBOUNCE;
key_mat.debounce=0;
break;
}else if (!COL4)
{
temp +=3;
key_mat.state=RELEASE_DEBOUNCE;
key_mat.debounce=0;
break;
}
}
break;
case RELEASE_DEBOUNCE:
printf("temp11=%d\n",temp );
if (!COL1 && !COL2 && !COL3 && !COL4)
{
if (++key_mat.debounce>=DEBOUNCE_TIME_10MS)
{
if (temp< 10)
{
key_mat.key_num=temp;
key_mat.state=IDLE;
}
}
}
break;
default:
// default code
break;
}
}冲哥能帮我分析一个,为什么按下松手后,没有正常进入RELEASE_DEBOUNCE状态,在DETECT状态不断的循环
香河英茂工作室
发表于 2025-10-4 06:39:32
擎天柱mpu6500的例程?
sdwg0546
发表于 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_STATEpassword_state; //状态
u8 password_current; //密码缓冲
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 = key_mat.key_value;
key_mat.key_value=255;
SEG_Display_Buffer = 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 == password.password_correct)
{
password.password_state = SUCCESS;
}else
password.password_state = FAILURE;
}
break;
case SUCCESS:
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=10;
password.password_state=FUN_LIST;
break;
case FAILURE:
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=11;
password.password_state=P_IDLE;
break;
case FUN_LIST:
switch (key_mat.key_value) {
case 1:
SEG_Display_Buffer=key_mat.key_value;
time=60;
password.password_state=FUN_RUN;
break;
case 2:
SEG_Display_Buffer=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;
SEG_Display_Buffer=0;
SEG_Display_Buffer=0;
}
default:
// default code
break;
}
}
void fun_list(void)
{
// SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=17;
SEG_Display_Buffer=time/10;
SEG_Display_Buffer=time%10;
}
void fun_handel()
{
time--;
}
冲哥,这是我写的简易洗衣机面板的小程序
ZRF197210
发表于 2025-10-6 07:16:29
冲哥,最好讲一下stc8051的8位用法
nfyycsoo
发表于 2025-10-6 14:51:22
讲的很棒{:4_174:}