STM32密碼器程式碼

河馬小白發表於2020-12-06

STM32密碼器程式碼(校級微控制器大賽當場從0到1原創)

2020.12.5,題目是通過oled模組做一個簡易的遊戲機。

##功能實現要求如下:

  1. 初始介面顯示微控制器大賽D01組,然後要寫一個按鍵6位密碼鎖;
    要求密碼鎖每輸入一個按鍵值則螢幕顯示一個 “*”,按A鍵位為確定,按B鍵為退格
  2. 介面轉換,解鎖之後可以按鍵4選擇音樂播放介面,然後選擇音樂,要求有三種音樂,按相應的鍵位值可以用蜂鳴器播放,按B可以退回上層選單;
  3. 解鎖之後按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://editor.csdn.net/md/?articleId=110730022

相關文章