微机课程设计报告-小型步进电机控制系统设计(附程序清单)_第1页
微机课程设计报告-小型步进电机控制系统设计(附程序清单)_第2页
微机课程设计报告-小型步进电机控制系统设计(附程序清单)_第3页
微机课程设计报告-小型步进电机控制系统设计(附程序清单)_第4页
微机课程设计报告-小型步进电机控制系统设计(附程序清单)_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

微机应用系统设计与综合实验设计报告设计题目小型步进电机控制系统设计指导老师设计者目录摘要…………….…………...…...3课程设计目的…………...4设计题目名称及要求…….4实验设备…………...…..…….4设计的思想和实施方案……………..….…….5硬件原理图…………………….11典型程序模块及典型编程技巧…….……13课程设计中遇到的问题及解决方法………………...………16程序流程图………….…19汇编程序清单及程序注释…………..…..……..23C语言程序清单及注释………….……..…..…30收获体会………………….………..……..…37参考文献………..….…..……38摘要在现代电子产品中,步进电机广泛应用于ATM机、喷绘机、刻字机、写真机、喷涂设备、医疗仪器及设备、计算机外设及海量存储设备、精密仪器、工业控制系统、办公自动化、机器人等领域。所以步进电机的控制是一门很实用的技术。本实验主要是基于唐都——PIT试验箱的步进电机控制的设计。主要使用到了并行接口电路8255、LED七段数码管电路、8086cpu、步进电机等元件。主要是通过按键的不同来设置直流电机的转速、运行状态和方向。软件部分采用了汇编语言编写程序代码和C语言编写的步进电机控制程序,通过判断、跳转、循环、延时等基本技术实现。此系统可以通过键盘输入相关数据,并根据需要,实时对步进电机工作方式进行设置,具有实时性和交互性的特点。该设计可应用于步进电机控制的大多数场合关键词:步进电动机调速方向控制并行接口七段数码管小型步进电机控制系统设计报告PAGE46/462010年12月27号小型步进电机控制系统课程设计目的课程设计是本科教学全过程中的重要环节。《微机应用系统设计与综合实验(实践)》课程设计主要培养我们自动化专业学生,运用所学知识解决计算机应用领域内实际问题能力,进一步提高学生运用计算机编程语言综合编程能力、程序调试技能和微机系统接口综合应用及电路设计能力。1、学习在PC系统中扩展简单的I/O接口的方法。2、熟练掌握和运用汇编和C语言编写程序控制8255各口的输入输出,并正确带动数码管及步进电机;能熟练运用汇编和C语言实现8254的定时功能,以确保8255输出的脉冲频率稳定。3、熟练掌握ISA总线配置方式下硬件实验的调试,并能独立的排除故障,以确保实验的顺利进行。4、.巩固和加深课堂所学知识;5、学习掌握一般的软硬件的设计方法和查阅、运用资料的能力;6、通过步进电机控制系统设计与制作,深入了解与掌握步进电机的运行方式、方向、速度、启/停的控制。设计的题目名称及要求设计题目:小型步进电机控制系统设计。设计要求:(1)分别用C语言和汇编语言编程完成硬件接口功能设计;(2)基于80x86微机接口硬件电路设计调试;(3)控制功能要求:小键盘给定分段速度,数码管显示当前步进电机启动与停止、方向、速度信息;(4)具有本地与远程(串行方式下)功能。三、实验设备PC机一台(装有TDPIT软件)、唐都AEDK8688ET实验箱。使用硬件:8086PC,8255芯片,键盘数码管,步进电机驱动电路,步进电机。系统设计:键盘采用实验板提供的4*4键盘,使用4个数码管实时显示系统当前状态。四、设计的思想和实施方案4.1.2步进电机的工作原理步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。步进电机动态指标及术语:1、步距角精度:步进电机每转过一个步距角的实际值与理论值的误差。用百分比表示:误差/步距角*100%。不同运行拍数其值不同,四拍运行时应在5%之内,八拍运行时应在15%以内。2、失步:电机运转时运转的步数,不等于理论上的步数。称之为失步。3、失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调角,由失调角产生的误差,采用细分驱动是不能解决的。4、电机正反转控制:当电机绕组通电时序为AB-BC-CD-DA或()时为正转,通电时序为DA-CA-BC-AB或()时为反转。驱动控制系统组成:使用、控制步进电机必须由环形脉冲,功率放大等组成的控制系统,其方框图如下:脉冲信号的产生:脉冲信号一般由单片机或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号齿和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.28255A的功能简介Intel8086/8088系列的可编程外设接口电路(ProgrammablePeripheralInterface)简称PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。8255A在使用前要写入一个方式控制字,选择A、B、C三个端口各自的工作方式,共有三种;方式0:基本的输入输出方式,即无须联络就可以直接进行的I/O方式。其中A、B、C口的高四位或低四位可分别设置成输入或输出。方式1:选通I/O,此时接口和外围设备需联络信号进行协调,只有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模块进一步的设计图:电机状态显示模块电机状态显示模块CPU8255LED显示模块步进电机模块键盘扫描模块本次设计,对8255的使用是这样的:8255工作于方式0,A口低四位接键盘及数码管显示单元的X1~X4;C口低四位接键盘及数码管显示单元的Y1~Y4;C口高四位接步进电路的驱动电路,使电机转动起来;B口接数码管的A、B、C、D、E、F、G和DP,以使数码管显示电机的转向和转速。8255的A口高四位本次课程设计没有用到。此外,本次设计还用到了实验箱中的键盘及数码管显示单元:方向键:控制步进电机运行方向,无论电机处于运行或停止状态,每按下一次,电机转动方向反向;运行/暂停键:控制电机运行与否。电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行;停止键:无论电机处于任何状态,按下此键,电机停止转动,电机各运行参数复位,默认参数为:“顺时针,停止状态,1档”;档位键:无论电机处于任何状态,均可设定电机档位。数码管显示信息:左起第一个数码管显示当前电机的运行状态:S(Stop)表示当前电机为停止状态;E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。第二个数码管未使用,只有小数点点亮。第三个数码管显示电机运行方向:C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。第四个数码管显示电机的档位:1、2、3、4分别表示1、2、3、4档。键盘数码管内部连线如下图:五、硬件电路原理图图步进电机控制系统硬件电路原理如上图示:该原理图涉及到系统总线、可编程外围接口芯片8255、键盘及数码管显示单元和步进电机及其驱动电路.8255的D0~D7依次接系统总线的XD0~XD7,A1和A0依次接系统总线的XA3和XA2;WR和RD依次接系统总线上的XIOW和XIOR;8255的CS接系统总线的IOY0,8255的A口低四位PA0~PA4依次接小键盘的X1~X4(列);C口低四位PC0~PC3分别接小键盘的Y1~Y4(行);C口高四位PC4~PC7依次接驱动电路的A、B、C和D;B口PB0~PB7分别接数码管的A、B、C、D、E、F、G和DP;A口高四位没用到。图步进电机模块此模块的主要功能是通过接收8255的C口输入信号来控制步进电机的转动,A,B,C,D分别代表不同的四个相位,分别接入到PC0,PC1,PC2和PC3,实现转动控制。图LED模块六、典型程序模块及典型编程技巧分析1.主函数模块主函数MAIN主要是综合调用各子函数,以完成对四项八拍步进电机转速和转向的控制,并在数码管上实时显示电机的运行状态、转向和转速档位。本次设计的电机转速分为四个档,分为一二三四档,在数码管的档位部分显示,分别显示1,2,3,4。当程序开始运行时,数码管上显示初始状态:S(停止),小数点(该位不用)C(顺时针)1(速度为1档)小键盘“0”控制电机转向:程序默认初始态为C(顺时针);按下该键,电机可以切换转向,C(Clockwise)表示电机运行方向为顺时针;A(Anti-clockwise)表示电机运行方向为逆时针。无论电机处于运行或停止状态,每按下一次,电机转动方向反向。小键盘“1”控制电机开始和暂停两个状态之间的切换:电机转动时按下,电机暂停,当前电机运行参数不变,再次按下时,电机继续按暂停前参数运行。E(Enable)表示当前电机为运行状态;P(Pause)表示当前电机为暂停状态。小键盘“2”控制电机的停止复位(S:Stop):按下该键,电机停止转动,并且恢复到初始参数状态。小键盘“4”“5”“6”“7”控制电机的四个转速档位:当按下这四个键时,分别是电机运行在1,2,3,4,转速档位。即实现了电机的调速,并且可以实现任意档速的切换。2.键盘扫描与显示子程序模块此子函数是用来扫描小键盘哪行哪列有键按下,当确定某行某列有键按下时,再把相应的键值保存起来。小键盘有四行四列共16个按键,第一行从左到右依次是0~3;第二行从左到右依次是4~7;第三行从左到右依次是8~B;第二行从左到右依次是C~F。为了实现判断功能,在C语言中设置三个标志位:1.运行状态标志MODE:0=停止(Stop);1=运行(Enable);2=暂停(Pause)。2.方向标志DIR(Direction):0=逆时针(Anti-clockwise);1=顺时针(Clockwise)。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.C1”。在汇编程序中,用DTABLE1中存放数码管的编码。[SI][SI+2][SI+4][SI+6]中分别存放四个数码管应显示的编码在DTABLE1中对应的位置。与C程序中不同,汇编程序中取消了dir、mode、grd三个独立的变量,而是直接用[SI][SI+4][SI+6]来代表,即:[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的C口高四位,使X1~X4(列)全选通,然后由8255的C口低四位判断各列所对应的行是否有键安下,无任何键按下则C口低四位读入的全是“1”,若有键按下则C口低四位读入的对应行是“0”,其余全是“1”,经取反(NOT)后扫描小键盘的子程序CCSCAN的功能变为:若小键盘无键按下则AL寄存器数据为“0”;若小键盘有键按下则AL寄存器数据为非“0”。为减少引线,键盘采用矩阵式。键盘的识别采用行扫描法,程序使某行为低电平,则说明行列交叉点处的键被按下,然后,再具体确定按下的是哪个键。为此先使所在行输出为0,再检查列线是否有0。如果有零的话,此时由于不能确定闭合键所在的行,于是再用行扫描法来具体定位。如果读得数据全部为1,则说明无键闭合。硬件上将8255端口C的上、下半部分分别用作键盘的行线和列线。用电平逻辑开关输出高低电平来代替键盘按键。5.显示键值子程序将保存示值子函数中保存下的电机运行状态、转向和转速值送到数码管上显示。数码管的段位顺序如右图所示:一般来说在一个字节中按照abcdefgdp的顺序放置字型码,比如在一个“共阴极”数码管上要显示“1”,则b、c段需被点亮,因此在段选线中写入60H。对应规则:a>D7 b>D6c>D5d>D4e>D3f>D2g>D1图3-2数码管显示dp>D0LED显示器的显示方法有两种——静态显示法和动态扫描显示法。静态显示就是每一个显示器各笔画段都要独占具有所存功能的输出口线,CPU把要显示的字符代码送到输出口上,就可以是显示器显示所需的数字后符号。但由于它站用的I/O口线较多,硬件成本高。所以我们选用了动态扫描显示法。6.清除数码管显示子程序将段位置0即可清除数码管显示,即将00H分别送入A口(驱动LED灯和B口(驱动数码管)便可实验此功能7.软件延时子程序延时子函数,可供别的程序调用以实现较好的显示和操作效果。读取键盘时要有一定的延时,来跳过键盘在刚按下时产生的抖动。判断档位,进行相应的延时,注意延时的时候也应每隔一定时间调用keyscan()键盘扫描及显示程序,已保证及时响应键盘输入,和刷新数码管,使数码管常亮。应注意调用子程序前要将CX与AX寄存器的内容入栈进行保护。七、课程设计中遇到的问题及解决方法在本次课程设计过程中,我遇到了一下问题:首先,在显示模块中,在做数码管显示时,每次可以输出四位信息,而且要输出的字符须转化为相应的ASCII才行,否则就不能输出想要的东西。显示模块的调试一般是程序问题,硬件连接很简单,一般不会出错,我在调试时,开始没有初始化8255,导致结果不能输出。再就是相应的端口一定不能定义错误。这在显示模块调试中应该多注意。在这里还有一个比较难解决的问题,即调用了数码管显示程序而却看不到数码管有示数,这主要是调用数码管显示子函数的频率不够高,可以把数码管显示子函数换个位置,或者是多调用几次就可以解决了。至于数码管好像是全亮,情况正好相反,是数码管显示子函数调用的频率过高,把数码管显示子函数换个位置,或者是在关键位置调用一下延时函数就可以解决了。还有,DIS和CLEAR成对调用可使数码管有个较好的显示效果。在刚开始编程时,各种功能大部分是由主程序来完成的。由于主程序过于复杂,可读性不高。使得在以后的程序的调试中遇到了很大的麻烦。后来把主程序的部分功能转化成子程序来实现,并在一些重要的地方增加了注释,使的程序的可读性大大加强。调试也变的比较简单了。其次,在使用小键盘时容易死机。出现死机的原因有很多,有时候同一个程序换台机子运行就会死机,有时候同一台机子同一个程序运行多次就会死机,不过总的来看死机的出现多少是和所编写的程序有关,记得我以前用小键盘时就是很容易就死机了,不过在这次的课程设计中我把所有的和小键盘有关的程序都用了子函数代替,大大简化了主程序的结构,这样就基本再也没发生过死机现象了。再者,当小键盘按下不松时电机也停止转动这种情况出现在电机的加速、减速和改变转向中,这主要是在原有的keyscan程序中有一段判断按键是否弹起的程序,将此段换成一个合适的软件延时便可以起到很好的效果(按键不松时可以连续的加速和减速)。再就是寄存器的使用问题。在编程时,子程序的调试也是相当重要,由于子程序不可避免的使用AX\BX\CX\DX通用寄存器一个或几个。使得原主程序中的通用寄存器的内容很容易被覆盖,对子程序中所有的通用寄存器出入栈即可以避免上诉的问题,不用考虑使用的是哪几个寄存器,使用起来又比较简单方便。数码转换问题,首先查找许多相关的典型程序,例如:十六位二进制数转换为10进制BCD码,可将AX中的二进制数先后除以1000,100,10,每次除法所得的商,即是BCD的千位、百位和十位数,余数是个位。TRAN:PUSHCXSHLDX,CLPUSHDXXCHGAL,AHSUBDX,DXSUBAH,AHMOVCX,1000MOVCL,10DIVCXDIVCLXCHGAX,DXADDDL,ALMOVCL,4MOVCL,4SHLDX,CLSHLDX,CLMOVCL,100ADDDL,AHDIVCLMOVAX,DXADDDL,ALPOPDXMOVCL,4POPCX而在算术运算方面也遇到了不少的问题,由于设计过程中存在着小数所以很多时候总会出现算术方面错误,具体表现为结果的溢出或者结果小数点位置错误。解决的方法通常是先将所要计算的数值乘以10、100等使得数值为整数,然后再进行计算,而在结果输出时再除以相映的数值从而实现小数的算术运算功能,而不需要采用定义浮点型去计算小数以避免出现数值定义的错误。另一个常见的错误就是自定义存储空间之间的数值存放,因为在许多时候总是需要将结果保存在某一段存储空间里面,由于对存储空间的定义使得其大小范围各有不同,所以对其赋值时总是会出现溢出或数值转换的错误。而在子程序调用以循环方面存在的问题是指针的计数以及标志位清零或置1搞错从而使子程序运算错误或者进入死循环等。所采取的解决方法是对指针计数值在各个部分运算结束后进行清零以保证指针初值的正确。最后的问题就是DOS系统功能调用和BIOS中断调用,因为本课题设计中要实现软件时钟,所以需要对软件延迟以及中断调用有一定的了解,对此在设计时查阅了一些相关的软件中断命令。当个模块都调试成功后,即可合成到一起运行。本系统电机的速度可以通过速度增减键来控制。通过验证各按键是否被有效采用,来检验该系统是否正确的完成了指定的功能。八、实验程序的流程图电机停止转动键值为0?电机停止转动键值为0?延时等待仍在按下?初始化8255开始小键盘有键按下?改变电机转向(速度置最低)电机运行电机速度方向不变电机暂停键值为2?键值为3?键值为4~7结束小键盘有键按下?键值为1?数码管同步显示电机的状态、转速和方向否否是是否否否是否是是是 电机速度档位否是否是否是是是否否电机速度档位否是否是否是是是否否扫描与显示流程图:键盘显示子程序流程图:键盘扫描子程序流程图:九、汇编程序清单及程序注释;步进电机实验IOY0EQU0e400H;片选IOY0对应的端口始地址MY8255_AEQUIOY0+00H*4;8255的A口地址MY8255_BEQUIOY0+01H*4;8255的B口地址MY8255_CEQUIOY0+02H*4;8255的C口地址MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATA SEGMENTDTABLE1DB6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80HDTABLE3DB10H,30H,20H,60H,40H,0C0H,80H,90HDATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,3000HMOV[SI],00HMOV[SI+2],09HMOV[SI+4],04HMOV[SI+6],05HMOV[SI+8],01HMOVDX,MY8255_MODE;初始化8255工作方式MOVAL,81H;方式0,A口、B口输出,C口低4位输入OUTDX,ALKAISHI: MOVSI,3000HMOVDH,[SI+8]CMPDH,8JAZHI1CMPDH,1JBZHI8JMPJIXUZHI1: MOV[SI+8],01HJMPJIXUZHI8: MOV[SI+8],08HJIXU: CALLKEYSCANMOVAH,1;判断是否有按键按下INT16HJZSFRUN;无按键则跳回继续循环,有则退出QUIT:MOVAX,4C00H;结束程序退出INT21HSFRUN: MOVSI,3000HMOVDH,[SI]CMPDH,01HJNZJIXU MOVDH,[SI+4] CMPDH,04H JNZZIJIAN INC[SI+8] JMPRUNKAISHI1:JMPKAISHIZIJIAN: DEC[SI+8]RUN: MOVAL,[SI+8] MOVBX,OFFSETDTABLE3ANDAX,00FFH ADDBX,AX DECBX MOVAL,[BX]MOVDX,MY8255_COUTDX,AL DANG1: MOVDH,[SI+6] CMPDH,05H JNZDANG2 PUSHCX MOVCX,10HDA1: CALLDALLY1 CALLDALLY1 CALLDALLY1 CALLDALLY1CALLKEYSCAN JMPKAISHIDANG2: CMPDH,06H JNZDANG3DA2: CALLDALLY1 CALLDALLY1 CALLDALLY1 JMPKAISHIDANG3: CMPDH,07H JNZDANG4DA3: CALLDALLY1 CALLDALLY1 JMPKAISHIDANG4: CMPDH,08H JNZKAISHI1DA4: CALLDALLY1 CALLKEYSCAN JMPKAISHIDALLY1PROCNEAR;软件延时子程序PUSHCXPUSHAXMOVCX,00AFHD11: MOVAX,5000HD22: DECAXJNZD22PUSHCXPUSHAXCALLKEYSCANPOPAXPOPCXLOOPD11POPAXPOPCX RET DALLY1ENDPKEYSCANPROCNEAR;键盘扫描子程序BEGIN: CALLDIS;显示刷新 CALLCLEAR;清屏 CALLCCSCAN;扫描按键 JNZGETKEY1;有键按下则跳置GETKEY1 JMPGOBACK1GETKEY1:CALLDIS;显示刷新CALLDALLYCALLDALLYCALLCLEAR;清屏 CALLCCSCAN;再次扫描按键 JNZGETKEY2;有键按下则跳置GETKEY2 JMPBEGIN;否则跳回开始继续循环GETKEY2:MOVCH,0FEH MOVCL,00H;设置当前检测的是第几列COLUM:MOVAL,CH;选取一列,将X1~X4中一个置0MOVDX,MY8255_A OUTDX,ALMOVDX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合 INAL,DXL1:TESTAL,01H;是否为第1行JNZL2;不是则继续判断MOVAL,00H;设置第1行第1列的对应的键值 JMPKCODEBEGIN1: JMPBEGINL2:TESTAL,02H;是否为第2行JNZL3;不是则继续判断MOVAL,04H;设置第2行第1列的对应的键值JMPKCODEL3:TESTAL,04H;是否为第3行JNZL4;不是则继续判断MOVAL,08H;设置第3行第1列的对应的键值 JMPKCODEL4:TESTAL,08H;是否为第4行JNZNEXT;不是则继续判断MOVAL,0CH;设置第4行第1列的对应的键值KCODE:ADDAL,CL;将第1列的值加上当前列数,确定按键值 CALLPUTBUF;保存按键值 PUSHAXKON:CALLDIS;显示刷新 CALLCLEAR;清屏 CALLCCSCAN;扫描按键,判断按键是否弹起 JNZKON;未弹起则继续循环等待弹起 POPAXNEXT:INCCL;当前检测的列数递增 MOVAL,CH TESTAL,08H;检测是否扫描到第4列 JZBEGIN1 ROLAL,1;没检测到第4列则准备检测下一列 MOVCH,AL JMPCOLUMGOBACK1: RETKEYSCANENDPCCSCANPROCNEAR;扫描是否有按键闭合子程序MOVAL,00HMOVDX,MY8255_A;将4列全选通,X1~X4置0 OUTDX,ALMOVDX,MY8255_CINAL,DX;读Y1~Y4 NOTALANDAL,0FH;取出Y1~Y4的反值 RETCCSCANENDPCLEARPROCNEAR;清除数码管显示子程序MOVDX,MY8255_B;段位置0即可清除数码管显示MOVAL,00HOUTDX,AL RETCLEARENDPDISPROCNEAR;显示键值子程序PUSHAXPUSHSI MOVSI,3006H MOVDL,0F7H MOVAL,DLAGAIN:PUSHDXMOVDX,MY8255_AOUTDX,AL;设置X1~X4,选通一个数码管MOVAL,[SI];取出缓冲区中存放键值MOVBX,OFFSETDTABLE1 ANDAX,00FFH ADDBX,AX MOVAL,[BX]MOVDX,MY8255_B OUTDX,AL;写入数码管A~Dp CALLDALLY DECSI DECSI;取下一个键值POPDXMOVAL,DL TESTAL,01H;判断是否显示完?JZOUT1;显示完,返回 RORAL,1 MOVDL,AL JMPAGAIN;未显示完,跳回继续OUT1:POPSI POPAX RETDIS ENDPPUTBUFPROCNEAR;保存键值子程序MOVSI,3000H CMPAL,00H JNZMODEDIR: CMP[SI+4],03H JZDIR1MOV[SI+4],03HJMPLASTDIR1: MOV[SI+4],04HJMPLASTMODE: CMPAL,01H JNZSTOP CMP[SI],01H JZMODE1 MOV[SI],01H JMPLASTMODE1: MOV[SI],02HJMPLASTSTOP: CMPAL,02H JNZGRD1 MOV[SI],00H MOV[SI+4],04H MOV[SI+6],05HGRD1: CMPAL,04H JNZGRD2 MOV[SI+6],05HGRD2: CMPAL,05H JNZGRD3 MOV[SI+6],06HGRD3: CMPAL,06H JNZGRD4 MOV[SI+6],07HGRD4: CMPAL,07H JNZLAST MOV[SI+6],08HLAST: CALLDIS CALLCLEAR CALLCCSCANGOBACK:RETPUTBUFENDPDALLYPROCNEAR;软件延时子程序PUSHCXMOVCX,00FFHD1:MOVAX,00FFHD2:DECAX JNZD2 LOOPD1 POPCX RETDALLYENDPCODEENDSENDSTART十、C语言程序清单#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<bios.h>#include<ctype.h>#include<process.h>voiddis(void);voidkey(void);voidclear(void);voidccscan(void);voidaction(void);voidputbuf(void);voidgetkey(void);voiddelay0(inttime);voidkeyscan(void);voiddelay1(inttime);#defineIOY00x0C400#defineMY8255_AIOY0+0x00*4#defineMY8255_BIOY0+0x01*4#defineMY8255_CIOY0+0x02*4#defineMY8255_MODEIOY0+0x03*4chara[]={0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,0x4f,0x66,0x80};charb[]={0x00,0x09,0x04,0x05};charc[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};intdir=1;intmode=0;intgrd=1;intcc;intn;voidmain(){inti=0;intj;outp(MY8255_MODE,0x81);while(1){while((i<=7)&&(i>=0)){while(1){keyscan();if(mode==1)break;key();}if(dir==1)i++;if(dir==0)i--;outp(MY8255_C,c[i]);if(grd==4)for(j=500;j>0;j--){delay1(0x10);keyscan();}if(grd==3)for(j=1000;j>0;j--){delay1(0x10);keyscan();}if(grd==2)for(j=3000;j>0;j--){delay1(0x10);keyscan();}if(grd==1)for(j=5000;j>0;j--){delay1(0x10);keyscan();}key();}if(i>7)i=0;if(i<0)i=7;}}voiddelay1(inttime){inti;intj;for(i=0;i<=time;i++){for(j=0;j<=0x700;j++){}}return;}voidkeyscan(){dis();clear();ccscan();if(cc){dis();delay0(0x100);delay0(0x100);clear();ccscan();if(cc){getkey();putbuf();}}key();}voidgetkey(void){inti;intj=0xfe;for(i=0;i<=3;i++){outp(MY8255_A,j);if(!((inp(MY8255_C))&0x01)){n=i+0;action();return;}if(!((inp(MY8255_C))&0x02)){n=i+4;action();return;}if(!((inp(MY8255_C))&0x04)){n=i+8;action();return;}if(!((inp(MY8255_C))&0x08)){n=i+12;action();return;}j<<=1;}}voidccscan(void){outp(MY8255_A,0x00);cc=inp(MY8255_C);cc=(~cc)&0x0F;}voiddis(void){inti;intj=0xf7;for(i=3;i>=0;i--){outp(MY8255_A,j);out

温馨提示

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

评论

0/150

提交评论