前言:
朋友做毕设需要用到密码锁这个功能,帮忙设计了一个简单的。因为自己也忙于毕设,所以很多功能也没有完善。
有兴趣的朋友可以看下这个,也能实现扫码开锁功能 扫码点灯
实现功能:
1、密码保存到STM32内部flash中,掉电不丢失。
2、 通过按键修改密码
简易密码锁功能说明:
4位密码 密码全是数字和非0值
A按键:展示密码
B按键:撤销1位数字
C按键:清屏
D按键:进入和退出修改密码
所需材料:
1、stm32f103c8t6单片机
2、4*4矩阵键盘
3、OLED显示屏
4、ST-LINK下载器
接线事项:
OLED显示屏:VCC–3V3 GND–GND SCL–PB5 SDA–PB7
矩阵键盘:PA0~PA7的8个引脚
实物图:
部分代码:
main.c文件
- /*
- 简易密码锁功能说明:
- 4位密码
- 密码全是数字和非0值
- A按键展示密码
- B按键退格
- C按键清屏
- D按键进入和退出修改密码
- */
- #include "stm32f10x.h" //STM32头文件
- #include "system.h"
- #include "SysTick.h"
- #include "oled.h"
- #include "stdio.h"
- #include "stm32_flash.h"
- #include "KEYPAD4x4.h"
- #include "NVIC.h"
- #include "usart.h"
- #include "mypwd.h"
- //已放在system.h文件中
- //#define STM32_FLASH_SAVE_ADDR 0X08009990 //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
- char dataBuf1[16]; //数据缓冲区
- unsigned char myPwd[4]={1,2,3,4}; //第一次要写入的密码
- unsigned char readPwd[4]={0}; //从flash中读取的密码存放于此
- unsigned char inputPwdArr[4]={0}; //用户输入的密码存放于此
- unsigned char newPwdArr[4]={0}; //新密码存放于此
- u8 g_count = 0; //密码位数,目前4位密码
- u16 inputPwd = 0; //输入的密码值
- bool modifyFlag = false; //修改密码的标志
- //主程序
- int main (void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
- SysTick_Init(72);
- OLED_Init();
- OLED_Clear();
- INT_MARK=0;//中断标志位清0
- KEYPAD4x4_Init();//阵列键盘初始化
- KEYPAD4x4_INT_INIT();//阵列键盘的中断初始化
-
- //写入myPwd数组中的密码
- //STM32_FLASH_Write(STM32_FLASH_SAVE_ADDR,(u16*)myPwd,sizeof(myPwd));
- //delay_ms(1000);
-
- //读取密码,并存放在readPwd数组中
- STM32_FLASH_Read(STM32_FLASH_SAVE_ADDR,(u16*)readPwd,sizeof(readPwd));
- OLED_ShowString(0,16,(u8*)"input:",16);
-
- OLED_Refresh(); //更新显存到OLED
- while(1)
- {
- if(INT_MARK) //按键按下,发生中断
- {
- if(modifyFlag==false) //中断标志位为1表示有按键中断
- {
- INT_MARK=0; //标志位清0
- OLED_ShowString(0,16,(u8*)"input:",16);
- inputPwdFun(); //输入密码并显示
- jugePwdFun(); //判断输入的密码
- }
- else if(modifyFlag==true)
- {
- modifyPwdFun(); //修改密码
- }
- }
- //delay_ms(1000); //延时会影响键盘的输入
- }
- }
复制代码
最后:
下载操作:
————————————————
版权声明:⁽⁽ଘ晴空万里ଓ⁾⁾
|