资源描述
微机原理课程设计 微机原理课程设计姓名: 学号: _ 班级: 专业: 电气工程及其自动化 学院: 电气与信息工程学院 目录一、课程设计内容1二、系统功能要求12.1 基本功能要求12.2 附件功能要求1三、系统方案论证1四、系统硬件设计24.1 系统硬件原理24.2 功能模块设计64.3 遇到问题及解决措施7五、系统软件设计85.1 总体设计思想85.2 功能模块设计105.3 遇到问题及解决措施11六、总结11七、附录13 简易全自动洗衣机设计一、课程设计内容(1)利用8255A芯片,在数码管上实时显示洗衣机档位和洗衣时间倒计时;(2)利用8254芯片,设置精确倒计时时间或者发送信号给蜂鸣器;(3)利用8259A芯片,设置按键或开关中断控制功能;(4)利用0809芯片,模拟水位传感器采集一个电压信号,控制电机旋转。二、系统功能要求2.1 基本功能要求(1)能够实现洗衣机换挡功能,比如设置“1挡键”、“2挡键”等不同挡位;(2)能够实现电机的正转功能;比如设置电机正转3圈,反转3圈,循环工作;(3)能够实现洗衣机按键控制,比如设置“启动键”、“暂停键”或“停止键”(4)能够实现按键或开关控制洗衣机的暂停,比如按下“暂停键”,正在旋转的 电机停止工作,再按一下“启动键”,洗衣机又继续工作;(5)能够实现洗涤、甩干连续自动功能,甩干后,洗衣机会通过蜂鸣器发出报 警声音;2.2 附件功能要求(1)能够实现洗衣机单独甩干功能,此时电机旋转速度很快;(2)能够实现洗衣机进水、排水或者洗涤、漂洗、甩干等不同功能使用不同颜 色的指示灯;(3)能够实现洗涤、漂洗、甩干全过程自动化;(4)能够实现洗衣机甩干后,发出优美的音乐,音乐一直响直到人为关掉或者 音乐响一定时间后自动关闭。(5)自己设计的其他有特色的功能。三、系统方案论证3.1 方案一输入设备主要有启动按钮、暂停按钮、档位选择、排水按钮、及脱水按钮。输出设备主要有电源指示灯、数码管、步进电机、蜂鸣器等。首先构思系统的总体结构,根据设计要求确定好系统大致的硬件组成及其结构,其次根据系统的各个功能把软件分成几个不同的模块,依次实现各个模块的功能,最后把各个模块组合起来完成整个系统的功能。3.2 方案二根据任务的要求,选择了4个数码管作为信号输出,以状态输入开关作为输入信号,都连接至8255A芯片上。步进电动机由8255PC4-PC7口驱动,其中洗衣过程漂洗过程排水过程的时间都由8254提供定时信号,实现在预定时间状态的转换。在对芯片进行初始化之后,先判断输入信号的状态,根据输入状态的不同调用不同的子程序,鉴于定时程序在很多子程序里调用到,多次编写加长了程序的长度,所以每次在调用之前先将计数值读入一个寄存器中,在延时程序中读取此寄存器中的数值即可。当按照输入状态运行完之后,最后检测到已完成的时候就启动蜂鸣报警,洗衣过程完成。3.3 方案比较方案一相对来说刚开始容易,但是后续工作麻烦,不容易将每个模块有机的整合起来,会出现接口冲突,而方案二在设计初就从全局出发,充分分配好各个端口的配置及用途,避免了方案一中的冲突,所以方案二更优越。四、系统硬件设计4.1 系统硬件原理(1)8255A芯片8255A是一个通用的可编程的并行接口芯片,内部有2个8位I/O口(A、B),两个4位I/O口(PC74、PC30).通过编程可设置3种工作方式,可适用于CPU与I/O设备之间的多种数据传送方式的要求。C口可作为数据口,可作为信号线( CPU与I/O设备之间的应答信号),可作为状态口,可按位置位/复位。8255A的内部结构如图1所示: 图1 8255的内部结构图8255的引脚分配:(1)D0D7:8位,双向,三态数据线,用来与系统数据总线相连;(2)端口A、B、C:PA0PA7( A组数据信号,用来连接外设); PB0PB7( B组数据信号,用来连接外设);PC0PC7(C组数据信号,用来连接外设或者作为控制信号)。 (3)CS、RESET、WR、RD、A1、A0(内部4个端口)。(4)VCC、GND。8255A有三种工作方式,用户可以通过编程来设置。方式0简单输入/输出查询方式;A,B,C三个端口均可。方式1选通输入/输出中断方式;A ,B,两个端口均可。方式2双向输入/输出中断方式。只有A端口才有。工作方式的选择可通过向控制端口写入控制字来实现。(2)芯片82548254是可编程计数器/定时器。它的引脚及功能示意图如图2所示。数据总线缓冲器是8254与CPU之间的数据接口,它是一个8位双向三态缓冲器。读/写控制逻辑接受CPU送来的读/写控制信号,并加以组合完成对8254内部操作的控制。8254内部包含三个独立的结构功能完全相同的16位可预置的递减计数器。控制字寄存器用来存放由CPU写入8254的方式选择控制字,以确定计数器的操作方式。 (3)8259芯片8259A,可编程中断控制器芯片。它的引脚图如图3所示。 它是可以用程序控制的中断控制芯片。单个的8259A能管理8级向量优先级中断。在不增加其他电路的情况下,最多可以级联成64级的向量优级中断系统。8259A有多种工作方式,能用于各种系统。各种工作方式的设定是在初始化时通过软件进行的。在总线控制器的控制下,8259A芯片可以处于编程状态和操作状态,编程状态是CPU使用IN或OUT指令对8259A芯片进行初始化编程的状态。(4)0809芯片ADC0809是8位逐次逼近型A/D转换器。它由一个八路模拟开关,一个地址译码器,一个A/D转换器和一个三态输出所存器组成,多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换,三态输出用于锁存A/D转换完的数据,当OE端为高电平时,才可以从三态输出锁存器取走转换完成的数据。IN0-IN7:8条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入端前加采样保持电路。地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效,当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道模拟量通过转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表一所示。表1 0809通道选择表CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线:11条ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在跳转期间,ST应保持低电平,EOC为转换结束信号,当EOC为高电平时,表明转换结束;否则表明正在进行A/D转换,OE为输出允许信号,用于控制三条输出锁存器想单片机输出转换得到的数据,OE=1,输出转换得到的数据OE=0输出数据线呈高阻状态。D7-D0为数字量输出线CLK为时钟输入信号线,因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常频率为500KHZ。VREF(+),VREF(-)为参考电压输入。4.2 功能模块设计图4 硬件功能图图4硬件功能图中,系统总体功能模块在具体实践中,因硬件资源的限制有所调整,比如有些电路采用其他电路来模拟,进水部分有电位器来模拟,电机驱动用直流系统来模拟。其接线图如图5所示:图5 系统接线图4.3 遇到问题及解决措施问题1: 当把所有线路按照设计要求连接好过后,发现芯片8254没有输出时钟信号。解决方法:芯片8254没有输出时钟信号,这表示8254没有起作用,原以为是芯片坏了,换了好几个新品牌还是一样不起作用,后来经过不断排查是由于采用了12V供电电压,实际要求是5V。问题2:当把所有的线路按照设计要求连接好之后,发现电机不能运转。解决方法:经检查是连接到电机驱动电路上的接线出现断路,换根接线就把问题解决了五、系统软件设计5.1 总体设计思想程序首先要用伪指令定义一下。然后是8255、8254与8259的初始化,如: MOV DX,CADDR ;8255初始化 MOV AL,MODE OUT DX,AL MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;计数器0,方式3 OUT DX,AL MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1 MOV AL,1BH ;边沿触发、单片8259、需要ICW4 OUT DX,AL MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2 MOV AL,08H OUT DX,AL MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4 MOV AL,01H ;非自动结束EOI OUT DX,AL MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1 MOV AL,0FCH ;打开IR0和IR1的屏蔽位 OUT DX,AL 然后按照原先设计好的原理框图的步骤设计检测洗衣机开/停信号,如; CHECK: MOV DX,PORTB IN AL,DX TEST AL,80H JZ CHECK还有接下来的点亮运行指示灯等程序。在设计中用到了子程序调用、循环、测试等程序。在编程时按照设计好的原理框图,结合微机课程上所学的具有一定功能的程序一一编出来,然后在计算机上进行调试,发现错误后再进行修改。在编程过程中要注意程序的嵌套使用,即有些程序按照前面流程图设计好了但在后面的程序中然要用,所以就要注意调用。软件可分为10个模块:主程序、键盘扫描子程序、参数设置子程序、延时子程序、显示子程序、自检程序、甩干子程序、暂停子程序、蜂鸣器子程序。系统的总体流程图如图6所示:开始8255等初始化检测开关信号是否为脱水YN设洗衣标志调用洗衣子程序结束启动蜂鸣器关闭脱水标志调用脱水子程序设脱水标志关闭洗衣标志 图6 整体流程方框图5.2 功能模块设计(1)延时功能模块设计根据机箱上给出的芯片我们选用了8254作为定时计数器,在延时程序中计时,在加水过程中计量加水的量。 由于需要多次调用延时子程序,所以把他写成一个DALLY程序,每次调用的时候配合CALL和RET就能往返于子程序和主程序之间,之前把要记的数值放在SI寄存器中,在子程序中读取该寄存器就可以知道要记的数是多少而不必每次都重新给计数器赋值,减少了程序的步骤也使得更易读。(2)洗衣功能模块设计洗衣子程序中是一个不停的在正传反转间循环的过程,期间每次正转或者反转都调用了延时子程序,定时3S,在完成5次循环过后,洗衣过程完成。(3)脱水功能模块设计脱水子程序中只需调用上面做好的延时程序,并在该延时之前打开或关闭相应的指示灯即可。然后用8086的片选信号加给0832控制电动机正转反转,根据公式 : V0= -NVREF/256计算得到要使电动机保持不转的时候要输入给80H,而正转则取最大值FFH,反转取最小值00H,由于这样得到的V0不相同,所以引起了正传反转时候的速度有些差异,最后等延时子程序执行完毕后,关闭相应指示灯即可完成。脱水、延时、加水等子程序后面都要加上RET,否则将无法跳回主程序MAIN。当时在前几次通电试验的时候每次都出现在排水的时候加水指示灯亮起,需要加水后才能熄灭,后检查发现就是少了一个RET导致的,执行完排水程序后没返回而是接下去执行了加水程序。(4) 甩干、报警功能模块设计甩干子程序是一个不停的在正转的过程,甩干可以分为快甩和慢甩两种档位,甩干子程序还可以通过按键直接跳过洗衣进行调用。当甩干程序运行结束后,8254会产生一个时钟信号给蜂鸣器从而让蜂鸣器报警,表示洗衣过程结束。(5)加水子程序设计加水是这个总程序中很重要的部分,特别是如何将水位信号读取和比较,最终还要输出到8253进行计数。首先打开加水指示灯,将水位信号扫描到寄存器AL中。然后根据与设定好的数据进行比较确定水位信号是什么,假如检测到的是高水位的话,跳转到LEVEL,否则给AL置为3,高水位的时候将控制字写给计数器0,继续执行下去直到给BL加上1,当加到与原来保存的水位信号数值相等的时候,由PC7口将信号传递给8253,告之加水计数程序完成,跳出加水程序,然后关闭加水指示灯,执行下面的程序。5.3 遇到问题及解决措施问题1.通过中断实现数码管计时显示与步进电机延时相互冲突,导致步进电机不能正常运转。解决方法:经过很长时间调试,还是不能成功,由于时间有限,所以最后只好通过步进电机正反转次数来计时。问题2.报警功能实现后不知道如何使它停止下来。解决办法:在进入报警子程序前加变量判断,通过按键控制变量的取反改变,停止报警。六、总结这次微机原理课程设计历时两个星期,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,通过网络和与同学的讨论基本上得到解决,提高了自己解决和分析问题的能力。7、 附录洗衣机程序;*根据查看端口资源修改下列符号值*IOY1 EQU 3040HIOY0 EQU 3000H ;片选IOY0对应的端口始地址;*MY8255_A EQU IOY0+00H*4 ;8255的A口地址MY8255_B EQU IOY0+01H*4 ;8255的B口地址MY8255_C EQU IOY0+02H*4 ;8255的C口地址MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址MY8254_COUNT0 EQU IOY1+00H*4 ;8254计数器0端口地址MY8254_COUNT1 EQU IOY1+01H*4 ;8254计数器1端口地址MY8254_COUNT2 EQU IOY1+02H*4 ;8254计数器2端口地址MY8254_MODE EQU IOY1+03H*4 ;8254控制寄存器端口地址IOY2 EQU 3080H ;片选IOY0对应的端口始地址;*MY8259_ICW1 EQU IOY2+00H ;实验系统中8259的ICW1端口地址MY8259_ICW2 EQU IOY2+04H ;实验系统中8259的ICW2端口地址MY8259_ICW3 EQU IOY2+04H ;实验系统中8259的ICW3端口地址MY8259_ICW4 EQU IOY2+04H ;实验系统中8259的ICW4端口地址MY8259_OCW1 EQU IOY2+04H ;实验系统中8259的OCW1端口地址MY8259_OCW2 EQU IOY2+00H ;实验系统中8259的OCW2端口地址MY8259_OCW3 EQU IOY2+00H ;实验系统中8259的OCW3端口地址STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENTDTABLE1 DB 06H,3FH,73H,77H,39H,06H,5BH,4FH,66H,80HDTABLE3 DB 10H,30H,20H,60H,40H,0C0H,80H,90HDTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H TIME1 DB 05HTIME2 DB 05HTIME3 DB 0FHMES DB Press any key to exit!,0AH,0DH,0AH,0DH,$FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;频率表 DW 495,495,624,742,833,833,833,742,624 DW 624,495,556,495,556,624,495,416,416,371 DW 495,833,742,624,624,495,556,495,556,833 DW 742,624,624,742,833,990,742,624,624,495 DW 556,495,556,624,495,416,416,371,495,0TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2 DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 6, 2, 4, 4, 12DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;计数器0,方式3 OUT DX,AL MOV DX,MY8254_COUNT0 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,48H OUT DX,AL MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,050H ;计数器2,方式0 OUT DX,AL MOV DX,MY8254_COUNT1 ;装入计数初值 MOV AL,03H ;18432分频 OUT DX,AL MOV AL,00H OUT DX,AL MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,0B6H ;计数器2,方式3 OUT DX,AL MOV DX,MY8254_COUNT2 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,05H OUT DX,AL MOV DX,MY8259_ICW1 ;初始化实验系统中8259的ICW1 MOV AL,1BH ;边沿触发、单片8259、需要ICW4 OUT DX,AL MOV DX,MY8259_ICW2 ;初始化实验系统中8259的ICW2 MOV AL,08H OUT DX,AL MOV DX,MY8259_ICW4 ;初始化实验系统中8259的ICW4 MOV AL,01H ;非自动结束EOI OUT DX,AL MOV DX,MY8259_OCW1 ;初始化实验系统中8259的OCW1 MOV AL,0FCH ;打开IR0和IR1的屏蔽位 OUT DX,AL MOV SI,3000H MOV SI,00H ;数码管显示1 MOV SI+02H,05H ;数码管显示2 MOV SI+04H,01H ;洗涤,甩干判断变量 MOV SI+06H,01H ;电机速度档位 MOV SI+08H,01H ;电机输入节拍倒转判断变量 MOV SI+0AH,02H ;电机方向控制变量 MOV SI+0CH,02H ;判断是否进入电机运行程序的变量 MOV SI+0EH,01H ;警报器关闭判断变量 MOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,ALKAISHI:MOV SI,3000H ;读取变量首地址 MOV DH,SI+8 CMP DH,8 JA ZHI1 ;跳转到节拍1开始转动 CMP DH,1 JB ZHI8 ;跳转到节拍8开始转动 JMP JIXUZHI1:MOV SI+8,01H JMP JIXUZHI8:MOV SI+8,08HJIXU:CALL KEYSCAN ;键盘扫描 CMP SI+0EH,02H JNZ C MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,0F6H ;计数器2,方式3 OUT DX,AL MOV AX,0000H MOV DX,MY8254_COUNT2 OUT DX,AL ;装入计数初值 MOV AL,AH OUT DX,ALC: MOV AH,1 ;判断是否有按键按下 INT 16H JZ SFRUN ;无按键则跳回继续循环,有则退出QUIT: MOV AX,4C00H ;结束程序退出 INT 21HSFRUN: MOV SI,3000H ;读取变量首地址 MOV DH,SI+0CH CMP DH,01H ;判断变量SI+0CH JNZ JIXU ;不相等跳转到JIXU MOV DH,SI+0AH CMP DH,01H ;判断电机运行方向JNZ ZIJIANINC SI+08H ;正向节拍加1JMP RUN KAISHI1: JMP KAISHI ZIJIAN:DEC SI+8 ;反向节拍减一RUN:MOV AL,SI+8 ;将变量与节拍表对应MOV BX,OFFSET DTABLE3AND AX,00FFH ADD BX,AXDEC BX MOV AL,BX MOV DX,MY8255_C OUT DX,ALDANG1:MOV DH,SI+6 ;PC口输出节拍数值CMP DH,05H ;判断速度档位调用相应的延迟时间JNZ DANG2 PUSH CXMOV CX,10H ;运行个节拍DA1:CALL DALLY1CALL DALLY1CALL DALLY1 CALL KEYSCAN ;键盘扫描JMP PP ;跳转到PPDANG2:CMP DH,01HJNZ DANG3DA2:CALL DALLY1CALL DALLY1CALL KEYSCANJMP PPDANG3:CMP DH,02HJNZ PPDA3:CALL DALLY1CALL KEYSCAN JMP PPDANG4:CMP DH,03HJNZ KAISHI1DA4:CALL KEYSCANPP: MOV DX,MY8259_OCW3 ;向8259的OCW3发送查询命令 MOV AL,0CH OUT DX,AL IN AL,DX ;读出查询字 TEST AL,80H ;判断中断是否已响应 JZ AA ;没有响应则继续查询 AND AL,03H CMP AL,00H JE IR0ISR ;若为IR0请求,跳到IR0处理程序 JNE IR1ISR ;若为IR1请求,跳到IR1处理程序AA: JMP KAISHIDANG4:CMP DH,03HJNZ KAISHI1DA4:CALL KEYSCANJMP KAISHI ;跳转到KAISHI循环IR0ISR: MOV SI,3000H CMP SI+4H,02H ;判断是否是甩干模式 JZ M2DIR:CMP SI+0AH,01H ;判断是否是正向JZ DIR1 MOV SI+0AH,01H JMP M1DIR1:MOV SI+0AH,02H CALL KEYSCANM1: DEC TIME1 ;洗涤圈数减1 MOV AX,10D DIV TIME1 MOV AL,TIME1 MOV SI+02H,AL CALL KEYSCAN CMP TIME1,00H ;是否洗涤结束 JZ M JMP CTU ;转入计数初值 M: MOV SI+4H,02H ;进入甩干模式 MOV SI+6,02H ;速度档位选2M2: DEC TIME2 ;甩干 计数减一 MOV SI,0 MOV AL,TIME2 MOV SI+02H,AL ;将计数值放入数码管显示 CMP SI+02H,00H JZ FINISH JNZ EOI CTU: MOV DX,MY8254_COUNT1 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,03H OUT DX,AL JMP EOI EOI: MOV DX,MY8259_OCW2 ;向实验系统中8259发送中断结束命令 MOV AL,20H OUT DX,AL JMP KAISHI FINISH: MOV SI+0CH,02H ;关闭进入电机程序标志 CALL PLAY ;调用报警程序 JMP KAISHI PLAY PROC NEARSOUND: CMP SI+0EH,02H JZ EOI MOV SI,OFFSET FREQ_LIST ;装入频率表起始地址 MOV DI,OFFSET TIME_LIST ;装入时间表起始地址P1: MOV DX,1CH ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H MOV AX,02000H DIV WORD PTR SI ;取出频率值计算计数初值,0F4240H / 输出频率 MOV DX,MY8254_COUNT2 OUT DX,AL ;装入计数初值 MOV AL,AH OUT DX,AL MOV DL,DI ;取出演奏相对时间,调用延时子程序 CALL DALLY3 DEC TIME3 ADD SI,2 INC DI CMP WORD PTR SI,0 ;判断是否到曲末? JE SOUNDPLAY ENDP DALLY1 PROC NEAR ;软件延时子程序 PUSH CX PUSH AX MOV CX,008FHD11:MOV AX,5000HD22:DEC AX JNZ D22 PUSH CX PUSH AX CALL KEYSCAN POP AX POP CXLOOP D11 POP AX POP CX RETDALLY1 ENDPKEYSCAN PROC NEAR ;键盘扫描子程序BEGIN:CALL DIS ;显示刷新 CALL CLEAR ;清屏CALL CCSCAN ;扫描按键JNZ GETKEY1 ;有键按下则跳置GETKEY1 JMP GOBACK1GETKEY1:CALL DIS ;显示刷新 CALL DALLY CALL DALLY CALL CLEAR ;清屏CALL CCSCAN ;再次扫描按键JNZ GETKEY2 ;有键按下则跳置GETKEY2JMP BEGIN ;否则跳回开始继续循环GETKEY2:MOV CH,0FEHMOV CL,00H ;设置当前检测的是第几列COLUM: MOV AL,CH ;选取一列,将X1X4中一个置0 MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C ;读Y1Y4,用于判断是哪一行按键闭合 IN AL,DXL1: TEST AL,01H ;是否为第1行 JNZ L2 ;不是则继续判断 MOV AL,00H ;设置第1行第1列的对应的键值JMP KCODEBEGIN1:JMP BEGINL2: TEST AL,02H ;是否为第2行 JNZ L3 ;不是则继续判断 MOV AL,04H ;设置第2行第1列的对应的键值 JMP KCODEL3: TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断 MOV AL,08H ;设置第3行第1列的对应的键值JMP KCODEL4: TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断 MOV AL,0CH ;设置第4行第1列的对应的键值KCODE: ADD AL,CL ;将第1列的值加上当前列数,确定按键值CALL PUTBUF ;保存按键值PUSH AXKON: CALL DIS ;显示刷新CALL CLEAR ;清屏CALL CCSCAN ;扫描按键,判断按键是否弹起JNZ KON ;未弹起则继续循环等待弹起POP AXNEXT: INC CL ;当前检测的列数递增 MOV AL,CHTEST AL,08H ;检测是否扫描到第4列JZ BEGIN1 ROL AL,1 ;没检测到第4列则准备检测下一列MOV CH,ALJMP COLUMGOBACK1:RETKEYSCAN ENDPCCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4列全选通,X1X4置0OUT DX,AL MOV DX,MY8255_C IN AL,DX ;读Y1Y4NOT AL AND AL,0FH ;取出Y1Y4的反值RETCCSCAN ENDPCLEAR PROC NEAR ;清除数码管显示子程序 MOV DX,MY8255_B ;段位置0即可清除数码管显示 MOV AL,00H OUT DX,ALRETCLEAR ENDPDIS PROC NEAR ;显示键值子程序 PUSH AX PUSH SI MOV SI,3006H MOV DL,0F7HMOV AL,DLAGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL ;设置X1X4,选通一个数码管 MOV AL,SI ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE AND AX,00FFHADD BX,AX MOV AL,BX MOV DX,MY8255_B OUT DX,AL ;写入数码管ADpCALL DALLYDEC SIDEC SI ;取下一个键值 POP DX MOV AL,DLTEST AL,01H ;判断是否显示完? JZ OUT1 ;显示完,返回ROR AL,1 MOV DL,ALJMP AGAIN ;未显示完,跳回继续OUT1: POP SIPOP AX RETDIS ENDPPUTBUF PROC NEAR ;保存键值子程序 MOV SI,3000H CMP AL,00H ;是否案件0按下JNZ MODEMDL:CMP SI+4,01HJZ MDL1 MOV SI+4,01H JMP LASTMDL1:MOV SI+4,02H JMP LASTMODE:CMP AL,01H ;是否案件1按下JNZ STOP CMP SI+0CH,01H JZ MODE1MOV SI+0CH,01H ;打开进入电机程序标志JMP LASTCMP AL,03HMOV SI+0EH,02H ;关闭进入电机程序标志MODE1:MOV SI+0CH,02H ;是否案件2按下 JMP LASTSTOP:CMP AL,02H ;比较暂停标志变量JNZ GRD1MOV SI+0CH,02H ;关闭进入电机程序标志MOV TIME1,05H ;洗涤,甩干次数重置MOV TIME2,05HMOV SI+4,01H ;重置洗涤模式MOV SI+6,02H
展开阅读全文