找回密码
 立即注册
楼主: 电子DIY小家

《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套

   火... [复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:12
  • 最近打卡:2025-11-17 22:42:49
已绑定手机

2

主题

1

回帖

65

积分

注册会员

积分
65
发表于 2025-10-2 23:33:42 | 显示全部楼层
请问现在还可以有送吗?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2026-02-06 07:53:13
已绑定手机

0

主题

19

回帖

220

积分

中级会员

积分
220
发表于 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状态不断的循环
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2026-02-06 07:53:13
已绑定手机

0

主题

19

回帖

220

积分

中级会员

积分
220
发表于 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--;
}
冲哥,这是我写的简易洗衣机面板的小程序
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2026-04-09 19:36:35
已绑定手机

1

主题

139

回帖

395

积分

中级会员

积分
395
发表于 2025-10-6 07:16:29 | 显示全部楼层
冲哥,最好讲一下stc8051的8位用法
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2026-04-09 13:28:55
已绑定手机

0

主题

18

回帖

218

积分

中级会员

积分
218
发表于 2025-10-6 14:51:22 | 显示全部楼层
讲的很棒
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2026-04-09 13:28:55
已绑定手机

0

主题

18

回帖

218

积分

中级会员

积分
218
发表于 2025-10-7 14:46:56 | 显示全部楼层
讲解详细
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2026-04-08 12:19:20
已绑定手机

19

主题

109

回帖

587

积分

高级会员

积分
587
发表于 2025-10-11 08:14:22 | 显示全部楼层
1.还出视频吗?
2.ai8052u什么时候可以拿到手,定价是多少呢?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:502
  • 最近打卡:2026-04-10 00:00:02
已绑定手机

6

主题

117

回帖

1352

积分

金牌会员

积分
1352
发表于 2025-10-11 10:13:17 | 显示全部楼层
孙*** 发表于 2025-10-11 08:14
1.还出视频吗?
2.ai8052u什么时候可以拿到手,定价是多少呢?

自己设计软硬件的话好像是可以申请了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2026-04-08 12:19:20
已绑定手机

19

主题

109

回帖

587

积分

高级会员

积分
587
发表于 2025-10-11 15:52:27 | 显示全部楼层
bat*** 发表于 2025-10-11 10:13
自己设计软硬件的话好像是可以申请了

谢谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-10-12 14:21:00
已绑定手机

0

主题

5

回帖

72

积分

注册会员

积分
72
发表于 2025-10-11 22:19:17 | 显示全部楼层
《8051U深度入门到32位51大型实战教学视频》里的第十一集 矩阵按键的案例文件在哪里可以看到?
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-10 00:44 , Processed in 0.113233 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表