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:}
页: 195 196 197 198 199 200 201 202 203 204 [205] 206 207 208
查看完整版本: 《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套