STM32简单密码锁

嵌入式设计  简单密码锁 
主控stm32f103c8t6
功能:两个按键单击双击当四个按键使用
按键1 单击加 双击减
按键2 单击输入 双击确认密码

没有废话,直接上代码,最后面有视频效果

按键函数:

void Key_Proc(void)
{
    if((uwTick -  uwTick_Key_Set_Point)<100)    return;//减速函数
        uwTick_Key_Set_Point = uwTick;

    ucKey_Val = Key_Scan();
    unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); 
    ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);    
    ucKey_Old = ucKey_Val;
    


    if(ucKey_Up) //当第一次按键按下抬起时 
    {
        key_temp = ucKey_Up;    //记录按键按下抬起后的键值
        if(key_down_num == 0)
        {
            key_down_num = 1; //记录第一次按键已经按下
            uwTick_KEY_Pressed_Time_Count= uwTick; //开始计时
        }
        else    //如果检测到双击后的第二次上升沿 将按键按下次数清理 以便于判断下一次按键的单击-双击
            key_down_num = 0;
    }
    
    if(key_down_num == 1) //当第一次按键按下并抬起时
    {
        if((uwTick - uwTick_KEY_Pressed_Time_Count) >= 300) //当按键按下300ms时间后没有检测到第二次按键按下-单击
        {
            switch(key_temp)    //选择是哪一个按键按下 执行程序
            {
                case 1:
                        if(++Car_Mode==10)Car_Mode=0;
                    break;

                case 2:
                uc[count_i++]=Car_Mode;
                if(count_i==7)
                {
                memset(uc,0,sizeof(uc));
                count_i=0;
                }
                    //添加按键功能
                break;
            }
            key_down_num = 0;    //清零 以便于判断下一次按键的单击-双击
        }
        else    //按键在300ms内检测到按键按下-双击
        {
            switch(unKey_Down) //选择是哪一个按键按下 执行程序
            {
                case 1:
                    if(Car_Mode>0)Car_Mode--;
                    break;
                case 2:
                    if((uc[0]==mm[0])&&(uc[1]==mm[1])&&(uc[2]==mm[2])&&(uc[3]==mm[3])&&(uc[4]==mm[4])&&(uc[5]==mm[5]))
                    {  
                        OLED_Clear(); 
                        Car_Start=1;
                    }
                    else
                    memset(uc,0,sizeof(uc));
                    //添加按键功能
                break;
            }
        }
    }    
}

 oled显示函数:

void Oled_Proc(void)
{
    if((uwTick -  uwTick_Oled_Set_Point)<1000)    return;//减速函数
    uwTick_Oled_Set_Point = uwTick;
    if(Car_Start==0)
    {
    sprintf((char *)str, "     off ");
    OLED_ShowString(0,0,str,16);//这个是oled驱动里面的,是显示位置的一个函数,

    sprintf((char *)str, "count:%d  i:%d",Car_Mode,count_i+1);
    OLED_ShowString(0,3,str,16);//这个是oled驱动里面的,是显示位置的一个函数,

    sprintf((char *)str, "mima: %d%d%d%d%d%d",uc[0],uc[1],uc[2],uc[3],uc[4],uc[5]);
    OLED_ShowString(0,6,str,16);//这个是oled驱动里面的,是显示位置的一个函数,
    }
    else 
    {

    sprintf((char *)str, "   open   ");
    OLED_ShowString(0,3,str,16);//这个是oled驱动里面的,是显示位置的一个函数
    }
}

主函数: 

int main(void)
{
  HAL_Init();    
  SystemClock_Config();
    
  KEY_LED_Init();

    USART1_UART_Init();    //初始化串口1
    HAL_UART_Receive_IT(&huart1, (uint8_t *)(&buffer), 1);
    
    USART2_UART_Init();
    HAL_UART_Receive_IT(&huart2, (uint8_t *)(&buffer2), 1);

    
  MOTOR_Init();               //电机引脚初始化
    /*PWM_OUTPUT_TIM3_Init();                   //初始化PWM引脚
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);    //PA6          //后轮
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);    //PA7
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);    //PB0
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);    //PB1
    
  PWM_INPUT_TIM2_Init();
  PWM_INPUT_TIM4_Init();
    HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);//开启定时器2
    HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_1);//开启定时器4
    HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);//开启定时器2
    HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_2);//开启定时器4
    
    HAL_TIM_Base_Start_IT(&htim2); //开启定时器2 中断
    HAL_TIM_Base_Start_IT(&htim4); //开启定时器4 
    
    BASIC_TIM1_Init();   //基本定时器1 1000hz
    HAL_TIM_Base_Start_IT(&htim1);     //开启中断
    
    PID_init();    //PID初始化
    */
    OLED_Init();            //初始化OLED  
  OLED_Clear(); 
  while (1)
  {
//     Usart_Proc();
//     Speed_Proc();        
     Oled_Proc();
     Key_Proc();
  }

}

STM32简单密码锁

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值