1、ARM嵌入式系统设计与应用技术密码锁系统设计南京航空航天大学研究生实验报告项目名称:ARM嵌入式系统设计与应用技术 设计专题: 综合实验三类:密码锁系统 班级/任课教师: xxxxxxx 小组成员(第六组)(1)姓名: 学号: 学科: 电话: Email: 签名: (2)姓名: 学号: 学科: 电话: Email: 签名: xxx年x月x日一、本实验主要内容利用FLASH,编写程序实现一个设置密码和解码的密码锁系统。要求如下:1、采用开发板上的按键和显示模块进行相关控制:1)Joystick键用来设置“09”。向上为增,向下为减,左右为调整输入对应的位。2)输入数字过程中,用指示灯LED1-L
2、ED4表示输入状态指示灯,即上面的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-0Please Set Keywords2)用Joystick键按照第1点的方式设置密码。将初始密码设置为:1-2-3-4-5-6。3)当上面6位密码输入完之后,按下Key
3、键表示确认密码设置完成,此时将设定的密码写入FLASH存储器(M25PE80),写入确认成功后(读回写入的数据并比较即为检查成功),清屏,并显示:Keywords DonePlease Set Keywords againKeywords:0-0-0-0-0-0根据提示再次输入6位密码。按Key再次确认输入后,系统将本次输入的密码与FLASH中第一次设置的密码进行比较,不相同表示密码设置失败,相同则表示密码设定成功。密码设定失败后,复位后液晶显示:The Keywords set unsuccessfulPlease Set Keywords:0-0-0-0-0-0设定密码成功后,注意这边一定
4、要是复位后液晶显示:The Keywords has setPlease Enter the Keywords:0-0-0-0-0-0 此时进入解码状态。3、密码锁解码步骤(解码仅需输入一次密码):1)6位密码输入过程与“设置密码”相同。2)输入6位解码密码后,按Key确认。此时,系统将读取FLASH中6位数据进行匹配。如果数据匹配,那么解码成功,此时液晶屏幕以500毫秒闪烁4次,并显示: You Success!如果数据不匹配,则解码失败,液晶显示: You Wrong! Please Enter the Keywords:0-0-0-0-0-0在液晶屏合适的位置显示组名、姓名、学号、开发日
5、期等信息。可利用STM32开发板的资源扩展其他自定义功能。二、硬件框图1、LED与GPIO硬件连接图Key 按键GPIO引脚连接图2、Joystick键硬件连接图3、SPI Flash4、LCD三、程序流程图主程序流程框图(无子程序流程框图)四、调试和结果分析1、软件的调试在此次实验过程中,遇到了许多问题:(1)调用库函数的时候该添加哪些文件?怎么设置软件查找文件的路径等。通过查询新建工程模板上详细的解释得以解决。但是程序中存在的库函数的.h文件重定义问题,依然没有解决。(2)实验中LCD上的字符的显示和数字的显示问题?我采用了分别定义数组,分别用不同的函数来显示,至于字符和数字之间的距离,是
6、通过不断的调试最终得出合适的值。(3)如何用JOYSTICK摇杆键来实现对LCD上数字的加减和移位操作?我采用调用库函数uint8_t Key_Scan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);然后判断按个按键按下,执行程序中运用数组的操作。比如向上拨动JOYSTICK键:if (Key_Scan(GPIOG, GPIO_Pin_15) = KEY_ON) STM_EVAL_LEDOn(LED1); delay_ms(20); STM_EVAL_LEDOff(LED1); if(codei9) codei=codei+1; else codei=9; POINT_
7、COLOR=RED; LCD_ShowNum(148+(2*i-1)*8,90,codei,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,解码成功) 五、源程序清单
8、#include include.h#include stm32f10x.h#include stm32_eval.h#define KEY_ON 0#define KEY_OFF 1unsigned char Keywords1 = Passwords: - - - - - ;Unsigned char Keywords2 = Please Set Passwords;unsigned char Keywords3 = Passwords Done;unsigned char Keywords4 = Please Set Passwords again;unsigned char Keywo
9、rds5 = The Passwords has set;unsigned char Keywords6 = Please Enter the Passwords;unsigned char Keywords7 = The Passwords set unsuccessful;unsigned char Keywords8 = You Success!;unsigned char Keywords9 = You Wrong!;unsigned char Keywords10 = Zhou Diqi;unsigned char Keywords11 = SX1505073/Group 6;uns
10、igned char Keywords12 = May 9th,2016;unsigned int code6=0,0,0,0,0,0;unsigned int GetCode6;void Key_GPIO_Config(void);uint8_t Key_Scan(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);int main(void) unsigned int sectorCnt; static unsigned int i,k,m,n,cmt,cnt,flag=0; SystemInit(); delay_init(); uart_init(9600); STM
11、_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; nsectorCnt;n+) SPI_FLASH_Se
12、ctorErase(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;k6;k+) codek=0;for(m=0;m6;m+) POINT_COLOR=RED;LCD_ShowNum(148+(2*
13、m-1)*8,90,codem,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(i0) 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(codei0) codei=codei-1; else codei=0; POINT_
14、COLOR=RED;LCD_ShowNum(148+(2*i-1)*8,90,codei,1,16); if(Key_Scan(GPIOG, GPIO_Pin_15) = KEY_ON) /JOY_UP is pushed STM_EVAL_LEDOn(LED1); delay_ms(20); STM_EVAL_LEDOff(LED1); if(codei9) codei=codei+1; else codei=9; POINT_COLOR=RED; LCD_ShowNum(148+(2*i-1)*8,90,codei,1,16); if(Key_Scan(GPIOG, GPIO_Pin_8)
15、 = KEY_ON) /Key is pushed 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,Keyw
16、ords11); LCD_ShowString(140,200,Keywords12); POINT_COLOR=RED; for(k=0;k6;k+) codek=0; for(m=0;m6;m+) POINT_COLOR=RED; LCD_ShowNum(148+(2*m-1)*8,90,codem,1,16); i=0; flag=2; if(cnt = 2) i=0; SPI_FLASH_BufferRead(u8*)GetCode, 0, sizeof(code); for(k=0;k6;k+) if(codek=GetCodek) cmt+; if(cmt=6) LCD_Clear
17、(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;k6;k+) codek=0; for(m=0;m6;m+) POINT_COLOR=RED; LCD_ShowNu
18、m(148+(2*m-1)*8,90,codem,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_ShowSt
19、ring(140,200,Keywords12); for(k=0;k6;k+) codek=0; for(m=0;m=4&cnt=9) SPI_FLASH_BufferRead(u8*)GetCode, 0, sizeof(code); for(k=0;k6;k+) if(codek=GetCodek) cmt+; if(cmt=6) for(i=0;i4;i+) LCD_Clear(WHITE); delay_ms(250); POINT_COLOR=BLUE; LCD_ShowString(100,90,Keywords8); LCD_ShowString(160,160,Keyword
20、s10); 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_COL
21、OR=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;k6;k+) codek=0; for(m=0;m6;m+) POINT_COLOR=RED; LCD_ShowNum(148+(2*m-1)*8,90,codem,1,16); cnt =3; cmt=0; 六、实验分工和安排自己编写七、对本实验课程的感想和建议自己编写
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1