微机原理课题设计实验报告之矩阵式键盘数字密码锁x.docx
《微机原理课题设计实验报告之矩阵式键盘数字密码锁x.docx》由会员分享,可在线阅读,更多相关《微机原理课题设计实验报告之矩阵式键盘数字密码锁x.docx(16页珍藏版)》请在冰豆网上搜索。
微机原理课题设计实验报告之矩阵式键盘数字密码锁x
微机原理课题设计实验报告之矩阵式键盘数字密码锁x
微机系统与应用课程设计报告
课程设计题目
成
矩阵式键盘数字密码锁设计
绩
评语:
教师:
年
月
日
班级:
学号:
姓名:
实验地点:
E楼H区311
实验时间:
20XX年.3.4-3.9
矩阵式键盘数字密码锁设计
实验目的
掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连
接能力。
初步掌握键盘扫描,密码修改和计时报警程序的编写方法。
掌握通过矩阵式键盘扫描实现密码锁功能的设计思路和实现方法。
实验内容
矩阵式键盘数字密码锁设计,根据设定好的密码,采用4x4矩阵键盘实现密码的输入功能。
当密码输入正确之后,锁就打开(绿灯亮),10秒之后,锁
自动关闭(红灯亮);如果连续输入三次密码不正确,就锁定按键5秒钟,同时发出报警(黄灯闪),5秒后,解除按键锁定,恢复密码输入。
数字密码锁操作键盘参考上面设定,也可以自行设计键盘。
用户初始密码为“*****”,系统加电运行后,密码锁初始状态为常闭(红灯亮),用户可以
选择开锁或修改密码:
如果选择开锁就按“OpeS键,系统提示输入密码,输入用户密码+“#”键后,如果密码正确,就打开锁(绿灯亮),系统等待10秒,然后重新关闭密码锁,若密码错,提示重新输入,连续三次错误,提示警告词同时报警(黄灯闪),锁定键盘5秒,然后重新进入初始状态;
如果选择修改密码就按”ModifySecret”键,系统提示输入旧密码,输入旧密码+“#”键后,如果正确,系统提示输入新密码,输入新密码+“#”后,
新密码起效,重新进入初始状态;如果旧密码错,不能修改密码,密码锁直接进入初始状态。
实验基本任务
1)具有开锁、修改用户密码等基本的密码锁功能。
2)对于超过3次密码密码错误,锁定键盘5秒,系统报警。
5秒后解除锁
^定。
4)通过LCD字符液晶和LED指示灯(红,绿,黄)实时显示相关信息。
5)用户密码为6位数字,显示采用“*”号表示。
6)码锁键盘设计合理,功能完善,方便用户使用。
本次实验还做了附加的任务
(1)增加了管理员(Admin)功能,如果用户忘记密码可向管理员求助。
管理员密码为8位数字(系统内预先已设定),管理员按“Admin”键后,系统提示输入管理员密码,输入管理员密码+“#”键后,如果正确,系统自动恢复用户初始密码为“*****”;如果错误,程序停止运行,系统退出。
2)增加了输入清除功能(*),在输入密码过程中,如果中途按下“*”键,则清除前面的输入,开始重新输入密码。
(2)增加组合键(Shift)功能,使系统的密码选择范围除数字外,另外增加
3)a,b,c,d,e,f,g,h,i,j等10个字母。
数字直接输入,字母“Shift”+“字
母”。
实验设计方案
实验用到8255作为并行接口设备,用以ISA总线与外设的连接,本次用的是8255的A口作为输出口,C口的高4位与B口是输入,C口低4位是输出口,所以控制住设置为ox8a,8253作为时钟器,作为控制提示灯的时间闪烁,8255的A口接键盘的rom,B口接col,地址线都连接在总线下面的芯片上接口,其他的读写控制线都接入ISA总线上。
如下图的接线设置
A0A1CSISA控制信接口地址TRL交通灯五.实验器材I8086CPU可编程并行接口灯,4x4矩阵键盘。
5电路连接关系:
首先将I嚣55模块的控制总线与
A0A
1CS
ISA控制信
接口
地址TRL交通灯
五.实验器材I
8086CPU可编程并行接口
灯,4x4矩阵键盘。
5电路连接关系:
首先将I嚣55模块的控制总线与总线连接,并将片选-
2、将8A53模块的控制总线与总线连接,并将片选
将DRV模块JS
将L四D模块的控制总线与总线连接,并将片选
位+
8255和键
JS8
总线(
JS4)
向PC
机送
信号可编程定时
A0A
1=1
1CS
及接
■号和地址
^0A
CD
1CS
及接
1、
3、
4、
5、
6、
8255
口
地
_8253
CS连接至000H-007H地址空间;
CS连接
显示屏,LED
008H-00FH地址空间;
口口
8(C低)连接至0010H-0017H地址空间;
CS接至
018H-01FH地址空间;
畫的连线
,连线,
8255模块
键盘PABJPA3
PC0-PC3
输入输岀方式
键盘
输岀
时钟源
JS35
输入
JS36
他们之间的连接关系如下:
8255和TRL的连线,他们之间的连接关系如下:
8255模块
LED
PB0—PB3
JS18(1-3)
7、时钟源的/64同8253的CLK0连接。
8、8253的OUT0
7、
时钟源的/64同8253的CLK0连接。
9、8253的GATE0同JS3的K7连接。
(高电平选通)
六.程序流程图
其中软硬件初始化流程如图1所示
密码锁程序运行流程如图2所示
图1.初始化流程图
r开始'
L-
1
!
软硬件初始
*LCD提示锁未开
8253定时10秒
输入用户密码
4—
核对用户密码
正确?
程序结束退出
图2密码锁程序流程图
其中密码输入模块详细流程如图3
七?
主要代码
unsignedcharkbscan()〃键盘扫描
{
introw_va={0x0e,0x0d,0x0b,0x07};//选中每一行时的A口值
unsignedchardata;
unsignedchardata_tmp;
Sleep(200);//第一次消除抖动--每次键盘扫描的时间间隔
至少为200毫秒
for(inti=0;ii++,i%=4)
{
inttmp=row_va[i];
//OutByte(0xde00,tmp);InByte(0xde01,data);if(data==NULL)//
//
OutByte(0xde00,tmp);
InByte(0xde01,data);if(data==NULL)//{}elseif((data0x0f)!
=0x0f)//按下
循环扫描第一到四行
扫描不到的情况排除掉
检测这一行是否有按键被
{
Sleep(IO);//第二次消除抖动--如果10ms之后还是相同的按键就执行下面的。
InByte(0xde01,data_tmp);
data_tmp=data_tmp0x0f;
if(data_tmp!
=data)continue;//否则不执行下面的
while(data_tmp==data)//第三次消除抖动--判断按键是否弹起。
弹起则结束循环
{
InByte(0xde01,data);data=data0x0f;
Sleep(10);
if(data==0x0f)
{
Sleep(100);
InByte(0xde01,data);data=data0x0f;
}
}
switch(data_tmp)
{
case0x0e:
returnvalue[i];
case0x0d:
returnvalue[i];
case0x0b:
returnvalue[i];
case0x07:
returnvalue[i];}
}
}
returnNULL;
}
voiddisplayOnLcd()〃在LCD上显示*号.
{
unsignedcharstmp=“*“;
for(inti=0;ii++)OutByte(0xde09,stmp[i]);
}
//主函数
//主函数
{
init8255();init8253();
init8255();
init8253();
InitLCD();
Sleep(100);unsignedchartemp;
OutByte(0xde02,0xFE);//temp='\0';//printf("pleaseinputOpen!
");while
(1)
{intj=0;
temp=kbscan();//
printf("thekey:
%c\n",temp);if(temp=='O')
{
Mimasum=0;
Clear();//while
(1){
temp=kbscan();
//初始化8255
//初始化LCD
红灯亮
指令符号
获取在键盘中得到的数字
清空屏幕
j++;
printf(”第%(1次键盘扫描:
%c\n",j,temp);if(isnum(temp))
{
if(Mimasum6)
{
Wodemima[Mimasum]=temp;
Mimasum++;displayOnLcd();//}}
Mimasum++;
displayOnLcd();//
}
}
elseif(isoper(temp))
{
if(temp=='#')//
{
if(Mimasum==6)
{
if(Newmima==true)//
密码正确--修改密码
{
inti;
for(i=0;ii++)
上屏幕LCD一个*号
密码匹配
修改密码标志为true且原
Mimachar[i]=Wodemima[i];
Newmima=false;printf("新密码为:
");
true--修改密码
赋值为true
输入新密码
10S
绿灯灭
面
次!
!
\n",Errorcount);
输入的显示
for(i=0;ii++)
{printf("%c",Mimachar[i]);
}
printf("\n");
}
elseif(Equal(Mimachar,Wodemima))
{
if(Modify==true)//Modify为
{
Newmima=true;//
把修改密码标志
Modify=false;
Mimasum=0;
Clear();//清空屏幕
printf("输入新密码:
\n");//提示:
}
else
{
printf("密码正确!
\n");
OutByte(0xde02,0x7f);//绿灯亮
Sleep(*****);//绿灯亮
OutByte(0xde02,0xFE);//红灯亮
Mimasum=0;
Errorcount=0;
gotoStart_Position;//回到最前
}
}
else
{
Errorcount++;
printf("密码错误次数%d
if(Errorcount=3)//提示重新
{
OutByte(0xde02,0xFD);//黄灯亮
Sleep(1000);
OutByte(0xde02,0xFF);//黄
灯灭
绿灯灭
Sleep(1000);
OutByte(0xde02,0xFD);//Sleep(1000);
OutByte(0xde02,0xFF);//
黄灯亮
Sleep(1000);
OutByte(0xde02,0xFD);//
黄灯亮
Sleep(1000);
OutByte(0xde02,0xFE);//
红灯亮
Mimasum=0;//
初始
Errorcount=0;
Clear();//
清空屏幕
gotoStart_Position;
黄
}
else
{
printf("请重新输入密码:
\n");
}
}
}
}
elseif(temp=='*')
{
Mimasum=0;//
重新输入密码
Clear();//
清空屏幕
}
elseif(temp=='A')
{
Guanlisum=0;
Clear();//
清空屏幕
printf("请输入管理员密码:
\n");while
(1)//输入管理员密码{
temp=kbscan();printf("one次键盘扫描:
%c\n",temp);if(isnum(temp))
{
if(Guanlisum8)
{
Guanlichar[Guanlisum]=temp;
Guanlisum++;
displayOnLcd();//上屏幕
LCD号
}
elseif(isoper(temp))
{
if(temp=='#'Guanlisum==8)
{
inti;
for(i=0;ii++)
{
if(Guanlikey[i]!
=Guanlichar[i])return0;
}
Mimachar='1';
Mimachar='2';
Mimachar='3';
Mimachar='4';
Mimachar='5';
Mimachar='6';
printf("密码初始化完成.\n");
Guanlisum=0;
Mimasum=0;
Errorcount=0;
Modify=false;
Newmima=false;
gotoStart_Position;//回到开始}
elseif(temp=='*')
{
Guanlisum=0;
Clear();//清空屏
}
}
}
}
elseif(temp=='M')
{
Modify=true;
Mimasum=0;
Clear();
printf("请输入原密码:
\n");
}
coutendl;end8255();
//CloseDevice();
return0;
}
八.实验心得通过这次微机课题设计实验,使我学到了不少实用的知识,更重要的是做实验的过程,思考问题的方法,这与其他的实验师通用的,真正使我受益匪浅。
在做实验之前,我没有完全将课本上的理论知识掌握透彻,但在老师的讲解中,以及实践中对这些知识的理解有了很大一步的掌握。
对汇编语言的编程和微机系统的芯片有了比较深刻的认识。