循环灯实验报告与代码
- 格式:doc
- 大小:82.50 KB
- 文档页数:13
青 岛 科 技 大 学微机原理与接口技术综合课程设计(报告)题 目 __________________________________指导教师__________________________ 学生姓名__________________________ 学生学号_________________________________________________________院(部)____________________________专业________________班______年 ___月 ___日直流电机控制综合实验 周艳平宋雪英 01信息科学技术学院 计算机科学与技术0961 2012 12 27摘要 (2)1、单片机概述 (2)2、仿真软件介绍 (2)3、需求分析 (3)一、课程设计目的 (3)二、课程设计要求 (4)三、实验内容 (4)1、设计任务与要求 (4)2、系统分析 (4)1).硬件电路设计(画出原理图、接线图) (5)2)软件框图 (7)3、用keil建项目流程 (8)4、程序清单 (9)4、系统调试 (11)四、设计总结(结论) (12)摘要近年来,随着电子技术和微型计算机的发展,单片机的档次不断提高,起应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到广泛的应用、成为现代电子系统中最重要的智能化的核心部件。
而AT89C51就是其中一种,它是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMO8位微处理器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
本课程设计介绍一种LED小灯控制系统的设计方法,以单片机作为主控核心,与按键、排阻、电阻、电容等较少的辅助硬件电路相结合,利用软件实现对LED灯进行控制。
能够通过按键控制8个LED小灯从左到右依次点亮。
关键字:单片机、LED流水灯1、单片机概述单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
《微机实验》报告LED灯控制器指导教师:专业班级::学号:联系方式:一、任务要求实验目的:加深对定时/计数器、中断、IO端口的理解,掌握定时/计数器、中断的应用编程技术及中断程序的调试方法。
实验内容:利用C8051F310单片机设计一个LED灯控制器主要功能和技术指标要求:1. LED灯外接于P0.0端。
2. LED灯分别按2Hz,1Hz和0.5Hz三种不同频率闪动,各持续10s。
3. 在LED灯开始和停止闪烁时蜂鸣器分别鸣响1次。
4. 利用单片机内部定时器定时,要求采用中断方式。
提高要求:使用按键(KINT)控制LED灯闪烁模式的切换。
二、设计思路C8051F310单片机片上晶振为24.5MHz,采用8分频后为3.0625MHz ,输入时钟信号为48个机器周期,所以T1定时器采用定时方式1,单次定时最长可以达到的时间为1.027s,可以满足0.5Hz是的定时要求。
基础部分:给TMOD赋值10H,即选用T1定时器采用定时方式1,三种频率对应的半周期时间为0.25s、0.5s、1s。
计算得需给TH1和TL1为C1H、B1H;83H、63H;06H、C6H。
要使闪烁持续10s,三种模式需要各循环40、20、10次。
用LOOP3:MOV C,PSW.5 ;PSW.5为标志位,进定时器中断后置一JNC LOOP3代替踏步程序等待中断,以便中断完后回到主程序继续向下执行。
为了减少代码长度,可以采用循环结构,循环主题中,将R1、R2分别赋给TH1、TL1,R7为循环次数(用DJNZ语句实现);定时中断里,重新给TH1、TL1赋值时同理。
这样,循环时只要把定时时间和循环次数赋给R1、R2、R7即可,达到减少代码长度的效果。
蜂鸣器也采用T1定时方式1,定时一秒。
提高部分:采用外部中断0,下降沿触发。
外部中断程序里置标志位PSW.1和R0,PSW.5用于判断执行完一种模式后,是否跳出循环结束。
R0用于判断执行何种模式,每按一次后RO 加一,第四次时就将R0和PSW.5清零,这样程序就又回到了基础部分的循序执行。
循环彩灯控制系统实验报告一、设计要求1、程序中由3个按钮控制每按下一个按钮都会出现不同的彩灯循环现象二、硬件电路设计1、单片机最小系统(2)发光二极管的电路三、软件设计(一)1、在Keil uVision4.LNK上写好程序后通过STC_ISP_V480.exe.lnk和USB口输入到reg52.h单片机中按下开关蓝色指示灯亮,然后按下P3^7按钮发光二极管从左往右依次点亮;2、①在不复位的情况下按下P3^6时发光二极管可以做往返运动依次点亮②在复位时按下P3^6发光二极管是从右往左依次点亮的;3、①在不复位的情况下按下P3^5时发光二极管可以在从左往右或者从右往左点亮后1,3,5,7与2,4,6,8交替闪烁(在看先点亮P3^6还是P3^5 来实现从左还是从右开始循环)②在复位时按下P3^5发光二极管是作1,3,5,7与2,4,6,8交替闪烁。
(二)说明(“0”“1”“2”“3”“4”“5”“6”“7”按键P3^7 0X7F 0XBF 0XDF 0XEF 0XF7 0XFB 0XFD 0XFE 复位P3^6 0XFE 0XFD 0XFB 0XF7 0XEF 0XDF 0XBF 0X7F 复位P3^5 0X7F/0XFF 0XFF/0XBF0XDF/0XFF0XFF/0XEF0XF7/0XFF0XFF/0XFB0XFD/0XFF0XFF/0XFE复位8421码10=A 11=B 12=C 13=D 14=E 15=F四、系统测试步骤1:新建工程→New Project→选择单片机型号→Atmel→AT89C52取名→保存2:新建文档→New file→取名→保存(—3个按键控制两种LED现象.C)3:点右键→Add file to group→选择(—3个按键控制两种LED现象.C)4:点工程右键→options “output”(√)create hex file5产出hex档→编译按钮(↓)(↓↓)(↓↓↓)STC下载软件1:选择单片机型号“STC89C52RC”2:打开文件→(流水灯.hex)3:选择COM口(裝置管理員)4:点下载按鈕→开启电源按钮→“OK 已加密”附录源程序清单#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1 =P3^7; //第一个按键sbit key2 =P3^6; //第二歌按键sbit key3 =P3^5; //第三个按键uchar A1=0,A2=0,A3=0;void delay(uint z){uint i,j;for(i=0;i<z;i++)for(j=0;j<110;j++);}void O_to_E() //1,3,5,7与2,4,6,8交替闪烁{P0=0Xaa;delay(200);P0=~0Xaa;delay(200);}{if(!key1){delay(10); //延时if(!key1)A1=1;}if(!key2){delay(10); //延时if(!key2)A2=1;}if(!key3){delay(10); //延时if(!key3)A3=1;}}void main(){uchar i;while(1){if(A1){for(i=0;i<8;i++) //从左往右亮,每盏灯亮一次{P0=~(0x7f>>i);delay(100);}}if(A2){for(i=0;i<8;i++) //从右往左亮,每盏灯亮一次{P0=~(0xfe<<i);delay(100);}}if(A3){O_to_E(); //1,3,5,7与2,4,6,8交替闪烁}}}附加图片(因为手机问题从左往右跟从右往左还有左右往返的看不出来所以就拍了2张图片)1、从左往右、从右往左、往返2、//1,3,5,7与2,4,6,8交替闪烁超。
单个按键控制4个LED(入门级实验)实验介绍:通过单个按键控制4个LED灯的亮灭状态。
正常情况下,一个按键控制1个灯。
在本次实验中,要求使用1个按键,控制4个LED灯。
通过按键按下的次数,控制LED的亮灭状态。
按下1次,1个LED灯点亮,按下2次,2个LED 灯点亮,按下3次,3个LED灯点亮,按下4次,4个LED灯点亮,按下5次,所有LED灯都熄灭,如此循环。
如此就可以通过单个按键控制4个LED灯的亮灭。
在照明场所,控制LED灯的点亮个数,就可以控制亮度。
实验目的:在使用单片机等控制器控制周边元件的时候,经常会遇到I/O口不够用的情况。
因此在使用的时候,尽量省着用。
本次实验通过单个按键控制4个LED灯的亮灭状态,正常情况下需要4个按键,因而达到了节省单片机I/O口的目的。
通过此次实验室,学习单片机按键的编程控制方法,学习LED灯输出的控制方法。
学习最简单的输入设备(按键)控制最简单的输出设备(LED灯)的控制方法。
仿真原理图:在仿真软件Proteus中绘制仿真原理图如上图所示。
(注意事项:在进行实物制作时,发光二极管串联的电阻可以省略,因为单片机引脚灌电流的能力有限,限制了通过发光二极管电流的大小。
在仿真过程中,电阻R2~R9的大小要合适,太大LED将无法点亮。
)编程思路:当单片机上电后,所有的I/O口默认高电平,因而四个发光二极管在单片机上电后,都为熄灭状态。
此时,我们按下按键后,就可以调节各个发光二极管的亮灭状态。
当按一次按钮,将P2口的状态进行左移一位,同时将P2的最低位清零,就可以达到按一次按钮后,LED灯多亮一个。
如,当前只有P2口控制的最低位连接的LED点亮,当我们按一次按键,单片机首先将P2的状态循环左移一位,则刚才的最低位变为次低位,也就是倒数第二位点亮,同时将P2口的最低位清零,也就是倒数第一位连接的LED灯点亮,即按一次按钮后,倒数第一位和倒数第二位灯点亮。
其他状态与上述过程类似,这里不再赘述。
实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。
二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。
2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。
3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。
5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。
三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。
当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。
E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。
综上,画出实验电路原理图。
2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。
图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。
实验5程序流程图如图3-5,3-6所示。
图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。
实验一流水灯实验一、实验目的1)简单I/O引脚的输出2)掌握软件延时编程方法3)简单按键输入捕获判断二、实验实现的功能1)开机时点亮12发光二极管, 闪烁三下2)按照顺时针循环依次点亮发光二极管3)通过按键将发光二极管的显示由顺时针改为逆时针方式三、系统硬件设计单片机STC10F08XE 1片发光二极管led 红4个黄4个绿4个按键6个复位电路时钟电路如下图所示:四、系统软件设计#include<reg51.h>sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; void Delay(void){unsigned char i,j,k;for(i=10;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }Scan_Key(){ unsigned char FLAG=0;unsigned char n;n=(L1==0)||(L2==0)||(L3==0);if(n) { FLAG=1;}return FLAG; }main(){ unsigned char y,n,s=0,b=1,m=0;unsigned char c=1;unsigned char a[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char h[]={0xff,0x38,0x34,0x2f,0x1f};n=Scan_Key(); for(y=0;y<3;y++){ P2=0; P3=0; Delay(); Delay(); Delay();P2=0xff; P3=0xff; Delay(); Delay(); Delay(); }while(1) { while(1){ m=m+n; P3=0x3f; while(1){ for(;b<9;b++){ n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==0)){P2=a[b];Delay();}else { P2=0xff;break; }if(m%2==0) c=1; P2=0xff; }for(;c<5;c++){n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==0)){ P3=h[c];Delay();}else { P3=0x3f;break;} }if(m%2==0) b=1; break; }if(m%2==1) break; }while(1){ for(;b>0;b--){n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==1)){P2=a[b];Delay(); } else{P2=0xff;break;} P2=0xff; }if(m%2==1) c=4; for(;c>0;c--){ n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==1)){ P3=h[c]; Delay();}else { P3=0x3f;break;} P3=0x3f; }if(m%2==0) break;if(m%2==1) b=8; } } }五、实验过程中遇到的问题及解决方法问题1: 如何实现顺、逆时针依次点亮流水灯?解决: 利用循环右移_cror_(m,1)和循环左移_crol_(n,1)依次点亮。
项目:三循环闪烁灯系统一、实验目的1.通过对实际知识的掌握学会用其进行基本的电路设计。
2.熟悉、认知各器件的功能和作用。
3.掌握对电路的焊接和调试。
二、实验仪器电阻器(510Ω(R2、R4、R6),10KΩ(R1、R3、R5))*6发光二极管(LED红色)*3NPN三极管(S9013H(V1、V2)、S8050D(V3))*32P插针*1电解电容(容值:47μF,耐压值:16V(C1、C2、C3))*3电能万木板*1。
三、实验电路,工作原理①S9013H三极管,S8050D三极管是一种NPN型小功率三极管,具有电流放大和开关作用。
其实质是三极管能以基极电流微小的变化量来控制集电极电流较大的变化量。
具有把微弱信号放大成幅值较大的电信号,也用作无触点开关。
本次三极管的主要是利用“开关”功能,保证发光二极管的明灭。
②电解电容的作用1.通交流隔直流,通高频阻低频。
2.滤波作用,在电源电路中,整流电路将交流变成脉动的直流,而在整流电路之后接入一个较大容量的电解电容,利用其充放电特性,使整流后的脉动直流电压变成相对比较稳定的直流电压。
在实际中,为了防止电路各部分供电电压因负载变化而产生变化,所以在电源的输出端及负载的电源输入端接有数十至数百微法的电解电容。
3.耦合作用:在低频信号的传递与放大过程中,为防止前后两级电路的静态工作点相互影响,常采用电容藕合.为了防止信号中低频分量损失过大,一般采用容量较大的电解电容。
4.旁路作用,为交流电路中的某些元件提供低阻抗回路。
5.存储能量的作用,用在特定情况下释放所需要的电流。
6.调节谐振频率的作用,比如收音机电路,LC晶振电路。
本次主要利用电容的充放电特性是发光二极管产生接连明灭的“流水灯”效果。
③电阻器的作用是限制电流大小,防止电流过大导致元器件损坏。
工作原理本电路是由3只三极管组成的循环驱动电路。
每当电源接通时,3只三极管会争先导通,但由于元器件存在差异,所以只会有1只三极管先导通。
青 岛 科 技 大 学微机原理与接口技术综合课程设计(报告)题 目 __________________________________指导教师__________________________ 学生姓名__________________________ 学生学号_________________________________________________________院(部)____________________________专业________________班______年 ___月 ___日直流电机控制综合实验 周艳平宋雪英 01 信息科学技术学院计算机科学与技术0961 2012 12 27摘要 (2)1、单片机概述 (2)2、仿真软件介绍 (2)3、需求分析 (3)一、课程设计目的 (3)二、课程设计要求 (4)三、实验内容 (4)1、设计任务与要求 (4)2、系统分析 (4)1).硬件电路设计(画出原理图、接线图) (5)2)软件框图 (7)3、用keil建项目流程 (8)4、程序清单 (9)4、系统调试 (11)四、设计总结(结论) (12)摘要近年来,随着电子技术和微型计算机的发展,单片机的档次不断提高,起应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到广泛的应用、成为现代电子系统中最重要的智能化的核心部件。
而AT89C51就是其中一种,它是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMO8位微处理器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
本课程设计介绍一种LED小灯控制系统的设计方法,以单片机作为主控核心,与按键、排阻、电阻、电容等较少的辅助硬件电路相结合,利用软件实现对LED灯进行控制。
能够通过按键控制8个LED小灯从左到右依次点亮。
关键字:单片机、LED流水灯1、单片机概述单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
合肥工业大学计算机与信息学院课程设计课程:微机原理与接口技术设计专业班级:计算机科学与技术12-1班学号:2012211599姓名:柏恩慈一、设计题目及要求:题目:利用8255A和8253使发光二极管按一定规律轮流点亮要求:发光二极管的点亮方式:将发光二极管分为n组,每组12/n个灯管,每组灯管发光时间没t。
设有8种组合:(1)n=12,t=1s: 每个灯管单独一组,间隔1秒循环点亮。
(2)n=12,t=2s: 每个灯管单独一组,间隔2秒循环点亮。
(3)n=6,t=1s: 每两个灯管一组,间隔1秒循环点亮。
(4)n=6,t=2s: 每两个灯管一组,间隔2秒循环点亮。
(5)n=4,t=1s: 每三个灯管一组,间隔1秒循环点亮。
(6)n=4,t=2s: 每三个灯管一组,间隔2秒循环点亮。
(7)n=3,t=1s: 每四个灯管一组,间隔1秒循环点亮。
(8)n=3,t=2s: 每四个灯管一组,间隔2秒循环点亮。
要求:按键盘的“A”, “B”, “C”, “D”分别表示选择的灯管数目(一个一组,两个一组,三个一组,四个一组),按键盘的“E”, “F”,表示选择时间(一秒两秒)。
程序启动时默认按第一种方式进行循环,当按动“A~F”时,根据设定情况随时改变循环方式,当按“0”键退出程序,所有灯管熄灭。
提示:1:主程序为键盘输入按’A’~’D’命令分支到各点亮功能程序段,按’0’退出。
2:定时时间1秒2秒可由8253产生定时中断,通过IPQ2引起中断请求。
8253的定时器工作可参考“定时/计数器:8253方波”。
3:在中断服务程序中,通过8255A的端口B的PB4-PB7,端口C的PC0—PC7来设置发光二极管下一组灯点亮,其他灯都暗。
次序可从左到右,也可以从右到左。
4: 8255A输出点亮发光二极管可参考“8255A”并行口实验(三)。
二、设计思想:使用8259中断服务子程序,来去执行中断,用8253方波计时器来去产生1秒和两秒的时间间隔。
把8253和8259结合正好可以把间隔一秒和两秒的计时器导入程序之中。
利用5255A交通灯的特性,把交通灯按要求轮流点亮。
(一)可编程并行接口芯片8255系统中的8255线路8255的数据线片选信号线、地址线、读写控制线等分别与系统总线相连,其A、B、C三个端口以排针形式引出供825实验使用。
可编程并行接口Intel8255A,其内部结构如图所示,由以下4个部分组成:①数据总线缓冲器。
这是一个三态双向8位缓冲器,它是8255A与CPU系统数据总线的接口。
所有数据的发送与接收,以及CPU发出的命令字和从8255A来的状态信息都是通过该缓冲器传送的。
②读/写控制逻辑。
读/写控制逻辑由读信号RD,写信号WR,选片信号CS以及端口选择信号A0、A1等组成。
读/写控制逻辑控制了总线的开放、关闭和信息传送的方向,以便把CPU的控制命令或输出数据送到相应的端口;或把外设的信息或输入数据从相应的端口送到CPU。
8255A的基本操作及在TP86A、PC/TX和扩展板上的端口地址如下表所示。
③输入/输出端口A、B、C。
8255A包括3个8位输入输出端口(port)。
每个端口都有一个数据输入寄存器和一个数据输出寄存器,输入时端口有三态缓冲器的功能,输出时端口有数据锁存器功能。
在实际应用中,PC口的8位可分为两个4位端口(0方式下),也可以分成一个5位端口和一个3位端口(2方式下)来使用。
④A组和B组控制电路。
控制A,B,C三个端口的工作方式,A组控制A口和C-4-口的上半部(PC4-PC7),B组控制B口和C口的下半部(PC0-PC3)的工作方式和输入输出。
A组和B组的命令寄存器还接收按位控制命令,以实现对PC口的按位置位/复位操作。
(二)Intel8253可编程定时/计数器1片8253内部有3个计数器,分别称为计数器0、1、2,其结构完全,互相之间工作完全独立。
每个计数器有三个引脚和外部联系CLK:计数脉冲输入,计数器对该引脚出现的信号进行计数,最高计数速率为2.6MHZ。
Gate:门控输入,用于控制计数器是否对CLK计数。
OUT:输出信号端。
每个计数器内部都有1个8位的控制寄存器,三个控制寄存器使用同一端口地址,在编程结构图中,画为1个控制寄存器。
每个计数器内部还有1个计数初值寄存器(CR)、1个计数执行部件(CE)和1个输出锁存器(OL),它们都是16位的。
执行部件(CE)是1个16位减法计数器,其起始值等于初值寄存器(CR)的值。
CR的值通过程序设置。
输出寄存器(OL)用来锁存执行部件(CE)的值,以便CPU读出。
原理:通过Intel8253可编程定时/计数器方式3方波发生器与方式0计数结时产生中断风别产生的方波和中断来计数,配合可编程并行接口芯片8255来控制流水灯的循环点亮,通过键盘扫描来接受外部控制.并通过八段数码管将A,B,C,D显示,并且转入相应的模式执行。
实验连线:8255A:PA0-L15 PA1-L14 PA2-L13 PA3-L11PA4-L10 PA5-L9 PA6-L7 PA7-L6PB0-L5 PB1-L3 PB2-L2 PB3-L18259:连接138译码输入端A.B.C,其中A连A2,B连A3,C连A4,138使能控制输入端G与总线单元上方的GS相连。
将8259CS插孔与译码单元的Y0相连,中断源IR7与单脉冲单元的SP插孔相连。
用8芯扁平电缆将8259中断控制单元的数据总线插座与数据总线单元任一插座相连。
8253:将8253CS与译码单元的Y1相连,中断源IR0与8253的OUT0口相连。
用8芯扁平电缆将8251串行通信单元的数据总线插座与数据总线单元任一插座相连。
GATE0与+5V相连,CLK0与频单元T7相连三、 功能流程图:按键A B C D按键 按键 按键 按键E F E F E F E F按键 0四、结果讨论:刚开始使用循环计时来实现倒计时,计时会有误差,改为8253计时器之后,及时秒数比较准确。
因为要求可以随时切换状态,所以将检测有无按键以及按键之后的切换写成一个子程序,在需要切换的地方进行调用。
所有的模块都写成子程序,这样在调用的时候比较方便。
使用8259中断时,要注意关中断和开中断的位置,否则会造成中断脉冲按键不灵。
程序的关键是每个状态的相互切换。
附录:实验代码:(完整的源程序)CODE SEGMENTASSUME CS:CODE,DS:CODE,ES:CODEORG 2000H执行代码 初始化 第一种情况1 87 6 5 4 3 2 退出程序JMP APA EQU 0FFD8HPB EQU 0FFD9HPC EQU 0FFDAHPCTL EQU 0FFDBHOUTSEG EQU 0FFDCH ;段控制口OUTBIT EQU 0FFDDH ;位控制口/键扫口IN_KEY EQU 0FFDEH ;键盘读入口ZXK EQU 0FFDCH ;字型口ZWK EQU 0FFDDH ;字位口Port0 EQU 0FFE4HPort1 EQU 0FFE5HSHOW1 DB 02HFLAG DB ?PCC1 DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH PBC1 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,07FH,0BFH,0DFH,0EFHPCC2 DB 03FH,0CFH,0F3H,0FCH,0FFH,0FFHPBC2 DB 0FFH,0FFH,0FFH,0FFH,03FH,0CFHPCC3 DB 01FH,0E3H,0FCH,0FFHPBC3 DB 0FFH,0FFH,07FH,08FHPCC4 DB 0FH, 0F0H,0FFHPBC4 DB 0FFH,0FFH,0FH;---------------------8253芯片初始化---------------------------A: MOV DX,0FFE3H ;控制口MOV AL,36H ;计数器0,方式3,二进制计数OUT DX,ALMOV DX,0FFE0HMOV AL,00OUT DX,ALMOV AL,4bHOUT DX,AL;---------------------------------------------------------------;---------------------8255芯片初始化--------------------------- MOV DX,PCTLMOV AL,80H ;1000 0000bOUT DX,ALMOV DX,PA ;PA置0MOV AL,0OUT DX,ALMOV DX,PBMOV AL,0FFHOUT DX,ALMOV DX,PCMOV AL,0FFHOUT DX,AL;---------------------------------------------------------------;----------------------中断向量地址------------------------------ CLIMOV AX,OFFSET INT8259MOV BX,003CHMOV [BX],AXMOV BX,003EHMOV AX,0000HMOV [BX],AXCALL FOR8259STI;----------------------------------------------------------------- JMP _AESTART: CALL GetKeyCMP AL,0AHJZ NEXTACMP AL,0BHJZ NEXTBCMP AL,0CHJZ NEXTCCMP AL,0DHJNZ _DJMP NEXTD_D: CMP AL,00HJNZ STARTJMP EXIT NEXTA: MOV FLAG,0CALL GetKeyCMP AL,0EHJZ _AECMP AL,0FHJZ _AFJMP NEXTA _AE: MOV SI,0MOV DI,0CALL EJMP LAST_AF: MOV SI,0MOV DI,0CALL FJMP LAST NEXTB: MOV FLAG,1CALL GetKeyCMP AL,0EHJZ _BECMP AL,0FHJZ _BFJMP NEXTB _BE: MOV SI,0MOV DI,0CALL EJMP LAST_BF: MOV SI,0MOV DI,0CALL FJMP LAST NEXTC:MOV FLAG,2CALL GetKeyCMP AL,0EHJZ _CECMP AL,0FHJZ _CFJMP NEXTC _CE: MOV SI,0MOV DI,0CALL EJMP LAST_CF: MOV SI,0MOV DI,0CALL FJMP LASTNEXTD:MOV FLAG,3CALL GetKeyCMP AL,0EHJZ _DWECMP AL,0FHJZ _DWFJMP NEXTD_DWE: MOV SI,0MOV DI,0CALL EJMP LAST_DWF: MOV SI,0MOV DI,0CALL FJMP LASTEXIT: CALL FINISHJMP FINLAST: JMP STARTFIN: HLT;------------------------------中断服务子程序----------------------------- INT8259: CLICMP FLAG,0JZ LACMP FLAG,1JZ LBCMP FLAG,2JZ LCJMP LDLA: MOV AL,PCC1[SI]MOV DX,PCOUT DX,ALMOV AL,PBC1[DI]MOV DX,PBCMP SI,0BHJZ CONAINC SIINC DIJMP FINI CONA: MOV SI,00HMOV DI,00HJMP FINILB: MOV AL,PCC2[SI]MOV DX,PCOUT DX,ALMOV AL,PBC2[DI]MOV DX,PBOUT DX,ALCMP SI,05HJZ CONBINC SIINC DIJMP FINI CONB: MOV SI,00HMOV DI,00HJMP FINILC: MOV AL,PCC3[SI]MOV DX,PCOUT DX,ALMOV AL,PBC3[DI]MOV DX,PBOUT DX,ALCMP SI,03HJZ CONCINC SIINC DIJMP FINI CONC: MOV SI,00HJMP FINILD: MOV AL,PCC4[SI]MOV DX,PCOUT DX,ALMOV AL,PBC4[DI]MOV DX,PBOUT DX,ALCMP SI,02HJZ CONDINC SIINC DIJMP FINICOND: MOV SI,00HMOV DI,00HJMP FINIFINI: MOV DX,PORT0MOV AL,20HOUT DX,ALSTIIRET;------------------------------中断服务子程序-----------------------------;---------------------8259芯片初始化------------------------------ FOR8259: MOV AL,13HMOV DX,Port0OUT DX,ALMOV AL,08HMOV DX,Port1OUT DX,ALMOV AL,09HOUT DX,ALMOV AL,7FH ;IRQ7OUT DX,ALRET;-----------------------------------------------------------------;------------------------------按键E----------------------------- E:MOV DX,PAMOV AL,01HOUT DX,ALMOV DX,0FFE0HMOV AL,00OUT DX,ALMOV AL,4BHOUT DX,ALRET;-----------------------------------------------------------------;------------------------------按键F----------------------------- F:MOV DX,PAMOV AL,01HOUT DX,ALMOV DX,0FFE0HMOV AL,00OUT DX,ALMOV AL,96HOUT DX,ALRET;----------------------------------------------------------------- ;------------------------------按键0----------------------------- FINISH: MOV DX,PCTLMOV AL,80HOUT DX,ALMOV DX,PBMOV AL,0FFHOUT DX,ALMOV DX,PCMOV AL,0FFHOUT DX,ALRET;-----------------------------------------------------------------;-----------------------键扫子程序------------------------------ GetKey: ;mov al,0ffh ;关显示口mov dx,OUTSEGout dx,almov bl,0mov ah,0fehmov cx,8key1: mov al,ahmov dx,OUTBITout dx,alshl al,1mov ah,alnopnopnopnopnopnopmov dx,IN_KEYin al,dxnot alnopnopand al,0fhjnz key2inc blloop key1nkey: mov al,20hretkey2: test al,1je key3mov al,0jmp key6key3: test al,2je key4mov al,8jmp key6key4: test al,4je key5mov al,10hjmp key6key5: test al,8je nkeymov al,18hkey6: add al,blcmp al,10hjnc fkeymov bx,offset KeyTablexlatfkey: retKeyTable: ;键码定义db 07h,04h,08h,05h,09h,06h,0ah,0bhdb 01h,00h,02h,0fh,03h,0eh,0ch,0dh;----------------------------------------------------------------CODE ENDSEND。