1、(2) 从键盘输入密码,比较键盘输入的密码与 Flash 中存储的密码是否相同。(3) 如果密码正确,则 LED 灯点亮;如果密码不正确,则 LED 灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。扩展功能:(1) 首先显示“请输入密码:”,显示密码锁背景图片 1。(2) 如果密码正确则显示“密码正确”,显示成功进入系统的背景图片 2。(3) 如果密码不正确则显示“密码不正确,请重新输入:”(4) 如果连续三次输入密码错误则显示“对不起,您已经连续三次输入密码错误,系统锁定”,显示图片 1。3、个人开发流程(1) 了解开发板的硬件结构编写适应其硬件结构的程序。(2) 掌握并
2、编写 LCD 显示文本和图片程序。(3) 通过 EBI 对外部 LED 灯进行控制。(4) 键盘键值读取,及密码锁密码比对,密码锁状态转换的程序编写。2、硬件设计及描述1、LED 灯模块CPU 的数据总线低 8 位连接到锁存器 74HC273 的信号输入端,CPU 外部总线接口(EBI)的 nECS0 片选信号连接到锁存器的锁存控制信号,当 CPU访问BANK0 的任一地址空间是,数据总线的低八位的数据被锁存输出,作为控制 8 个 LED 等的发光状态的控制信号,当写入 0xff 是,8 个 LED 灯都灭,写 0x00,8 个 LED 灯都亮。硬件连接图如下。2、KPI 工作模块行列式键盘以
3、矩阵形式排列,每个键有一常开触点,其两端分别于输出扫描线和输入状态线相连,键盘中有无键按下,是由列线扫描输出、读入行线状态 来判断。每个键都有一个键值和键号,通常将行、列按二进制顺序组合成酱汁, 经过查表获得键号。硬件连接图如下3、LCD 工作模块该模块由 40 个引脚与外界电路相连,由于本身没有寄存器,需要 W90P710 提供的 LCD 控制寄存器来控制选择对应的液晶类型及显示形式,FIFO 的使用, 颜色的显示模式和时序的设置,并通过配置相应的寄存器就可实现。4、软件设计及描述1、KPI 模块设计实验中的 GPIO 为键盘模式,使用的是 GPIO_CFG2,查找相应的寄存器进行设置,打开
4、键盘中断,设定中断触发方式和优先级,扫描功能打开,时间约为100ms。2、LCD 显示模块初始化呢控制寄存器,设定 lcd 控制器和中断服务程序,并写到 AIC 中断向量表中。关闭 FIFO1 和 FIFO0,关闭绿的控制器,重置控制器,再讲显示的数据发送到缓存区中,根据时序的配置,从缓冲区中将数据读入液晶。3、整体模块设计及程序流程图在主程序中进行按键初始化,在中断程序中实现,按键值的读取和存储, 通过设定状态标志位,数组。对存储的密码和输入的密码进行比较,判断对错从而改变状态标志位,在中短结束,回到主程序后通过识别状态标志位,显示相应的图形和文字。5、程序代码(主要程序,函数部分见附录)1
5、 、 main.c #include #include 710defs.h/*头文件声明*/ #include HB_it.hmain.h #include lcd_pattern.h extern U8 a6;extern int p;extern U32 KeyValue; int main(void)U32 FLL;int cnt,i;U8 wchar= 设置密码; U8 wchar1= 请输密码 U8 wchar2= 密码正确 U8 wchar3= 密码错误U8 wchar4= 对不起,您已经连续三次输入密码错误,系统锁定LCD_IMAGE_T LCD_Size;/*声明结构体,结构体
6、的具体定义在头文LCD_LOCATION_T LCD_Location;件中*/LCDShowParameter LSP;LCD_Size.width = 480;/*定义 lcd 的显示的长宽像素值*/ LCD_Size.height = 240;LCD_Location.StartX = 0;/*设定显示的起始坐标*/ LCD_Location.StartY = 0;LCD_Location.EndX = 960;LCD_Location.EndY = 240;便显示*/LCDInit();/*初始化*/LCDShow(LCD_Size, LCD_Location);LCDFIFOBuff
7、erSet(BlackBoard);/*将要显示的图片存入缓存中,以LCDDisplayOn();/*显示图片*/KPIInit();/*按键初始化*/printf(Please press keys.n);/*并通过串口输出此时的键值*/ USIInit(); /读器件 ID/*初始化 flash 芯片*/读器件 ID:USIRead_ID(); /擦除扇区 0写使能:n USIWriteEnable(); while(USICheckBusy(); USISectorErease(0x0); EBILedInit(0x0); LSP.StartX = 8;LSP.StartY = 7; L
8、SP.LibPlace = 0x400000; LSP.Color = 0x07ff; LSP.LetterChar = wchar1;LSP.LCDBuffer = BlackBoard;LCDOutputShow(LSP,4); EBILedSet(0x00); while(1)if(p=6)LCDInit(); LCDFIFOBufferSet(BlackBoard); LCDDisplayOn();LSP.StartX = 8;LSP.LetterChar = wchar1; /*正确密码*/ LSP.LCDBuffer = BlackBoard;Delay(10000000);if(
9、p=1) LCDInit();LSP.StartX = 5;LSP.StartY = 5;LSP.LetterChar = wchar2;LCDOutputShow(LSP,22);if(p=2) LCDInit();LSP.LetterChar = wchar3; /*密码错误*/ LSP.LCDBuffer = BlackBoard;if(p=3)LSP.LetterChar = wchar4; /*请输密码*/ LSP.LCDBuffer = BlackBoard;return 0;2、中断服务程序void KPI_Handler(void)/U32 KeyValue, tmp; int
10、 cnt,sum=0;/int shuru;/int i;tmp = REG_KPISTATUS; /取按键值tmp &= 0x0000000f; /因为硬件连接关系,需要对按键进行处理if(tmp 0x7) & (tmp 0x3) & 0x8)KeyValue = tmp + 4;elseKeyValue = tmp;KPI interrupts. %xn, KeyValue);if(c6 & c13)bc-7=KeyValue;/*输入密码*/else if(c=13)USIRead(0x0,a);/*将输入密码放入在 flash 芯片中存储呢*/for(cnt=0;cnt6;cnt+)i
11、f(acnt=bcnt) /*比对密码*/sum+;if(sum=6)测试成功%dn,sum); /*密码正确状态位为 1*/p=1;测试失败%dnp=2;13 &20)bc-14=KeyValue;/*继续读取密码*/else if(c=20)/*继续比对密码*/ for(cnt=0;if(acnt=bcnt) sum+;p=3;20 &27)bc-21=KeyValue;else if(c=27)/*第三次比对*/p=4;else/*这之后程序不再允许进行输入*/invalid operationsnc+;六、实验结果截图(1) 密码锁初始状态,显示设置密码,显示图片 1。(2) 设置密码
12、后显示,输入密码。(3) 当连续输入错误的密码,系统显示密码错误,并且锁定系统。(4) 当输入密码正确时,显示图片 2。七、课程设计体会经过这次课程设计,我对 arm 芯片有了更深入的理解,同时在操作W90P710 这款芯片开发板的过程中提高了动手能力。掌握了 ADS 集成开发环境及 JTAG 仿真器的使用。通过实践,不断更改调试程序的过程中,我对理论学习长得中断源程序的编写、GPIO 控制寄存器、中断寄存器的控制、对库函数的调用有了更好的理解和掌握。 同时也意识到自己的不足,学好汇编和 c 语言基础是未来面向硬件编程的重要基础,在 c 语言部分,指针的知识与应用还需加强。本次课程设计的过程中
13、体现出了 arm 系列芯片较传统 mcu 的优势,接口丰富, 内部存储资源更充裕。但是本次课设主要是运用了芯片偏向 mcu 的功能,并没有在芯片中加载操作系统。Arm 系列的学习才刚刚开始,仅在入门阶段,未来需要深入继续学习嵌入式知识,使自己的技能更上一层楼。八、参考文献1 张毅坤,陈善久,裘雪红.单片微型计算机原理及应用.西安电子科技大学出版社.2008 年 5 月2 华成英,童诗白.模拟电子技术基础.高等教育出版社,2007 年 8月3 唐俊翟等 单片机原理与应用 冶金工业出版社, 2003.94 刘瑞新等 单片机原理及应用教程 机械工业出版社, 2003.75 吴国经等 单片机应用技术
14、中国电力出版社, 2004.16 李全利,迟荣强编著 单片机原理及接口技术 高等教育出版社,2004.1 九、附录/* Function Name: LCDInit* Description: LCD 初始化* Input: None* Output:* Return:*/ void LCDInit(void)REG_GPIO_CFG6 = 0x555555;REG_LCD_LCDCON = 0x30c05; REG_LCD_FIFO1PRM = 0xa;REG_LCD_F1DREQCNT = 0x1e000f0; REG_LCD_FIFO1RELACOLCNT = 0x1e0;/LCD CL
15、KREG_LCD_LCDTCON1 = 0x3b166; REG_LCD_LCDTCON2 = 0x3bf00f1; REG_LCD_LCDTCON3 = 0x105401;REG_LCD_LCDTCON4 = 0x20101; REG_LCD_LCDTCON5 = 0xe; LCDShow 设置 LCD 显示位置*/void LCDShow(LCD_IMAGE_T Size, LCD_LOCATION_T Location)REG_LCD_F1DREQCNT = (Size.width 1);REG_LCD_DISPWINS = (Location.StartY 16) + Location
16、.StartX; REG_LCD_DISPWINE = (Location.EndY 16) + Location.EndX; LCDFIFOBufferSet 指向 LCD 缓冲区存取图像内容 数组名称void LCDFIFOBufferSet(PUINT8 Buffer)REG_LCD_F1SADDR = (U32) Buffer; LCDDisplayOn 打开 LCDvoid LCDDisplayOn(void)lcdIoctl(1, 1, 0); LCDDisplayOff 关闭 LCDvoid LCDDisplayOff(void)lcdIoctl(1, 2, 0); Delay
17、用于不精确延时 延时时间*/ void Delay(U32 t)dot-;while(t); StringShow 显示单个字符 LCD 显示字符相关信息void StringShow(LCDShowParameter LCDShowPara)/用于取汉字点阵图 U32 Offset = 0, Length = 0; U8 PBuffer32 = 0;/用于将汉字点阵图转化为 LCD 显示图U32 BitCounter = 8; /8 U32 ByteCounter = 0; /32 U32 temp;U8 ColorHigh, ColorLow;/用于在 LCD 上显示汉字U32 X = 0, Y = 0, Line = 0, Row = 0; U8 LBuffer512 = 0;Offset=(LCDShowPara.LetterChar0-0xa1)*0x5e+ (LCDShowPara.Le
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2