程序為早年所寫,邏輯不是很好,勿噴
STM32單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "oled.h"
- #include "usart2.h"
- #include "gpio.h"
- #include "timer.h"
- #include "as608.h"
- #include "24cxx.h"
- #include "myiic.h"
- #define moto_down 1400
- #define moto_up 2100 //最大2500
- #define time 1000 //ms
- void ifmima(void); //密碼判斷函數
- void recivemima(void); //串口接收密碼函數
- void turncode(void); //串口密碼更改函數
- void press_FR(void); //刷指紋
- void Add_FR(void); //驗證指紋
- void gui(u8 i); //界面函數
- void gpioinit(void); //gpio初始化函數
- void Del_FR(void); //指紋刪除函數
- void incode(void); //按鍵輸入函數
- void tcode(void); //按鍵更改密碼函數
- u8 key(u8 mode); //按鍵掃描函數
- u8 turnstr(u8 d); //字符轉換還函數
- u16 ValidN; //模塊內有效指紋個數
- u8 mima[6]= {'1','1','1','1','1','1'}; //默認密碼
- u16 shurumima[6]= {'0','0','0','0','0','0'}; //輸入密碼
- u16 turnmima[7]= {'0','0','0','0','0','0','0'}; //更改密碼
- u16 i,j;
- u8 len; //接收數據的長度;
- u8 change=0; //密碼更改標志位 更改1,不更改為0
- u8 over=0; //輸入密碼結束標志位 完成1
- u8 ture=2; //密碼判斷標志位 正確1,錯誤0,等待2
- u8 t=0;
- u8 reok=0; //回到主界面標志位 為一回到主界面
- int main(void)
- {
- PS_StaGPIO_Init();
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置系統中斷優先級分組2
- delay_init(168); //初始化延時函數
- pwminit1(84-1,20000-1);
- usart2_init(9600); //初始化串口2,用于與指紋模塊通訊
- uart_init(9600); //初始化串口波特率為115200
- OLED_Init(); //初始化OLED
- gpioinit(); //gpio初始化(按鍵)
- AT24CXX_Init(); //24c02初始化
- while(AT24CXX_Check()) //等待24c02初始化完畢
- OLED_Clear();
- OLED_ShowCH(0,16,"準備中");
- OLED_Refresh_Gram();
- // AT24CXX_Write(0,(u8*)mima,6); // 此條用于初始密碼 如果密碼忘記恢復此條密碼初始為111111
- AT24CXX_Read(0,mima,6);
- delay_ms(2000);
- OLED_Clear(); //清屏
- gui(0); //主界面
- OLED_Refresh_Gram(); //更新顯示到OLED
- TIM_SetCompare1(TIM3,moto_down); //舵機1500-2400 中值1850
- while(1)
- {
- recivemima(); //調用串口密碼接收
- if(reok==1) {
- reok=0; //如果標志位置一回到主屏
- goto OVER;
- }
- switch(key(0)) //選擇哪個按鍵被按下
- {
- case 0: //按鍵0被按下
- gui(1); //進入界面1指紋解鎖
- while(1) //進入循環等待(等待操作結束)
- {
- delay_ms(100);
- t++; //延時100ms t加一(5秒無操作退出)
- switch(key(0)) //選擇次界面 指紋功能選擇
- {
- case 0: {
- Add_FR(); //指紋添加
- goto OVER;
- }
- case 10: {
- Del_FR(); //指紋刪除
- goto OVER;
- }
- case 11: {
- press_FR(); //指紋驗證
- goto OVER;
- }
- }
- if(t==50) {
- t=0; //5秒無操作退出
- goto OVER;
- }
- }
- case 10: {
- gui(2);
- while(1)
- {
- delay_ms(100);
- t++;
- switch (key(0))
- {
- case 0:
- while(1) {
- incode();
- goto OVER;
- }
- case 10:
- while(1) {
- tcode();
- goto OVER;
- }
- case 11:
- goto OVER;
- }
- if(t==50) {
- t=0;
- goto OVER;
- }
- }
- /* case 11:
- {
- gui(4);
- while(1)
- {
- if(key(0)==11)goto OVER;
- if(reok==1)
- {goto OVER;}
- }
- } */
- }
- OVER: {
- OLED_Clear();
- gui(0);
- break;
- }
- }
- }
- }
- void recivemima(void) //串口接收密碼函數
- {
- reok=0; //標志位清零
- if(USART_RX_STA&0x8000) //如果串口有數據發來
- {
- len=USART_RX_STA&0x3fff; //得到此次接收到的數據長度
- for(i=0; i<len; i++) //數據轉存
- {
- if(USART_RX_BUF[0]!='t') {
- shurumima[i]=USART_RX_BUF[i]; //如果沒有接收到密碼更改標志位數據存儲在shurumima中
- change=0;
- }
- if(USART_RX_BUF[0]=='t') {
- turnmima[i]=USART_RX_BUF[i]; //如果接收到密碼更改標志位數據存儲在turnmima中 密碼更改標志位置一
- change=1;
- }
- }
- if(change==0) //密碼更改
- {
- ifmima(); //調用判斷函數
- if(ture==1) {
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼正確");
- OLED_Refresh_Gram();
- reok=1;
- TIM_SetCompare1(TIM3,moto_up);
- delay_ms(time);
- TIM_SetCompare1(TIM3,moto_down);
- }
- else {
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼錯誤");
- OLED_Refresh_Gram();
- reok=1;
- delay_ms(800);
- }
- }
- if(change==1) {
- turncode();
- }
- USART_RX_STA=0; //清除中斷 標志位
- }
- }
- void tcode(void)//按鍵更改密碼函數
- {
- u8 key1,count=0;
- ture=2;
- incode(); //密碼輸入函數調用
- if(ture==1) //輸入原密碼正確
- {
- OLED_Clear();
- OLED_ShowCH(0,0,"請輸新密碼");
- OLED_Refresh_Gram();
- key1=key(0); //獲取當前按鍵值(無按鍵按下是為15)
- while(1)
- {
- key1=key(0);
- while(key1==15) //等待按鍵按下
- {
- key1=key(0);
- }
- count++; //計算密碼個數
- OLED_ShowNum(12,23,count,2,12);
- OLED_Refresh_Gram();
- switch(count) //密碼轉存
- {
- case 1:
- mima[0]=turnstr(key1);
- break;
- case 2:
- mima[1]=turnstr(key1);
- break;
- case 3:
- mima[2]=turnstr(key1);
- break;
- case 4:
- mima[3]=turnstr(key1);
- break;
- case 5:
- mima[4]=turnstr(key1);
- break;
- case 6:
- mima[5]=turnstr(key1);
- break;
- }
- if(count==6) //密碼個數為6位
- {
- count=0;
- delay_ms(100);
- break;
- }
- delay_ms(200);
- }
- AT24CXX_Write(0,(u8*)mima,6);
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼修改成功");
- OLED_Refresh_Gram();
- delay_ms(800);
- }
- else
- {
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼修改錯誤");
- OLED_Refresh_Gram();
- delay_ms(800);
- reok=1;
- }
- }
- void incode(void) //按鍵輸入函數
- {
- u8 key1,count=0;
- OLED_Clear();
- OLED_ShowCH(0,0,"請輸入密碼");
- OLED_Refresh_Gram();
- key1=key(0); //返回15
- while(1)
- {
- key1=key(0);
- while(key1==15)
- {
- key1=key(0);
- }
- count++;
- switch(count)
- {
- case 1:
- shurumima[0]=turnstr(key1);
- break;
- case 2:
- shurumima[1]=turnstr(key1);
- break;
- case 3:
- shurumima[2]=turnstr(key1);
- break;
- case 4:
- shurumima[3]=turnstr(key1);
- break;
- case 5:
- shurumima[4]=turnstr(key1);
- break;
- case 6:
- shurumima[5]=turnstr(key1);
- break;
- }
- if(count==6)
- {
- count=0;
- ifmima();
- delay_ms(100);
- break;
- }
- delay_ms(200);
- }
- if(ture==1) {
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼正確");
- OLED_Refresh_Gram();
- TIM_SetCompare1(TIM3,moto_up);
- delay_ms(time);
- TIM_SetCompare1(TIM3,moto_down);
- } //舵機開鎖等待1秒后關閉
- if(ture==0) {
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼錯誤");
- OLED_Refresh_Gram();
- delay_ms(800);
- }
- }
- void turncode(void)//串口更改密碼函數
- {
- for(i=0; i<6; i++)
- {
- mima[i]=turnmima[i+1]; //數據轉存(第一位為標志位省去)
- }
- AT24CXX_Write(0,(u8*)mima,6);
- OLED_Clear();
- OLED_ShowCH(0,16,"密碼修改成功");
- OLED_Refresh_Gram();
- reok=1; //標志位置一 返回主界面
- delay_ms(800);
- }
- void ifmima(void)//密碼判斷函數
- {
- for(i=0; i<6; i++)
- {
- if(shurumima[i]==mima[i])ture=1; //數組比較正確標志位置一
- else {
- ture=0; //不正確標志位置0
- break;
- }
- }
- for(j=0; j<6; j++)
- {
- shurumima[j]='0'; //清空輸入密碼的數組
- }
- }
- //刷指紋
- void press_FR(void)
- {
- SearchResult seach;
- u8 ensure;
- u8 t=0;
- while(1)
- {
- t++;
- ensure = PS_GetImage();
- OLED_Clear();
- OLED_ShowCH(0,0,"請按手指");
- OLED_Refresh_Gram();
- if(ensure == 0x00) //獲取圖像成功
- {
- ensure = PS_GenChar(CharBuffer1);
- if(ensure == 0x00) //生成特征成功
- {
- ensure = PS_HighSpeedSearch(CharBuffer1, 0, 99, &seach);
- if(ensure == 0x00) //搜索成功
- {
- OLED_Clear();
- OLED_ShowCH(0, 16, "指紋驗證成功");
- OLED_Refresh_Gram();
- TIM_SetCompare1(TIM3,moto_up);
- delay_ms(1000);
- TIM_SetCompare1(TIM3,moto_down);
- // delay_ms(1500);
- delay_ms(1500);
- break;
- }
- else
- { OLED_Clear();
- OLED_ShowCH(0, 16, "驗證失敗");
- OLED_Refresh_Gram();
- delay_ms(1500);
- break;
- }
- }
- else
- {};
- }
- if(t==10)
- {
- t=0;
- break;
- }
- delay_ms(500);
- }
- }
- //添加指紋
- void Add_FR(void)
- {
- u8 i, ensure, processnum = 0;
- u8 ID_NUM = 0;
- while(1)
- {
- switch (processnum)
- {
- case 0:
- i++;
- OLED_Clear();
- OLED_ShowCH(0, 16, "請按手指");
- OLED_Refresh_Gram();
- ensure = PS_GetImage();
- if(ensure == 0x00)
- {
- ensure = PS_GenChar(CharBuffer1); //生成特征
- if(ensure == 0x00)
- {
- OLED_Clear();
- OLED_ShowCH(0, 16, "指紋正常");
- OLED_Refresh_Gram();
- i = 0;
- processnum = 1; //跳到第二步
- }
- }
- break;
- case 1:
- i++;
- OLED_Clear();
- ensure = PS_GetImage();
- if(ensure == 0x00)
- {
- ensure = PS_GenChar(CharBuffer2); //生成特征
- if(ensure == 0x00)
- {
- OLED_Clear();
- OLED_ShowCH(0, 16, "指紋正常");
- OLED_Refresh_Gram();
- i = 0;
- processnum = 2; //跳到第三步
- }
- else {
- OLED_ShowCH(0, 16,"失敗");
- OLED_Refresh_Gram();
- }
- }
- else {
- OLED_ShowCH(0, 16, "失敗");
- OLED_Refresh_Gram();
- }
- break;
- case 2:
- OLED_Clear();
- OLED_ShowCH(0, 16, "對比兩次指紋");
- OLED_Refresh_Gram();
- ensure = PS_Match();
- if(ensure == 0x00)
- { OLED_Clear();
- OLED_ShowCH(0, 16, "對比成功");
- OLED_Refresh_Gram();
- processnum = 3; //跳到第四步
- }
- else
- {
- OLED_ShowCH(0, 16, "對比失敗");
- OLED_Refresh_Gram();
- i = 0;
- processnum = 0; //跳回第一步
- }
- delay_ms(500);
- break;
- case 3:
- OLED_Clear();
- OLED_ShowCH(0, 16, "可松開手指");
- OLED_Refresh_Gram();
- delay_ms(800);
- OLED_Clear();
- OLED_ShowCH(0, 16, "生成指紋模板");
- OLED_Refresh_Gram();
- delay_ms(500);
- ensure = PS_RegModel();
- if(ensure == 0x00)
- { OLED_Clear();
- OLED_ShowCH(0, 16, "生成指紋模板成功");
- OLED_Refresh_Gram();
- processnum = 4; //跳到第五步
- }
- else
- {
- processnum = 0;
- OLED_ShowCH(0, 16, "失敗");
- OLED_Refresh_Gram();
- }
- delay_ms(1000);
- break;
- case 4:
- OLED_Clear();
- OLED_ShowCH(0, 16, "輸入用戶編號");
- OLED_Refresh_Gram();
- while(ID_NUM==0|ID_NUM==15)
- {
- ID_NUM=key(0);
- }
- OLED_Clear();
- OLED_ShowCH(0, 0, "用戶編號為");
- OLED_ShowNum(0, 32, ID_NUM, 2, 24);
- OLED_Refresh_Gram();
- ensure = PS_StoreChar(CharBuffer2, ID_NUM); //儲存模板
- delay_ms(800);
- if(ensure == 0x00)
- {
- OLED_Clear();
- OLED_ShowCH(0, 16, "錄入指紋成功");
- OLED_Refresh_Gram();
- delay_ms(1500);
- OLED_Clear();
- return ;
- }
- else
- {
- OLED_Clear();
- processnum = 0;
- OLED_ShowCH(0, 16, "失敗");
- OLED_Refresh_Gram();
- }
- break;
- }
- delay_ms(400);
- if(i == 10) //超過5次沒有按手指則退出
- {
- break;
- }
- }
- }
- //刪除指紋
- void Del_FR(void)
- {
- u8 ensure;
- u16 ID_NUM = 0;
- OLED_Clear();
- OLED_ShowCH(0, 2, "輸入清除用戶編號");
- OLED_Refresh_Gram();
- while(ID_NUM==0|ID_NUM==15)
- {
- ID_NUM=key(0);
- }
- ensure = PS_DeletChar(ID_NUM, 1); //刪除單個指紋
- if(ensure == 0)
- {
- OLED_Clear();
- OLED_ShowNum(0, 12, ID_NUM, 2, 12);
- OLED_ShowCH(12, 12, "號刪除指紋成功");
- OLED_Refresh_Gram();
- }
- else
- OLED_ShowCH(0, 16, "刪除失敗");
- delay_ms(1500);
- }
- void gui(u8 i)
- {
- switch(i)
- {
- /*******************************************/
- /*
- 主界面
- */
- /*******************************************/
- case 0:
- OLED_Clear();
- OLED_ShowCH(8, 0, "控智控能控鎖控");
- OLED_ShowCH(32, 16, "指紋解鎖");
- OLED_ShowCH(32, 32, "密碼解鎖");
- // OLED_ShowCH(32, 48, "軟件解鎖");
- OLED_Refresh_Gram();
- break;
- /*******************************************/
- /*
- 指紋解鎖界面
- */
- /*******************************************/
- case 1:
- OLED_Clear();
- OLED_ShowCH(8, 0, "指控紋控解控鎖");
- OLED_ShowCH(32, 16, "添加指紋");
- OLED_ShowCH(32, 32, "刪除指紋");
- OLED_ShowCH(32, 48, "驗證指紋");
- OLED_Refresh_Gram();
- break;
- /*******************************************/
- /*******************************************/
- /*
- 按鍵解鎖主界面
- */
- /*******************************************/
- case 2:
- OLED_Clear();
- OLED_ShowCH(8, 0, "密控碼控解控鎖");
- OLED_ShowCH(32, 16, "輸入密碼");
- OLED_ShowCH(32, 32, "修改密碼");
- OLED_ShowCH(40, 48, "返控回");
- OLED_Refresh_Gram();
- break;
- /*******************************************/
- /*
- 按鍵解鎖次界面
- */
- /*******************************************/
- case 3:
- OLED_Clear();
- OLED_ShowCH(8, 0, "密控碼控解控鎖");
- OLED_ShowCH(0, 16, "請輸入密碼");
- //OLED_ShowCH(32, 32, "修改密碼");
- OLED_ShowCH(88, 48, "返回");
- OLED_Refresh_Gram();
- break;
- /*******************************************/
- /*
- 軟件解鎖次界面
- */
- /*******************************************/
- case 4:
- OLED_Clear();
- OLED_ShowCH(8, 0, "軟控件控解控鎖");
- OLED_ShowCH(0, 16, "請連接軟件");
- OLED_ShowCH(88, 48, "返回");
- OLED_Refresh_Gram();
- break;
- }
- }
- u8 turnstr(u8 d)
- {
- switch(d)
- {
- case 0: {
- return '0';
- break;
- }
- case 1: {
- return '1';
- break;
- }
- case 2: {
- return '2';
- break;
- }
- case 3: {
- return '3';
- break;
- }
- case 4: {
- return '4';
- break;
- }
- case 5: {
- return '5';
- break;
- }
- case 6: {
- return '6';
- break;
- }
- case 7: {
- return '7';
- break;
- }
- case 8: {
- return '8';
- break;
- }
- case 9: {
- return '9';
- break;
- }
- }
- }
復制代碼
|