ARM嵌入式系统设计与应用技术密码锁系统设计.docx
《ARM嵌入式系统设计与应用技术密码锁系统设计.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式系统设计与应用技术密码锁系统设计.docx(19页珍藏版)》请在冰豆网上搜索。
ARM嵌入式系统设计与应用技术密码锁系统设计
南京航空航天大学
研究生实验报告
项目名称:
ARM嵌入式系统设计与应用技术
设计专题:
综合实验三类:
密码锁系统
班级/任课教师:
xxxxxxx
小组成员(第六组)
(1)姓名:
学号:
学科:
电话:
Email:
签名:
(2)姓名:
学号:
学科:
电话:
Email:
签名:
xxx年x月x日
一、本实验主要内容
利用FLASH,编写程序实现一个设置密码和解码的密码锁系统。
要求如下:
1、采用开发板上的按键和显示模块进行相关控制:
1)Joystick键用来设置“0~9”。
向上为增,向下为减,左右为调整输入对应的位。
2)输入数字过程中,用指示灯LED1-LED4表示输入状态指示灯,即上面的JOY_UP(LED1)、JOY_DOWN(LED2)、JOY_LEFT(LED3)、JOY_RIGHT(LED4)。
每按一次上面的键,对应的LED就亮一次。
3)按下Key键表示6位数字密码最终确认。
2、设置密码步骤(设置密码需要输入两次)。
1)在没有给FLASH设定密码前,系统处于待设定密码状态。
液晶屏幕上默认显示如下:
(居中显示,显示内容也必须一致)
Keywords:
0-0-0-0-0-0
PleaseSetKeywords
2)用Joystick键按照第1点的方式设置密码。
将初始密码设置为:
1-2-3-4-5-6。
3)当上面6位密码输入完之后,按下Key键表示确认密码设置完成,此时将设定的密码写入FLASH存储器(M25PE80),写入确认成功后(读回写入的数据并比较即为检查成功),清屏,并显示:
KeywordsDone
PleaseSetKeywordsagain
Keywords:
0-0-0-0-0-0
根据提示再次输入6位密码。
按Key再次确认输入后,系统将本次输入的密码与FLASH中第一次设置的密码进行比较,不相同表示密码设置失败,相同则表示密码设定成功。
密码设定失败后,复位后液晶显示:
TheKeywordssetunsuccessful
PleaseSetKeywords:
0-0-0-0-0-0
设定密码成功后,注意这边一定要是复位后液晶显示:
TheKeywordshasset
PleaseEntertheKeywords:
0-0-0-0-0-0
此时进入解码状态。
3、密码锁解码步骤(解码仅需输入一次密码):
1)6位密码输入过程与“设置密码”相同。
2)输入6位解码密码后,按Key确认。
此时,系统将读取FLASH中6位数据进行匹配。
如果数据匹配,那么解码成功,此时液晶屏幕以500毫秒闪烁4次,并显示:
YouSuccess!
!
如果数据不匹配,则解码失败,液晶显示:
YouWrong!
!
PleaseEntertheKeywords:
0-0-0-0-0-0
在液晶屏合适的位置显示组名、姓名、学号、开发日期等信息。
可利用STM32开发板的资源扩展其他自定义功能。
二、硬件框图
1、LED与GPIO硬件连接图
Key按键GPIO引脚连接图
2、Joystick键硬件连接图
3、SPIFlash
4、LCD
三、程序流程图
主程序流程框图(无子程序流程框图)
四、调试和结果分析
1、软件的调试
在此次实验过程中,遇到了许多问题:
(1)调用库函数的时候该添加哪些文件?
怎么设置软件查找文件的路径等。
通过查询新建工程模板上详细的解释得以解决。
但是程序中存在的库函数的.h文件重定义问题,依然没有解决。
(2)实验中LCD上的字符的显示和数字的显示问题?
我采用了分别定义数组,分别用不同的函数来显示,至于字符和数字之间的距离,是通过不断的调试最终得出合适的值。
(3)如何用JOYSTICK摇杆键来实现对LCD上数字的加减和移位操作?
我采用调用库函数uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin);然后判断按个按键按下,执行程序中运用数组的操作。
比如向上拨动JOYSTICK键:
if(Key_Scan(GPIOG,GPIO_Pin_15)==KEY_ON)
{
STM_EVAL_LEDOn(LED1);
delay_ms(20);
STM_EVAL_LEDOff(LED1);
if(code[i]<9)
{code[i]=code[i]+1;}
else
{code[i]=9;}
POINT_COLOR=RED;
LCD_ShowNum(148+(2*i-1)*8,90,code[i],1,16);
}
(4)在此次实验中最大的难点是Key键作为输入密码的确认键用的很频繁,而且每次按下Key键需要执行的程序不一样?
我采用标志位的方法实现每次Key按键按下的时候执行不同的程序。
2、实验结果
(1)设定密码成功(“”表示按下Key键)
(2)设定密码不成功(第一次输入:
1-2-3-4-5-6,第二次输入:
1-1-1-2-2-2)
(3)解码成功(设定密码为1-2-3-4-5-6)
(3)解码不成功(输入密码为1-2-2-1-3-3,再次输入1-2-3-4-5-6,解码成功)
五、源程序清单
#include"include.h"
#include"stm32f10x.h"
#include"stm32_eval.h"
#defineKEY_ON0
#defineKEY_OFF1
unsignedcharKeywords1[]="Passwords:
-----";
UnsignedcharKeywords2[]="PleaseSetPasswords";
unsignedcharKeywords3[]="PasswordsDone";
unsignedcharKeywords4[]="PleaseSetPasswordsagain";
unsignedcharKeywords5[]="ThePasswordshasset";
unsignedcharKeywords6[]="PleaseEnterthePasswords";
unsignedcharKeywords7[]="ThePasswordssetunsuccessful";
unsignedcharKeywords8[]="YouSuccess!
!
";
unsignedcharKeywords9[]="YouWrong!
!
";
unsignedcharKeywords10[]="ZhouDiqi";
unsignedcharKeywords11[]="SX1505073/Group6";
unsignedcharKeywords12[]="May9th,2016";
unsignedintcode[6]={0,0,0,0,0,0};
unsignedintGetCode[6];
voidKey_GPIO_Config(void);
uint8_tKey_Scan(GPIO_TypeDef*GPIOx,u16GPIO_Pin);
intmain(void)
{
unsignedintsectorCnt;
staticunsignedinti,k,m,n,cmt,cnt,flag=0;
SystemInit();
delay_init();
uart_init(9600);
STM_EVAL_LEDInit(LED1);
STM_EVAL_LEDInit(LED2);
STM_EVAL_LEDInit(LED3);
STM_EVAL_LEDInit(LED4);
Key_GPIO_Config();
NVIC_Configuration();
LCD_Init();
SPI_FLASH_Init();
sectorCnt=sizeof(code)/SPI_FLASH_SectorSize;
if(sizeof(code)%SPI_FLASH_SectorSize!
=0)
sectorCnt++;
for(n=0;n{
SPI_FLASH_SectorErase(i*SPI_FLASH_SectorSize);
}
POINT_COLOR=BLUE;
LCD_ShowString(60,70,Keywords2);
LCD_ShowString(60,90,Keywords1);
LCD_ShowString(160,160,Keywords10);
LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
for(k=0;k<6;k++)
code[k]=0;
for(m=0;m<6;m++)
{
POINT_COLOR=RED;
LCD_ShowNum(148+(2*m-1)*8,90,code[m],1,16);
}
while
(1)
{
if(Key_Scan(GPIOG,GPIO_Pin_13)==KEY_ON){
STM_EVAL_LEDOn(LED4);
delay_ms(20);
STM_EVAL_LEDOff(LED4);
if(i<5)
{i++;}
else
{i=5;}
}
if(Key_Scan(GPIOG,GPIO_Pin_14)==KEY_ON)
{
STM_EVAL_LEDOn(LED3);
delay_ms(20);
STM_EVAL_LEDOff(LED3);
if(i>0)
{i--;}
else
{i=0;}
}
if(Key_Scan(GPIOD,GPIO_Pin_3)==KEY_ON)
{
STM_EVAL_LEDOn(LED2);
delay_ms(20);
STM_EVAL_LEDOff(LED2);
if(code[i]>0)
{code[i]=code[i]-1;}
else
{code[i]=0;}
POINT_COLOR=RED;
LCD_ShowNum(148+(2*i-1)*8,90,code[i],1,16);
}
if(Key_Scan(GPIOG,GPIO_Pin_15)==KEY_ON)//JOY_UPispushed
{
STM_EVAL_LEDOn(LED1);
delay_ms(20);
STM_EVAL_LEDOff(LED1);
if(code[i]<9)
{code[i]=code[i]+1;}
else
{code[i]=9;}
POINT_COLOR=RED;
LCD_ShowNum(148+(2*i-1)*8,90,code[i],1,16);
}
if(Key_Scan(GPIOG,GPIO_Pin_8)==KEY_ON)//Keyispushed
{
cnt++;
flag++;
}
if(flag==1)
{
SPI_FLASH_BufferWrite((u8*)code,0,sizeof(code));
LCD_Clear(WHITE);
POINT_COLOR=BLUE;LCD_ShowString(60,70,Keywords3);LCD_ShowString(60,90,Keywords1);LCD_ShowString(40,110,Keywords4);LCD_ShowString(160,160,Keywords10);LCD_ShowString(130,180,Keywords11);LCD_ShowString(140,200,Keywords12);
POINT_COLOR=RED;
for(k=0;k<6;k++)
{
code[k]=0;}
for(m=0;m<6;m++)
{
POINT_COLOR=RED;
LCD_ShowNum(148+(2*m-1)*8,90,code[m],1,16);
}
i=0;
flag=2;
}
if(cnt==2)
{
i=0;
SPI_FLASH_BufferRead((u8*)GetCode,0,sizeof(code));
for(k=0;k<6;k++)
{
if(code[k]==GetCode[k])
{
cmt++;
}
}
if(cmt==6)
{
LCD_Clear(WHITE);
POINT_COLOR=BLUE;
LCD_ShowString(60,50,Keywords5);
LCD_ShowString(60,70,Keywords6);
LCD_ShowString(60,90,Keywords1);
LCD_ShowString(160,160,Keywords10);
LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
for(k=0;k<6;k++)
code[k]=0;
for(m=0;m<6;m++)
{
POINT_COLOR=RED;
LCD_ShowNum(148+(2*m-1)*8,90,code[m],1,16);
}
cnt=3;
cmt=0;
}
else
{
cnt=0;
cmt=0;
flag=0;
LCD_Clear(WHITE);
POINT_COLOR=BLUE;LCD_ShowString(40,50,Keywords7);LCD_ShowString(60,70,Keywords2);
LCD_ShowString(60,90,Keywords1);
LCD_ShowString(160,160,Keywords10);
LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
for(k=0;k<6;k++)
code[k]=0;
for(m=0;m<6;m++)
{
POINT_COLOR=RED;LCD_ShowNum(148+(2*m-1)*8,90,code[m],1,16);
}
}
}
if(cnt>=4&&cnt<=9)
{SPI_FLASH_BufferRead((u8*)GetCode,0,sizeof(code));
for(k=0;k<6;k++)
{if(code[k]==GetCode[k])
cmt++;
}
}
if(cmt==6)
{
for(i=0;i<4;i++)
{
LCD_Clear(WHITE);
delay_ms(250);POINT_COLOR=BLUE;
LCD_ShowString(100,90,Keywords8);
LCD_ShowString(160,160,Keywords10);
LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
delay_ms(250);
}POINT_COLOR=BLUE;LCD_ShowString(100,90,Keywords8);LCD_ShowString(160,160,Keywords10);LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
cnt=10;
cmt=0;
}
else
{
LCD_Clear(WHITE);
POINT_COLOR=BLUE;
LCD_ShowString(100,50,Keywords9);
LCD_ShowString(60,70,Keywords2);
LCD_ShowString(60,90,Keywords1);
LCD_ShowString(160,160,Keywords10);LCD_ShowString(130,180,Keywords11);
LCD_ShowString(140,200,Keywords12);
i=0;
for(k=0;k<6;k++)
code[k]=0;
for(m=0;m<6;m++)
{
POINT_COLOR=RED;
LCD_ShowNum(148+(2*m-1)*8,90,code[m],1,16);
}
cnt=3;
cmt=0;
}
}
}
}
六、实验分工和安排
自己编写
七、对本实验课程的感想和建议
自己编写