嵌入式设计 简单密码锁
主控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简单密码锁