STM32密码器代码(校级单片机大赛当场从0到1原创)
2020.12.5,题目是通过oled模块做一个简易的游戏机。
##功能实现要求如下:
- 初始界面显示单片机大赛D01组,然后要写一个按键6位密码锁;
要求密码锁每输入一个按键值则屏幕显示一个 “*”,按A键位为确定,按B键为退格 - 界面转换,解锁之后可以按键4选择音乐播放界面,然后选择音乐,要求有三种音乐,按相应的键位值可以用蜂鸣器播放,按B可以退回上层菜单;
- 解锁之后按6则为选择游戏界面,按A开始贪吃蛇小游戏,B键位返回上一菜单
密码锁部分
由于小组有四位同学,我负责的任务是oled的显示部分。所以这部分函数的代码是我来写的,其余部分其他同学写,所以就先只更新这么多。
逻辑构思
代码的思路大概是执行一个while死循环,不断检测键位值,然后把键位的值存储到一个密码数组keymima【】里,而正确密码储存在mima【】数组里,赋好值最后进行对比。而至于在屏幕上显示字符*,是用另一个数组X【m】,通过OLED_ShowString函数进行打印 *。
具体判断条件?
*按键有1-9九个键位用于输入密码,A作为确定按钮,B作为退格按钮。
当屏幕上的小于6个的时候,按下1-9的时候,将键位赋给数组keymima【】;
当的数量等于6的时候,再输入密码直接显示密码错误回到密码输入阶段,即屏幕上什么都没有的状态,等待输入,所以这里要清空所有数组并且重新初始化。
OLED_ShowPicture(0,0,128,8,wrong_key);
delay_ms(800);
//清屏
OLED_Clear();
OLED_Refresh();
x[0]=5;
m=0;
for(j=0;j<20;j++)
keymima[j]=0;
j=1;
//将密码数组和画*位置数组都初始化
continue;
当*不超过6个的时候,按下B键位会退格,即删去前一个星号,并且将画“雪花号数组的位置前置,把密码数组keymima中的最后一个值置0。
这里我们最开始用的是keymima数组j不断+1,当B按下那么就会将当前值变为0,而j++,继续下面的存储,然后在密码比对的时候,将keymima数组不为0的值全部提取放到另一个数组里,然后进行和正确密码数组的必对。
后来发现没有必要,直接将j–,这样下次的keymima数组存储数据的时候就会进行对最后一位的覆盖,直接将keymima数组和正确密码数组比对就行了。
if(scan1==12)//B
{int extern j;
m=m-1 ;
OLED_Clearzf(x[m],25,13,13);
OLED_Refresh();
keymima[j]=0;
j--;
}
3.至于x【m】可以自己做初始化,自己选择间隔就可以了。这样就能画出间隔平均美观的雪花号了。
4.最后,
遍历大法好。
这里放了一个完整版的例程可供烧录:
链接:https://pan.baidu.com/s/1C-2ktrw9nMDWBfa1QEiUfA
提取码:saan
复制这段内容后打开百度网盘手机App,操作更方便哦