微机课程设计报告 小型步进电机控制系统设计(附程序清单).doc

上传人:豆**** 文档编号:17603133 上传时间:2022-05-25 格式:DOC 页数:27 大小:281.50KB
返回 下载 相关 举报
微机课程设计报告 小型步进电机控制系统设计(附程序清单).doc_第1页
第1页 / 共27页
微机课程设计报告 小型步进电机控制系统设计(附程序清单).doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《微机课程设计报告 小型步进电机控制系统设计(附程序清单).doc》由会员分享,可在线阅读,更多相关《微机课程设计报告 小型步进电机控制系统设计(附程序清单).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流微机课程设计报告 小型步进电机控制系统设计(附程序清单).精品文档.微机应用系统设计与综合实验设计报告设计题目 小型步进电机控制系统设计 指导老师 设计者 专业班级 学 号 设计日期 目录摘要.3一. 课程设计目的.4二. 设计题目名称及要求.4三. 实验设备.4四. 设计的思想和实施方案.5五. 硬件原理图.11六. 典型程序模块及典型编程技巧.13七. 课程设计中遇到的问题及解决方法.16八. 程序流程图.19九. 汇编程序清单及程序注释.23十. C语言程序清单及注释.30十一. 收获体会.37十二. 参考文献.38摘要在现代电子产品中

2、,步进电机广泛应用于ATM机、喷绘机、刻字机、写真机、喷涂设备、医疗仪器及设备、计算机外设及海量存储设备、精密仪器、工业控制系统、办公自动化、机器人等领域。所以步进电机的控制是一门很实用的技术。本实验主要是基于唐都PIT试验箱的步进电机控制的设计。主要使用到了并行接口电路8255、LED七段数码管电路、8086cpu、步进电机等元件。主要是通过按键的不同来设置直流电机的转速、运行状态和方向。软件部分采用了汇编语言编写程序代码和C语言编写的步进电机控制程序,通过判断、跳转、循环、延时等基本技术实现。此系统可以通过键盘输入相关数据, 并根据需要, 实时对步进电机工作方式进行设置, 具有实时性和交互

3、性的特点。该设计可应用于步进电机控制的大多数场合关键词: 步进电动机 调速 方向控制 并行接口 七段数码管小型步进电机控制系统一、 课程设计目的课程设计是本科教学全过程中的重要环节。微机应用系统设计与综合实验(实践)课程设计主要培养我们自动化专业学生,运用所学知识解决计算机应用领域内实际问题能力,进一步提高学生运用计算机编程语言综合编程能力、程序调试技能和微机系统接口综合应用及电路设计能力。1、学习在PC系统中扩展简单的IO接口的方法。2、熟练掌握和运用汇编和C语言编写程序控制8255各口的输入输出,并正确带动数码管及步进电机;能熟练运用汇编和C语言实现8254的定时功能,以确保8255输出的

4、脉冲频率稳定。3、熟练掌握ISA总线配置方式下硬件实验的调试,并能独立的排除故障,以确保实验的顺利进行。4、.巩固和加深课堂所学知识;5、学习掌握一般的软硬件的设计方法和查阅、运用资料的能力;6、通过步进电机控制系统设计与制作,深入了解与掌握步进电机的运行方式、方向、速度、启/停的控制。二、 设计的题目名称及要求设计题目:小型步进电机控制系统设计。设计要求:(1)分别用C语言和汇编语言编程完成硬件接口功能设计;(2)基于80x86微机接口硬件电路设计调试;(3)控制功能要求:小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;(4)具有本地与远程(串行方式下)功能。三、实验设

5、备PC机一台(装有TDPIT软件)、唐都AEDK8688ET实验箱。使用硬件:8086 PC,8255芯片,键盘数码管,步进电机驱动电路,步进电机。系统设计:键盘采用实验板提供的4*4键盘,使用4个数码管实时显示系统当前状态。四、设计的思想和实施方案4.1.2 步进电机的工作原理步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简

6、单。步进电机动态指标及术语: 1、步距角精度:步进电机每转过一个步距角的实际值与理论值的误差。用百分比表示:误差/步距角*100%。不同运行拍数其值不同,四拍运行时应在5%之内,八拍运行时应在15%以内。2、失步:电机运转时运转的步数,不等于理论上的步数。称之为失步。3、失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。4、电机正反转控制:当电机绕组通电时序为AB-BC-CD-DA或()时为正转,通电时序为DA-CA-BC-AB或()时为反转。驱动控制系统组成:使用、控制步进电机必须由环形脉冲,功率放大等组成的控制系统,其方框图如下:脉

7、冲信号的产生:脉冲信号一般由单片机或CPU产生,一般脉冲信号的占空比为0.3-0.4左右,电机转速越高,占空比则越大。下图步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图1是该四相反应式步进电机工作原理示意图。 图1 四相步进电机步进示意图开始时,开关sb接通电源,sa、sc、sd断开,b相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和c、d相 绕组磁极产生错齿,2、5号齿就和d、a相绕组磁极产生错齿。当开关sc接通电源,sb、sa、sd断开时,由于c相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和

8、c相绕组的磁极对齐。而0、3号齿和a、b相绕组产生错齿,2、5号齿就和a、d相绕组磁极产生错齿。依次类推,a、b、c、d四相绕组轮流供电,则转子会沿着a、b、c、d方向转动。四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:a. 单四拍 b. 双四拍 c八拍图2.步进电机工作时序波形图 4.1.2 8255A的功能简介 Intel 8086/8

9、088 系列的可编程外设接口电路(Programmable Peripheral Interface)简称 PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。8255A在使用前要写入一个方式控制字,选择A、B、C三个端口各自的工作方式,共有三种;方式0 :基本的输入输出方式,即无须联络就可以直接进行的 I/O方式。其中A、B、C口的高四位或低四位可分别设置成输入或输出。方式1 :选通I/O,此时接口

10、和外围设备需联络信号进行协调,只有A口和B口可以工作在方式1,此时C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有基本的I/O功能,即只工作在方式0.方式2: 双向I/O方式,只有A口可以工作在这种方式,该I/O线即可输入又可输出,此时C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也可以和B口一起方式0的I/O线。4.1.3 设计思想和实施方案初步设计的模块图如下:步进电机8086CPULED数码显示模块小键盘输入模块8255模块进一步的设计图:电机状态显示模块CPU 8255LED显示模块 步进电机模块 键盘扫描模块本次设计,对82

11、55的使用是这样的:8255工作于方式0,A口低四位接键盘及数码管显示单元的X1X4;C口低四位接键盘及数码管显示单元的Y1Y4; C口高四位接步进电路的驱动电路,使电机转动起来;B口接数码管的A、B、C、D、E、F、G和DP,以使数码管显示电机的转向和转速。8255的A口高四位本次课程设计没有用到。此外,本次设计还用到了实验箱中的键盘及数码管显示单元:方向键:控制步进电机运行方向,无论电机处于运行或停止状态,每按下一次,电机转动方向反向;运行/暂停键:控制电机运行与否。电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行;停止键:无论电机处于任何状态,按下此键

12、,电机停止转动,电机各运行参数复位,默认参数为:“顺时针,停止状态,1档”;档位键:无论电机处于任何状态,均可设定电机档位。数码管显示信息:左起第一个数码管显示当前电机的运行状态:S(Stop)表示当前电机为停止状态;E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。第二个数码管未使用,只有小数点点亮。第三个数码管显示电机运行方向:C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。第四个数码管显示电机的档位:1、2、3、4分别表示1、2、3、4档。键盘数码管内部连线如下图:五、硬件电路原理图图 步进电机

13、控制系统硬件电路原理如上图示:该原理图涉及到系统总线、可编程外围接口芯片8255、键盘及数码管显示单元和步进电机及其驱动电路8255的D0D7 依次接系统总线的XD0XD7,A1和A0依次接系统总线的XA3和XA2;WR和RD 依次接系统总线上的XIOW和XIOR;8255的CS接系统总线的IOY0, 8255的A口低四位PA0PA4依次接小键盘的X1X4(列);C口低四位PC0PC3分别接小键盘的Y1Y4(行); C口高四位PC4PC7依次接驱动电路的A、B、C和D;B口PB0PB7分别接数码管的A、B、C、D、E、F、G和DP;A口高四位没用到。图 步进电机模块此模块的主要功能是通过接收8

14、255的C口输入信号来控制步进电机的转动,A,B,C,D分别代表不同的四个相位,分别接入到PC0,PC1,PC2和PC3,实现转动控制。 图 LED模块六、典型程序模块及典型编程技巧分析 1.主函数模块 主函数MAIN主要是综合调用各子函数,以完成对四项八拍步进电机转速和转向的控制,并在数码管上实时显示电机的运行状态、转向和转速档位。本次设计的电机转速分为四个档,分为一二三四档,在数码管的档位部分显示,分别显示1,2,3,4。当程序开始运行时,数码管上显示初始状态: S(停止),小数点(该位不用)C(顺时针)1(速度为1档)小键盘“0” 控制电机转向:程序默认初始态为C(顺时针);按下该键,电

15、机可以切换转向,C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。无论电机处于运行或停止状态,每按下一次,电机转动方向反向。 小键盘“1”控制电机开始和暂停两个状态之间的切换:电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行。E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。 小键盘“2”控制电机的停止复位(S:Stop):按下该键,电机停止转动,并且恢复到初始参数状态。小键盘“4”“5”“6”“7”控制电机的四个转速档位:当按下这四个键时,分别是电机运行在1,2,3

16、,4,转速档位。即实现了电机的调速,并且可以实现任意档速的切换。2. 键盘扫描与显示子程序模块此子函数是用来扫描小键盘哪行哪列有键按下,当确定某行某列有键按下时,再把相应的键值保存起来。小键盘有四行四列共16个按键,第一行从左到右依次是03;第二行从左到右依次是 47;第三行从左到右依次是 8B;第二行从左到右依次是 CF。为了实现判断功能,在C语言中设置三个标志位:1.运行状态标志MODE:0 = 停止(Stop);1 = 运行(Enable);2 = 暂停(Pause)。2.方向标志DIR(Direction):0 = 逆时针(Anti-clockwise);1 = 顺时针(Clockwi

17、se)。3.档位标志GRD(Grade):1 = 1 档;2 = 2档;3 = 3档;4 = 4档。数组a中存放数码管的编码,一次为:“S”、“E”、“P”、“A”、“C”、“1”、“2”、“3”、“4”、“.”。数组b中分别存放四个数码管应显示的编码在数组a中对应的位置,例如:b的初值为:0,9,4,5,则数码管会对应显示:“ S . C 1 ”。在汇编程序中,用DTABLE1中存放数码管的编码。SISI+2SI+4SI+6 中分别存放四个数码管应显示的编码在DTABLE1中对应的位置。与C程序中不同,汇编程序中取消了dir、mode、grd三个独立的变量,而是直接用SISI+4SI+6来代

18、表,即:SI=0时,表示停止状态;SI=1时,表示运行状态;SI=2时,表示暂停状态;SI+4=3时,表示方向为逆时针;SI+4=4时,表示方向为顺时针;SI+6=5时,表示档位为1档;SI+6=6时,表示档位为2档;SI+6=7时,表示档位为3档;SI+6=8时,表示档位为4档。首先保证使计数值i在0-7之间变化,若正转,则递增;反转则递减。判断是否运行,如运行,则跳出循环,给步进电机发驱动脉冲。3 .保存键值子程序此函数完成在按下小键盘按键后,将其相应的电机运行状态、转向和转速数值保存起来,以备其它子程序使用。4. 扫描是否有按键闭合子程序此子函数用来扫描小键盘是否有键按下。通过8255的

19、C口高四位,使X1X4(列)全选通,然后由8255的C口低四位判断各列所对应的行是否有键安下,无任何键按下则C口低四位读入的全是“1”,若有键按下则C口低四位读入的对应行是“0”,其余全是“1”,经取反(NOT)后扫描小键盘的子程序CCSCAN的功能变为:若小键盘无键按下则AL寄存器数据为“0”; 若小键盘有键按下则AL寄存器数据为非“0”。为减少引线,键盘采用矩阵式。键盘的识别采用行扫描法,程序使某行为低电平,则说明行列交叉点处的键被按下,然后,再具体确定按下的是哪个键。为此先使所在行输出为0,再检查列线是否有0。如果有零的话,此时由于不能确定闭合键所在的行,于是再用行扫描法来具体定位。如果

20、读得数据全部为1,则说明无键闭合。硬件上将8255端口C的上、下半部分分别用作键盘的行线和列线。用电平逻辑开关输出高低电平来代替键盘按键。5. 显示键值子程序将保存示值子函数中保存下的电机运行状态、转向和转速值送到数码管上显示。数码管的段位顺序如右图所示:一般来说在一个字节中按照abcdefg dp的顺序放置字型码,比如在一个“共阴极”数码管上要显示“1”,则b、c段需被点亮,因此在段选线中写入60H。对应规则:a-D7 b-D6c-D5d-D4 e-D3 f-D2g-D1 图3-2数码管显示dp-D0LED显示器的显示方法有两种静态显示法和动态扫描显示法。静态显示就是每一个显示器各笔画段都要

21、独占具有所存功能的输出口线,CPU把要显示的字符代码送到输出口上,就可以是显示器显示所需的数字后符号。但由于它站用的I/O口线较多,硬件成本高。所以我们选用了动态扫描显示法。6. 清除数码管显示子程序将段位置0即可清除数码管显示,即将00H分别送入A口(驱动LED灯和B口(驱动数码管)便可实验此功能7. 软件延时子程序延时子函数,可供别的程序调用以实现较好的显示和操作效果。读取键盘时要有一定的延时,来跳过键盘在刚按下时产生的抖动。判断档位,进行相应的延时,注意延时的时候也应每隔一定时间调用keyscan()键盘扫描及显示程序,已保证及时响应键盘输入,和刷新数码管,使数码管常亮。应注意调用子程序

22、前要将CX与AX寄存器的内容入栈进行保护。七、课程设计中遇到的问题及解决方法在本次课程设计过程中,我遇到了一下问题:首先,在显示模块中,在做数码管显示时,每次可以输出四位信息,而且要输出的字符须转化为相应的ASCII才行,否则就不能输出想要的东西。显示模块的调试一般是程序问题,硬件连接很简单,一般不会出错,我在调试时,开始没有初始化8255,导致结果不能输出。再就是相应的端口一定不能定义错误。这在显示模块调试中应该多注意。在这里还有一个比较难解决的问题,即调用了数码管显示程序而却看不到数码管有示数,这主要是调用数码管显示子函数的频率不够高,可以把数码管显示子函数换个位置,或者是多调用几次就可以

23、解决了。至于数码管好像是全亮,情况正好相反,是数码管显示子函数调用的频率过高,把数码管显示子函数换个位置,或者是在关键位置调用一下延时函数就可以解决了。还有,DIS和CLEAR成对调用可使数码管有个较好的显示效果。在刚开始编程时,各种功能大部分是由主程序来完成的。由于主程序过于复杂,可读性不高。使得在以后的程序的调试中遇到了很大的麻烦。后来把主程序的部分功能转化成子程序来实现,并在一些重要的地方增加了注释,使的程序的可读性大大加强。调试也变的比较简单了。其次,在使用小键盘时容易死机。出现死机的原因有很多,有时候同一个程序换台机子运行就会死机,有时候同一台机子同一个程序运行多次就会死机,不过总的

24、来看死机的出现多少是和所编写的程序有关,记得我以前用小键盘时就是很容易就死机了,不过在这次的课程设计中 我把所有的和小键盘有关的程序都用了子函数代替,大大简化了主程序的结构,这样就基本再也没发生过死机现象了。再者,当小键盘按下不松时电机也停止转动这种情况出现在电机的加速、减速和改变转向中,这主要是在原有的keyscan程序中有一段判断按键是否弹起的程序,将此段换成一个合适的软件延时便可以起到很好的效果(按键不松时可以连续的加速和减速)。再就是寄存器的使用问题。在编程时,子程序的调试也是相当重要,由于子程序不可避免的使用AXBXCXDX通用寄存器一个或几个。使得原主程序中的通用寄存器的内容很容易

25、被覆盖,对子程序中所有的通用寄存器出入栈即可以避免上诉的问题,不用考虑使用的是哪几个寄存器,使用起来又比较简单方便。数码转换问题,首先查找许多相关的典型程序,例如:十六位二进制数转换为10进制BCD码,可将AX中的二进制数先后除以1000,100,10,每次除法所得的商,即是BCD的千位、百位和十位数,余数是个位。TRAN: PUSH CX SHL DX,CL PUSH DX XCHG AL,AH SUB DX,DX SUB AH,AH MOV CX,1000 MOV CL,10 DIV CX DIV CL XCHG AX,DX ADD DL,AL MOV CL,4 MOV CL,4 SHL

26、DX,CL SHL DX,CL MOV CL,100 ADD DL,AH DIV CL MOV AX,DX ADD DL,AL POP DX MOV CL,4 POP CX而在算术运算方面也遇到了不少的问题,由于设计过程中存在着小数所以很多时候总会出现算术方面错误,具体表现为结果的溢出或者结果小数点位置错误。解决的方法通常是先将所要计算的数值乘以10、100等使得数值为整数,然后再进行计算,而在结果输出时再除以相映的数值从而实现小数的算术运算功能,而不需要采用定义浮点型去计算小数以避免出现数值定义的错误。另一个常见的错误就是自定义存储空间之间的数值存放,因为在许多时候总是需要将结果保存在某一段

27、存储空间里面,由于对存储空间的定义使得其大小范围各有不同,所以对其赋值时总是会出现溢出或数值转换的错误。而在子程序调用以循环方面存在的问题是指针的计数以及标志位清零或置1搞错从而使子程序运算错误或者进入死循环等。所采取的解决方法是对指针计数值在各个部分运算结束后进行清零以保证指针初值的正确。最后的问题就是DOS系统功能调用和BIOS中断调用,因为本课题设计中要实现软件时钟,所以需要对软件延迟以及中断调用有一定的了解,对此在设计时查阅了一些相关的软件中断命令。当个模块都调试成功后,即可合成到一起运行。本系统电机的速度可以通过速度增减键来控制。通过验证各按键是否被有效采用,来检验该系统是否正确的完

28、成了指定的功能。八、实验程序的流程图电机停止转动键值为0?延时等待仍在按下?初始化8255开始小键盘有键按下?改变电机转向(速度置最低)电机运行电机速度方向不变电机暂停键值为2?键值为3?键值为47结束小键盘有键按下?键值为1?数码管同步显示电机的状态、转速和方向主流程图:否是否否是是电机速度档位否是否是否是是是否否扫描与显示流程图:键盘显示子程序流程图:键盘扫描子程序流程图:九、汇编程序清单及程序注释;步进电机实验IOY0 EQU 0e400H ;片选IOY0对应的端口始地址MY8255_A EQU IOY0+00H*4 ;8255的A口地址MY8255_B EQU IOY0+01H*4 ;

29、8255的B口地址MY8255_C EQU IOY0+02H*4 ;8255的C口地址MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址STACK1 SEGMENT STACK DW 256 DUP(?)STACK1 ENDSDATA SEGMENTDTABLE1 DB 6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80HDTABLE3 DB 10H,30H,20H,60H,40H,0C0H,80H,90HDATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV

30、DS,AXMOV SI,3000HMOV SI,00HMOV SI+2,09HMOV SI+4,04HMOV SI+6,05HMOV SI+8,01HMOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,ALKAISHI:MOV SI,3000H MOV DH,SI+8CMP DH,8JA ZHI1CMP DH,1JB ZHI8JMP JIXUZHI1:MOV SI+8,01HJMP JIXUZHI8:MOV SI+8,08HJIXU:CALL KEYSCANMOV AH,1 ;判断是否有按键按下INT 1

31、6HJZ SFRUN ;无按键则跳回继续循环,有则退出QUIT: MOV AX,4C00H ;结束程序退出INT 21HSFRUN:MOV SI,3000H MOV DH,SICMP DH,01HJNZ JIXUMOV DH,SI+4CMP DH,04HJNZ ZIJIANINC SI+8JMP RUNKAISHI1: JMP KAISHIZIJIAN:DEC SI+8RUN:MOV AL,SI+8MOV BX,OFFSET DTABLE3 AND AX,00FFH ADD BX,AXDEC BX MOV AL,BX MOV DX,MY8255_C OUT DX,ALDANG1:MOV DH,

32、SI+6CMP DH,05HJNZ DANG2 PUSH CXMOV CX,10HDA1:CALL DALLY1CALL DALLY1CALL DALLY1CALL DALLY1CALL KEYSCANJMP KAISHIDANG2:CMP DH,06HJNZ DANG3DA2:CALL DALLY1CALL DALLY1CALL DALLY1JMP KAISHIDANG3:CMP DH,07HJNZ DANG4DA3:CALL DALLY1CALL DALLY1JMP KAISHIDANG4:CMP DH,08HJNZ KAISHI1DA4:CALL DALLY1CALL KEYSCANJM

33、P KAISHIDALLY1 PROC NEAR ;软件延时子程序 PUSH CX PUSH AX MOV CX,00AFHD11:MOV AX,5000HD22:DEC AX JNZ D22PUSH 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:

34、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 ;不是则继

35、续判断 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列的值加上

36、当前列数,确定按键值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 D

37、X,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 DTABLE1AND AX,00FFHADD BX,AX MOV AL,BX MOV DX,MY8255_B OUT DX,AL ;写入数码管ADpCALL DALLYDEC SIDEC SI ;取下一个键值 POP DX MOV AL,DLTE

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁