微机原理课题设计实验报告之矩阵式键盘数字密码锁_第1页
微机原理课题设计实验报告之矩阵式键盘数字密码锁_第2页
微机原理课题设计实验报告之矩阵式键盘数字密码锁_第3页
微机原理课题设计实验报告之矩阵式键盘数字密码锁_第4页
微机原理课题设计实验报告之矩阵式键盘数字密码锁_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机系统与应用课程设计报告课程设计题目成绩矩阵式键盘数字密码锁设计评 语:教 师:年 月 日班 级: 031013 学 号: 03101305 姓 名: 林佳福 实验地点: E楼区312 实验时间: 2013.3.12-3.17 矩阵式键盘数字密码锁设计 一 . 实验目的1. 掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。2. 初步掌握键盘扫描,密码修改和计时报警程序的编写方法。3. 掌握通过矩阵式键盘扫描实现密码锁功能的设计思路和实现方法。二 实验内容矩阵式键盘数字密码锁设计,根据设定好的密码,采用4x4矩阵键盘实现密码的输入功能。当密码输入正确之后,锁就打开(绿灯亮

2、),10秒之后,锁自动关闭(红灯亮);如果连续输入三次密码不正确,就锁定按键5秒钟,同时发出报警(黄灯闪),5秒后,解除按键锁定,恢复密码输入。数字密码锁操作键盘参考上面设定,也可以自行设计键盘。用户初始密码为“123456”,系统加电运行后,密码锁初始状态为常闭(红灯亮),用户可以选择开锁或修改密码:如果选择开锁就按“Open”键,系统提示输入密码,输入用户密码+“#”键后,如果密码正确,就打开锁(绿灯亮),系统等待10秒,然后重新关闭密码锁,若密码错,提示重新输入,连续三次错误,提示警告词同时报警(黄灯闪),锁定键盘5秒,然后重新进入初始状态;如果选择修改密码就按”Modify Secre

3、t”键,系统提示输入旧密码,输入旧密码+“#”键后,如果正确,系统提示输入新密码,输入新密码+“#”后,新密码起效,重新进入初始状态;如果旧密码错,不能修改密码,密码锁直接进入初始状态。三 实验基本任务 1)具有开锁、修改用户密码等基本的密码锁功能。2)对于超过3次密码密码错误,锁定键盘5秒,系统报警。5秒后解除锁定。4)通过LCD字符液晶和LED指示灯(红,绿,黄)实时显示相关信息。 5)用户密码为6位数字,显示采用 “*” 号表示。6)码锁键盘设计合理,功能完善,方便用户使用。本次实验还做了附加的任务( 1) 增加了管理员(Admin)功能,如果用户忘记密码可向管理员求助。管理员密码为8位

4、数字(系统内预先已设定),管理员按“Admin”键后,系统提示输入管理员密码,输入管理员密码+“#”键后,如果正确,系统自动恢复用户初始密码为“123456”;如果错误,程序停止运行,系统退出。2)增加了输入清除功能(*),在输入密码过程中,如果中途按下“*”键,则清除前面的输入,开始重新输入密码。四 . 实验设计方案 实验用到8255作为并行接口设备,用以ISA总线与外设的连接,本次用的是8255的A口作为输出口,C口的高4位与B口是输入,C口低4位是输出口,所以控制住设置为ox8a,8253作为时钟器,作为控制提示灯的时间闪烁,8255的A口接键盘的rom,B口接col,地址线都连接在总线

5、下面的芯片上接口,其他的读写控制线都接入ISA总线上。如下图的接线设置 ISA控制信号和地址总线(JS4)B口低三位A0A1CS及接口地址C口低四位8255键盘KEYA口低四位向PC机送信号接口地址JS8A0A1CS及接口地址8253时钟源(JS32)A0A1CS及接口地址LCDTRL交通灯五 实验器材8086CPU,可编程并行接口8255,可编程定时器8253,LCD显示屏,LED灯,4x4矩阵键盘。六 实验原理图七 程序代码 #include "StdAfx.h"#include "PCI9052DLL.h"#include "stdio.

6、h"#include "math.h"#include "string.h"#include "stdlib.h"#include "iostream.h"#include "windows.h"unsigned char value44='1','2','3','M','4','5','6','O','7','8','

7、9','A','0','#','*','S'/键盘标示unsigned char little44='a','b','c','0','d','e','f','0','g','h','i','0','j','0','0','S'/shift键的字母表示cha

8、r Mimachar6='1','2','3','4','5','6'char Guanlikey8='1','2','3','4','5','6','7','8'int Mimasum=0;int Guanlisum=0;char Wodemima6;char Guanlichar8;bool Modify=false;bool Newmima=false;int Err

9、orcount=0;bool Equal(char a,char b)/比较字符串是否相等int i;for(i=0;i<6;i+)if(Mimachari!=Wodemimai) return false;return true;bool isnum(char tmp)/判断是否为数字return tmp<='9'&&tmp>='0'bool isoper(char tmp)/判断是否为操作符return tmp='#'|tmp='*'|tmp='S'|tmp='A

10、9;|tmp='O'|tmp='M' ? true : false;bool ischar(char tmp)/判断是否为小写字母return tmp>='a'&&tmp<='j'void init8255()/初始化8255OpenDevice();OutByte(0xde03, 0x82);void end8255()/结束8255CloseDevice();void InitLCD()/初始化LCDunsigned char data4=0x01,0x06,0x0f,0x38;unsigned c

11、har ch6="Open!"int i; for (i=0;i<4;i+)OutByte(0xde08, datai);/?! Sleep(100);for (i=0;i<6;i+)OutByte(0xde09, chi);/在LCD上显示Open! Sleep(50 );Sleep(1000);void init8253()/初始化8253OpenDevice();unsigned char kbscan()/键盘扫描int row_va4=0x0e,0x0d,0x0b,0x07; /选中每一行时的A口值unsigned char data;unsigned

12、 char data_tmp;Sleep(200); /第一次消除抖动-每次键盘扫描的时间间隔至少为200毫秒for(int i=0;i<4;i+,i%=4)int tmp=row_vai;OutByte(0xde00, tmp); /循环扫描第一到四行InByte(0xde01,&data);if(data=NULL) /扫描不到的情况排除掉 else if(data&0x0f)!=0x0f) /检测这一行是否有按键被按下Sleep(10);/第二次消除抖动-如果10ms之后还是相同的按键就执行下面的。InByte(0xde01,&data_tmp);data_

13、tmp=data_tmp&0x0f;if(data_tmp!=data) continue; /否则不执行下面的while(data_tmp=data)/第三次消除抖动-判断按键是否弹起。弹起则结束循环InByte(0xde01,&data);data=data&0x0f;Sleep(10);if(data=0x0f)Sleep(100);InByte(0xde01,&data);data=data&0x0f;switch(data_tmp)case 0x0e: return valuei0;case 0x0d: return valuei1;case

14、0x0b: return valuei2;case 0x07: return valuei3; return NULL;void Clear()/清空屏幕OutByte(0xde08,0x01);void displayOnLcd()/在LCD上显示*号.unsigned char stmp2="*" for (int i=0;i<1;i+) OutByte(0xde09, stmpi);int main(int argc, char* argv)/主函数 init8255(); /初始化8255init8253();InitLCD();/初始化LCDSleep(10

15、0);unsigned char temp;Start_Position:/->->-> 起始位置-起始条件OutByte(0xde02,0xFE); /红灯亮temp = '0' /指令符号printf("please input Open!");while(1) int j=0;temp = kbscan(); /获取在键盘中得到的数字printf("the key:%cn",temp);if(temp='O')Mimasum=0;Clear(); /清空屏幕while(1)temp = kbscan

16、(); j+;printf("第%d次键盘扫描:%cn",j,temp);if(isnum(temp)if(Mimasum<6)WodemimaMimasum=temp;Mimasum+;displayOnLcd(); /上屏幕LCD一个*号else if(isoper(temp)if(temp='#') /密码匹配if(Mimasum=6) if(Newmima=true) /修改密码标志为true且原密码正确-修改密码int i;for(i=0;i<6;i+) Mimachari=Wodemimai;Newmima=false;printf(

17、"新密码为:");for(i=0;i<6;i+)printf("%c",Mimachari);printf("n");else if(Equal(Mimachar,Wodemima)if(Modify=true) /Modify为true-修改密码Newmima=true; /把修改密码标志赋值为trueModify=false;Mimasum=0;Clear(); /清空屏幕printf("输入新密码:n"); /提示:输入新密码elseprintf("密码正确!n");OutByte(

18、0xde02,0x7f); /绿灯亮Sleep(10000); /绿灯亮10SOutByte(0xde02,0xFE); /红灯亮&&绿灯灭Mimasum=0;Errorcount=0;goto Start_Position; /回到最前面elseErrorcount+;printf("密码错误次数%d次!n",Errorcount);if(Errorcount>=3) /提示重新输入的显示 OutByte(0xde02,0xFD); /黄灯亮Sleep(1000); OutByte(0xde02,0xFF); /黄灯灭Sleep(1000);OutB

19、yte(0xde02,0xFD); /黄灯亮Sleep(1000); OutByte(0xde02,0xFF); /黄灯灭Sleep(1000);OutByte(0xde02,0xFD); /黄灯亮Sleep(1000);OutByte(0xde02,0xFE); /红灯亮&&绿灯灭Mimasum=0; /初始Errorcount=0;Clear(); /清空屏幕goto Start_Position;elseprintf("请重新输入密码:n");else if(temp='*')Mimasum=0; /重新输入密码Clear(); /清空

20、屏幕else if(temp='A')Guanlisum=0;Clear(); /清空屏幕printf("请输入管理员密码:n");while(1) /输入管理员密码temp = kbscan();printf("one次键盘扫描:%cn",temp);if(isnum(temp)if(Guanlisum<8)GuanlicharGuanlisum=temp;Guanlisum+;displayOnLcd(); /上屏幕LCD*号else if(isoper(temp)if(temp='#'&& Guanlisum=8)int i;for(i=0;i<8;i+)if(Guanlikeyi!=Guanlichari) retu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论