找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14280|回复: 6
收起左侧

8086与8255A多功能密码锁的设计(仿真+源代码)微机原理课设报告

  [复制链接]
ID:430264 发表于 2018-11-20 23:06 | 显示全部楼层 |阅读模式
自动化科学与工程学院

《微机原理与应用》课程设计报告

多功能密码锁的设计

  专业: 自动化科学与工程学院

目录
一、目的3
二、内容3
三、设计任务3
四、方案选择及原理3
五、所用器件3
主要器件简介4
六、原理图7
1、8086与8255A连接7
2、 8255A的A口、C口与矩阵键盘连接7
3、8255A的A口、B口与数码管的连接7
4、8086与8253连接8
5、完整电路图9
七、软件设计思路10
八、流程图11
1、主程序11
2、子程序12
九、程序代码14
十、设计中的难点23
十一、收获及体会24
十二、参考文献25

目的
  • 了解和掌握808682558253,等接口芯片以及LED显示器的原理和功能;
  • 能用这些接口芯片构建一个简单的系统控制对象,
  • 掌握接口电路的综合设计与使用;
  • 通过自己动手,进一步了解计算机得工作原理,接口技术,提高计算机硬件,软件综合应用能力,即对微机原理,接口技术,汇编语言程序设计进行综合训练。
二、内容
密码锁在输入密码正确的条件下输出开锁电平,控制电控锁开启,同
显示00字样。当输入密码错误时,发出错误警告声音,同时显示FF字样。当六次误码输入的条件下,产生报警电平报警。还可以实现对密码的修改,修改成功后,蜂鸣器发出确认音。
三、设计任务
1、选用8086和适当的存储器及接口芯片完成相应的功能。
2、用LED显示器显示电子锁的当前状态。
3、画出详细的硬件连接图。
4、给出程序设计思路、画出软件流程图。
5、给出地址分配表。
6、给出所有程序清单并加上必要注释。
7、完成设计说明书(列出参考文献,所用器件型号)。
四、方案选择及原理
这次的设计要求是在密码输入正确时输出开锁电平和显示“00”,密码错误时显示“FF”和蜂鸣器发出报警声音等,我们采用8255A的A口低四位和C口的低三位组成4x3的矩阵键盘,同时A口的低六位为选管;B口作为显示器的输出;C口高四位的PC4口输出开锁电平,对于6次密码错误输入,PC5口输出报警电平。用8253计数器产生警告音和确认音。用蜂鸣器发声次数来区分确认和警告声音,一声表示确认,三声表示警告。采用Proteus自带的键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键,每次对键盘扫描,获得对应的键值。
五、所用器件
CPU8086、并行接口8255A、地址锁存器74LS273、4 线-16 线译码器74HCT154、石英晶振,可编程定时/计数器8253、共阴极数码管、各类逻辑门、蜂鸣器,电阻、键盘等。
主要器件简介
CPU8086

8086是Inter系列的16位微处理器,芯片上有2.9万个晶体管,采用 HMOS工 艺制造,用单一的+5V电源,时钟频率为5MHz~10MHz。 8086有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据。可 寻址的内存空间为1MB。

并行接口8255
Intel 8086/8088 系列的可编程外设接口电路(Programmable Peripheral Interface)简称 PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。
可编程定时/计数器8253
8253可编程定时器/计数器是8086微机系统常用的定时/计数器芯片,它具有定时与计数两大功能。8253可编程定时器/计数器具有3个独立的16位计数器通过编程可选择六种工作方式 ,可选择二进制或十进制计数,最高计数速率可达2.6MHz。所有的输入、输出电平都与TTL兼容。

地址锁存器74LS273
地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。
4 线-16 线译码器74HCT154
74HCT154 为4 线-16 线译码器,将4 个二进制编码输入译成16 个彼独立的输出之一,并能将数据从一个输入线分配到16 个输出的任意一个而实现解调功能,与大部分TTL 和DTL [url=]电路[/url]完全兼容。其工作原理如下:这种单片4 线—16 线译码器非常适合用于高性能存储器的译码器。当两个选通输入G1 和G2 为低时,它可将4 个二进制编码的输入译成16 个互相独立的输出之一。实现解调功能的办法是:用4 个输入线写出输出线的地址,使得在一个选通输入为低时数据通过另一个选通输入。当任何一个选通输入是高时,所有输出都为高。
六、原理图
1、8086和8255A连接
8255A地址分配:PA:200H  PB:202H  PC:204H  控制寄存器:206H
为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。
2、8255A的A口、C口与矩阵键盘连接
键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键。
数字键1-9的键值为相应的数值,数字键0的键值为0BH,功能键*的键值为0AH,能键#的键值为0CH。
3、8255A的A口、B口与数码管的连接
8255A的B口输出数码管的段码,A口输出数码管的位码。
4、8086与8253连接
8253地址分配:计数器0:400H 计数器1:402H 计数器2:404H控制寄存器:406H
为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。

  • 完整电路图
七、软件设计思路
整个硬件设计,主要采用器件CPU8086、并行接口8255和可编程定时/计数器8253。由并行接口8255控制键盘扫描、数码管显示、开锁电平以及报警电平,8255的工作方式是A口输出,B口输出,C口高四位输出,C口低四位输入。通过键盘扫描获得对应的键值,通过对键值判断,判断按键是功能键或数字键,达到输入密码,修改密码,确认输入,返回等功能。由可编程定时/计数器8253产生方波,控制蜂鸣器产生“滴”声。8253工作在计数器0方式3,产生方波,通过延时,是蜂鸣器产生“滴”。8253在每次调用发声子程序中初始化。
根据条件要求,程序首先需要实现的是输入密码。为了区别输入密码和修改密码,当数码管显示都显示“—”,是输入密码。当数码管全灭时,是修改密码。当密码输入完且按下确认键,则输入数字与密码比对。密码正确,则输出开锁电平(高电平有效)。在此时,则可以通过功能键修改密码,密码修改成功发出“滴”声。若不需要,按返回键返回。若密码错误,则发出三声“滴”声,密码错误次数加1,并判断是否已经输入六次错误,是则输出报警电平(高电平有效),并置密码错误次数置0,等待返回键返回;否则等待返回按键返回。
为了实现上述程序,首先要初始化8086、8255,接着进入键盘扫描。每次有按键输入后,还应判断按键是否弹起,可以实现键盘消抖。无论密码正确与否,均需要通过返回键才能返回,所以每次显示完后都要对键盘扫描,判断是否按下返回键,有则退出键盘扫描,没有则继续扫描。开锁电平以及报警电平均在返回时置低电平。
、流程图
主程序流程图


修改密码子程序流程图开锁子程序流程图



































闭锁子程序流程图


十、设计中的难点
1.硬件
虽然是第一次接触proteus,在硬件接线方面遇到种种困难。特别是总线的接法,因为以前没有接触过,完全无从下手。但是经过几天的找资料以及学习,通过多次的尝试,终于把硬件接线完成。
2.软件
软件设计基于我们这学期微机实验课上的键盘扫描程序。整个系统中,我觉得最重要的同时最难的就是键盘扫描程序的设计。一开始,对于键盘扫描还未完全搞懂,还没有对键盘赋键值这个概念,导致前期一直都在探索中。接着,程序可以获得相应的键值,可是获得按键值后就很不稳定,比如,我想通过#键来达到确认和返回两个功能,但是总是一确认以后就马上执行返回功能。程序逻辑没有错误,后来参考书本的程序,原来每次获得键值后都要对键盘进行再次扫描,判断按键是否弹起,未弹起则跳到下一步。 如此,#键就能完美执行这两个功能。
十一、收获及体会
1、下面就以硬件方面我做一下总结:

硬件部分主要是设计原理图跟连接线路,这次主要是用到Proteus这个软件,这个软件之前没接触过,所以在下载下来以后第一件事就是上网看教程,看了两三个教程之后大概就明白了它的大体操作,开始自己动手绘图。
在绘图之前,根据需要实现的功能,选定要用到的元件,最后初步定下来一个图样,但是在实际绘图过程中发现太过复杂了,又重新制定了一个图样。因为是第一次用这个软件,里面很多功能都不懂,经常点出很多不懂得文件,最后不得不重新设计,导致绘图时间大大增加。在多次实践后我终于较为熟练的掌握里面的工具了,后面的绘图过程也就相对来说比较轻松,找出了自己绘制元件的时候有些麻烦,不过碰到不会的就上网百度或者问问同学,其实这个绘图过程还是挺有意思的。线路图终于接好了,这里可以总结为三点:
第一,在绘图之前一定要先熟练掌握Proteus这个软件;第二,一点要把程序看懂,这样才可以合理布线路图;第三,在搜索元件的过程中可以大量的求助百度,里面有很多元件库表,这样可以大大缩短查找时间。
通过这一两个星期的学习,掌握了Proteus一些基本的操作以及仿真,相信对以后的学习生活中都大有帮助。

2、软件设计总结:

这次课程设计中,最重点的部分应该属于软件部分。刚刚学习了《微机原理与接口技术》这么课程,一切都觉得那么新鲜。自己一些想法,可以通过实践来实现。软件设计之前,自己大概想好了大体的思路,但是程序需要严格的逻辑,严格的语法,有时按着自己的思路去写程序,却总是发现错误,或者程序不稳定,有时是达不到预期的效果。理论和实践还是有着很多的差距。这次课程设计中,收获最大的是如何确定一个程序的主线。以前写程序,就是想到哪就写哪,写完以后,才发现,有一个小的功能已经无法实现。如果要加入这个功能,却需要改动整个程序,导致程序的兼容性很差。在这次设计中,我先确定了整个程序的主线。输入密码,对比密码,密码正确或密码错误。然后其他程序皆在这几个部分中实现。
比如修改密码则在密码正确中实现,开锁电平也是在密码正确中输出;而报警电平则在密码错误部分实现。由此,我就确定了整个程序的框架,剩下的就是注意一些细节的问题,一些逻辑的问题。
     经过一周的奋战,终于还是完成了整个程序的编写。在设计程序的过程中,我不仅对以前学过的汇编语言进行了重温和查漏补缺,而且对程序整体的把握和细节的处理能力得到了很大的提高。毕竟看程序和写程序是有很大区别的,只有实践才能真正将汇编语言学到家。看到仿真的结果和题目所要求的一样,心情倍感欣慰,同时也很有成就感。
整个程序完成了,虽然已经达到了题目的要求,但是自己觉得还可以继续改善。用句至理名言:好作文不是写出来的,是改出来的。我此刻只想说的是:好程序不是写出来的,也是改出来。在以后的日子了,有空的时候可以拿出自己的程序,好好修改完善,实现更多的功能,程序进一步优化。


单片机源程序如下:
  1. IOY0         EQU   0200H           ;8255片选端口始地址
  2. MY8255_A     EQU   IOY0+00H*2      ;8255的A口地址
  3. MY8255_B     EQU   IOY0+01H*2      ;8255的B口地址
  4. MY8255_C     EQU   IOY0+02H*2      ;8255的C口地址
  5. MY8255_MODE  EQU   IOY0+03H*2      ;8255的控制寄存器地址  
  6. IOY1           EQU   0400H         ;8253片选端口始地址
  7. MY8253_COUNT0  EQU   IOY1+00H*2    ;8253计数器0端口地址
  8. MY8253_COUNT1  EQU   IOY1+01H*2    ;8253计数器1端口地址
  9. MY8253_COUNT2  EQU   IOY1+02H*2    ;8253计数器2端口地址
  10. MY8253_MODE    EQU   IOY1+03H*2    ;8253控制寄存器端口地址


  11. DATA   SEGMENT
  12. COUNT1 DB  00H  
  13. COUNT2 DB  00H    ;错误密码次数
  14. DTABLE DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,3FH,39H,5EH,79H,71H,00H,40H    ;键值表,0~F对应的7段数码管的段位值
  15.                                                                                        ;DTABLE[11]=3FH对应键值11,显示"0"
  16.                                                                                        ;DTABLE[16]=00H,数码管熄灭
  17.                                                                                        ;DATABLE[17]=04H,显示数码管"-"

  18. STRING DB   01H,02H,03H,04H,05H,06H    ;初始密码,密码内存空间
  19. DATA   ENDS                        

  20. STACK1 SEGMENT STACK
  21.         DW 256 DUP(?)
  22. STACK1 ENDS  

  23. CODE   SEGMENT
  24.               ASSUME CS:CODE,DS:DATA,SS:STACK1

  25. START: MOV  AX,DATA               
  26.            MOV  DS,AX                                          
  27.            
  28. START1:MOV  DX,MY8255_MODE         ;初始化8255工作方式
  29.        MOV  AL,81H                 ;方式0,A口、B口输出,C口高四位输出,C口低4位输入  
  30.            OUT  DX,AL

  31.        MOV DX,MY8255_C             ;开锁电平、报警电平置0
  32.        MOV  AL,00H
  33.        OUT DX,AL

  34.        MOV  SI,0200H               ;建立缓冲区,存放要显示的键值
  35.            MOV  AL,11H                 ;先初始化键值为11H,显示"-"
  36.            MOV  [SI],AL
  37.            MOV  [SI+1],AL
  38.            MOV  [SI+2],AL
  39.            MOV  [SI+3],AL
  40.            MOV  [SI+4],AL
  41.            MOV  [SI+5],AL
  42.            MOV  DI,0205H   
  43.            
  44.            

  45. BEGIN:  
  46.         CALL KEYPAD                 ;键盘扫描
  47.         CMP AL,0CH                  ;确认键
  48.         JZ  RENZ
  49.         CMP AL,0AH                  ;修改密码键,此处不用,返回键盘扫描
  50.         JZ  BEGIN
  51.         CALL PUTBUF                 ;保存按键值   
  52.         CALL KEYLS                  ;按键未弹起则继续循环等待弹起
  53.         JMP BEGIN
  54.                                        
  55. RENZ:   CALL KEYLS                  
  56.         CALL CRCMP                   ;密码比对
  57.         CMP CX,0FFH
  58.         JZ SHOW1
  59.         JMP SHOW2
  60. SHOW1:  CALL SHOWC                    ;密码错误              
  61.             JMP START1      

  62. SHOW2: CALL SHOWO                    ;密码正确
  63.     ;   JMP START1

  64. QUIT: HLT


  65.       
  66. KEYPAD  PROC NEAR                   ;键盘扫描程序
  67. BEGINk:
  68.         CALL DIS                    ;显示刷新                     
  69.             CALL CLEAR                  ;清屏
  70.             CALL CCSCAN                 ;扫描按键
  71.             JNZ  GETKEY1                ;有键按下则跳置GETKEY1  

  72. GETKEY1:CALL DIS                    ;显示刷新
  73.         CALL CLEAR                  ;清屏
  74.             CALL CCSCAN                 ;再次扫描按键
  75.             JNZ  GETKEY2                ;有键按下则跳置GETKEY2
  76.             JMP  BEGINk                  ;否则跳回开始继续循环

  77. GETKEY2:MOV  CH,0FEH
  78.             MOV  CL,00H                 
  79. COLUM:  MOV  AL,CH                  ;选取一行      
  80.         MOV  DX,MY8255_A
  81.             OUT  DX,AL
  82.         MOV  DX,MY8255_C            ;读C口,用于判断是哪一列按键闭合
  83.             IN   AL,DX

  84. L1:     TEST AL,01H                 ;是否为第1列
  85.         JNZ  L2                     ;不是则继续判断  
  86.         MOV  AL,01H                 ;设置第1行第1列的对应的键值
  87.             JMP  KCODE

  88. L2:     TEST AL,02H                 ;是否为第2列
  89.         JNZ  L3                     ;不是则继续判断
  90.         MOV  AL,02H                 ;设置第1行第2列的对应的键值
  91.         JMP  KCODE

  92. L3:     TEST AL,04H                 ;是否为第3列
  93.         JNZ  NEXT                     ;不是则继续判断
  94.         MOV  AL,03H                 ;设置第1行第3列的对应的键值
  95.             JMP  KCODE


  96. KCODE:  ADD  AL,CL
  97.         JMP QUITk                   ;确定按键值

  98. NEXT:   ADD CL,3                                       
  99.             MOV  AL,CH
  100.             TEST AL,08H                 ;检测是否扫描到第4行
  101.             JZ   KERR                   ;是则跳回到开始处
  102.         ROL  AL,1                   ;没检测到第4行则准备检测下一列
  103.             MOV  CH,AL
  104.             JMP  COLUM
  105. KERR:   JMP  BEGINk
  106. QUITk:  RET
  107. KEYPAD ENDP

  108. CCSCAN  PROC NEAR                   ;扫描是否有按键闭合子程序
  109.         MOV  AL,00H                              
  110.         MOV  DX,MY8255_A            ;将4行全选通,
  111.             OUT  DX,AL
  112.         MOV  DX,MY8255_C
  113.         IN   AL,DX                  ;读C口
  114.             NOT  AL
  115.         AND  AL,0FH                 ;取出C口值的反值
  116.            RET
  117. CCSCAN ENDP


  118. KEYLS  PROC  NEAR                  ;按键是否弹起子程序
  119.              PUSH AX                     
  120. KON:   
  121.         CALL DIS                    ;显示刷新
  122.             CALL CLEAR                  ;清屏
  123.             CALL CCSCAN                 ;扫描按键,判断按键是否弹起
  124.             JNZ  KON                    ;未弹起则继续循环等待弹起
  125.             POP  AX   
  126.             RET
  127. KEYLS ENDP

  128. CLEAR PROC NEAR                    ;清除数码管显示子程序
  129.        MOV  DX,MY8255_B            ;段位置0即可清除数码管显示   
  130.        MOV  AL,00H
  131.        OUT  DX,AL
  132.            RET
  133. CLEAR ENDP

  134. DIS PROC NEAR                      ;显示键值子程序
  135.        PUSH AX                   ;以缓冲区存放的键值为键值表偏移找到键值并显示
  136.            MOV  SI,0200H                              
  137.            MOV  DL,0DFH
  138.            MOV  AL,DL
  139. AGAIN: PUSH DX
  140.        MOV  DX,MY8255_A
  141.        OUT  DX,AL                  ;选通一个数码管   
  142.        MOV  AL,[SI]                ;取出缓冲区中存放键值                  
  143.        MOV  BX,OFFSET DTABLE
  144.            AND  AX,00FFH
  145.            ADD  BX,AX                  
  146.            MOV  AL,[BX]                ;将键值作为偏移和键值基地址相加得到相应的键值
  147.        MOV  DX,MY8255_B
  148.            OUT  DX,AL                  ;写入数码管A~Dp
  149.            CALL DALLY
  150.            INC  SI                     ;取下一个键值
  151.        POP  DX
  152.        MOV  AL,DL
  153.            TEST AL,01H                 ;判断是否显示完?
  154.        JZ   OUT1                   ;显示完,返回
  155.            ROR  AL,1            
  156.            MOV  DL,AL
  157.            JMP  AGAIN                  ;未显示完,跳回继续
  158. OUT1:  POP  AX                     
  159.            RET
  160. DIS ENDP


  161. PUTBUF PROC NEAR                   ;保存键值子程序   

  162.        MOV  SI,DI
  163.        MOV  [SI],AL
  164.            DEC  DI
  165.            CMP  DI,01FFH
  166.            JNZ  GOBACK
  167.            MOV  DI,0205H
  168. GOBACK: RET
  169. PUTBUF ENDP   

  170. CRCMP PROC NEAR   ;密码比对子程序
  171.    
  172.       
  173.         MOV SI,0205H
  174.         MOV DI,OFFSET STRING
  175.         MOV CX,0                     ; 密码正确,则输出CX=00H,为密码正确的标志
  176.         MOV AL,[SI]
  177.         MOV BL,[DI]
  178.         CMP AL,BL
  179.         JZ  NEXT1
  180.         JMP NEXT6
  181. NEXT1: MOV SI,0204H
  182.        MOV DI,OFFSET STRING
  183.        MOV AL,[SI]
  184.        MOV BL,[DI+1]
  185.        CMP AL,BL
  186.        JZ NEXT2
  187.        JMP NEXT6
  188. NEXT2:
  189.        MOV SI,0203H
  190.        MOV DI,OFFSET STRING
  191.        MOV AL,[SI]
  192.        MOV BL,[DI+2]
  193.        CMP AL,BL
  194.        JZ NEXT3
  195.        JMP NEXT6  
  196. NEXT3:
  197.        MOV SI,0202H
  198.        MOV DI,OFFSET STRING
  199.        MOV AL,[SI]
  200.        MOV BL,[DI+3]
  201.        CMP AL,BL
  202.        JZ NEXT4
  203.        JMP NEXT6
  204. NEXT4:
  205.        MOV SI,0201H
  206.        MOV DI,OFFSET STRING
  207.        MOV AL,[SI]
  208.        MOV BL,[DI+4]
  209.        CMP AL,BL
  210.        JZ NEXT5
  211.        JMP NEXT6  
  212. NEXT5:
  213.        MOV SI,0200H
  214.        MOV DI,OFFSET STRING
  215.        MOV AL,[SI]
  216.        MOV BL,[DI+5]
  217.        CMP AL,BL
  218.        JZ QUITER
  219.        JMP NEXT6
  220. NEXT6: MOV CX,0FFH                ;密码错误,则CX=0FFH为密码错误的标志
  221. QUITER:RET
  222. CRCMP ENDP  

  223.   
  224. SHOWO PROC NEAR                    ;开锁子程序
  225.         MOV  SI,0200H              ;显示00
  226.             MOV  AL,00H                 
  227.             MOV  [SI],AL
  228.             MOV  [SI+1],AL
  229.             MOV  AL,10H
  230.             MOV  [SI+2],AL
  231.             MOV  [SI+3],AL
  232.             MOV  [SI+4],AL
  233.             MOV  [SI+5],AL
  234.             MOV  DI,0205H   
  235.             
  236.            MOV  DX,MY8255_C             ;输出开锁电平
  237.        MOV  AL,010H                  
  238.            OUT  DX,AL

  239. LOOP21:
  240.         CALL KEYPAD   
  241.         CMP AL,0CH                  ;返回键,退出开锁子程序
  242.         JZ LOOP22  
  243.         CMP AL,0AH                  ;修改密码键
  244.         JZ LOOP23
  245.         JMP LOOP21
  246. LOOP22: CALL KEYLS   
  247.         JMP  QUITSHO
  248. LOOP23: CALL KEYLS                  ;修改密码,数码管全灭,用于与输入密码区别
  249.         MOV  SI,0200H  
  250.         MOV  AL,10H                 
  251.         MOV  [SI],AL
  252.             MOV  [SI+1],AL
  253.             MOV  DI,0205H
  254.             CALL CHANGECR                ;调用修改密码子程序
  255. QUITSHO: MOV DX,MY8255_C             ;开锁电平置0
  256.         MOV  AL,00H
  257.         OUT DX,AL
  258. RET
  259. SHOWO ENDP

  260. CHANGECR PROC NEAR                 ;修改密码子程序
  261. CHG1:    CALL KEYPAD                  
  262.          CMP AL,0CH
  263.          JZ  CHG2
  264.          CALL PUTBUF
  265.          CALL PUTBUFCR
  266.          CALL KEYLS
  267.          JMP  CHG1
  268. CHG2:    CALL KEYLS
  269.          CALL RING                ;确认则发出"滴"的确认音
  270.              CALL DALLYS  
  271.              RET
  272. CHANGECR ENDP

  273. PUTBUFCR  PROC NEAR        ;保存修改后的密码子程序
  274.       XOR BX,BX
  275.       MOV BL,[COUNT1]
  276.       MOV STRING[BX],AL   ;放入密码内存空间STRING
  277.       MOV BL,[COUNT1]
  278.       INC BL
  279.       MOV [COUNT1],BL  
  280.       CMP BL,06H
  281.       JNZ  GOBACKCR  
  282.       MOV BL,0
  283.       MOV [COUNT1],BL
  284. GOBACKCR: RET
  285. PUTBUFCR  ENDP

  286. SHOWC PROC NEAR                    ;闭锁子程序
  287.         
  288.         MOV  SI,0200H              ;显示FF
  289.             MOV  AL,0FH                 
  290.             MOV  [SI],AL
  291.             MOV  [SI+1],AL
  292.             MOV  AL,10H
  293.             MOV  [SI+2],AL
  294.             MOV  [SI+3],AL
  295.             MOV  [SI+4],AL
  296.             MOV  [SI+5],AL  
  297.             MOV  DI,0205H
  298.             
  299.             MOV  DX,MY8255_A            ;显示FF
  300.         MOV  AL,0CFH
  301.         OUT  DX,AL
  302.         MOV  DX,MY8255_B
  303.         MOV  AL,71H
  304.         OUT  DX,AL     
  305.                                     ;发出三声"滴"声
  306.             CALL RING  
  307.             CALL DALLYS
  308.             CALL DALLYS
  309.             CALL DALLYS
  310.             CALL RING  
  311.             CALL DALLYS
  312.             CALL DALLYS
  313.             CALL DALLYS
  314.             CALL RING  
  315.             CALL DALLYS
  316.             CALL DALLYS
  317.             CALL DALLYS
  318.                                        
  319.             MOV BL,[COUNT2]              ;取出密码错误次数,并判断是否已经达到6次
  320.         INC BL
  321.         CMP BL,06H
  322.         JZ  LOOP31
  323.         MOV [COUNT2],BL              
  324.         JMP LOOP32  
  325.         
  326. LOOP31: MOV  DX,MY8255_C             ;已达到六次,则输出报警电平
  327.         MOV  AL,020H
  328.         OUT  DX,AL  
  329.         MOV  BL,0                     ;密码错误次数清0
  330.         MOV  [COUNT2],BL        
  331.    
  332. LOOP32: CALL KEYPAD
  333.         CMP AL,0CH
  334.         JZ  LOOP33
  335.         JMP LOOP32
  336.         
  337. LOOP33:CALL KEYLS              ;未弹起则继续循环等待弹起
  338.          RET
  339. SHOWC ENDP


  340. RING PROC NEAR                  ;发音子程序
  341.      PUSH AX
  342.                
  343.          MOV  DX,MY8253_MODE         ;初始化8253工作方式
  344.      MOV  AL,36H                 ;计数器0,方式3  
  345.          OUT  DX,AL
  346.       
  347.       MOV AX,0020H         
  348.       MOV DX,MY8253_COUNT0
  349.       OUT DX,AL                   ;装入计数初值
  350.       MOV AL,AH
  351.       OUT DX,AL
  352.       CALL DALLYS
  353.       POP AX
  354. QUITRI: MOV DX,MY8253_MODE          ;退出时设置8253为方式2,OUT0置1
  355.         MOV AL,34H   
  356.         OUT DX,AL
  357.         
  358. RING ENDP  
  359.       

  360. DALLYS PROC NEAR                      ;8253延时子程序

  361. D1S:   MOV AX,0FFFH
  362. D2S:   DEC AX
  363.       JNZ D2S
  364.       RET
  365. DALLYS ENDP
  366.    
  367. DALLY PROC NEAR                    ;,8255软件延时子程序
  368.        PUSH CX
  369.        MOV  CX,000FH
  370. D1:    MOV  AX,000FH
  371. D2:    DEC  AX
  372.            JNZ  D2
  373.            LOOP D1
  374.            POP  CX
  375.            RET
  376. DALLY ENDP

  377. CODE ENDS
  378.       END START
复制代码
0.png

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-142463-1.html



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表