单片机原理与接口技术实验指导书.doc

返回 相似 举报
单片机原理与接口技术实验指导书.doc_第1页
第1页 / 共71页
单片机原理与接口技术实验指导书.doc_第2页
第2页 / 共71页
单片机原理与接口技术实验指导书.doc_第3页
第3页 / 共71页
单片机原理与接口技术实验指导书.doc_第4页
第4页 / 共71页
单片机原理与接口技术实验指导书.doc_第5页
第5页 / 共71页
点击查看更多>>
资源描述:
单 片 机 实 验 指 导 书 张玉杰编写 电信学院电信实验室 实验1 Keil软件的使用 1.1 创建一个Keil C51应用程序 开发单片机的第一步就是用Keil C51软件编写程序,并形成最终的“*.hex”目标文件,然后用编程器将该文件烧写到单片机中,最后将烧写好的单片机插到电路板上,接通电源就可以工作了。 在 Keil C51集成开发环境下使用工程的方法来管理文件的,而不是单一文件的模式。所有的文件包括源程序(包括 C 程序,汇编程序)、头文件、甚至说明性的技术文档都可以放在工程项目文件里统一管理。在使用 Keil C51 前,用户应该习惯这种工程的管理方式。对于使用 Keil C51 的用户来讲,一般可以按照下面的步骤来创建一个自己的 Keil C51 应用程序。 1.新建一个工程项目文件; 2.为工程选择目标器件(例如选择SST的SST89C58); 3.为工程项目设置软硬件调试环境; 4.创建源程序文件并输入程序代码; 5.保存创建的源程序项目文件; 6.把源程序文件添加到项目中。 下面以创建一个新的工程文件 Led_Light.V2 为例,详细介绍如何建立一个Keil C51的应用程序。 (1) 双击桌面的 Keil C51 快捷图标,进入如图1.1所示的 Keil C51 集成开发环境。或许打开 Keil C51 界面有所不同,这是因为启动Vision2 后,Vision2 总是打开用户前一次正确处理的工程,可以点击工具栏的 Project 选项中的 Close Project 命令关闭该工程。 图 1.1 Keil C51 集成开发界面 (2)点击工具栏的 Project 选项,在弹出如图1.2 所示的下拉菜单中选择New Project命令,建立一个新的Vision2 工程,这时可以看到如图 2.10 所示的项目文件保存对话框。 图 1.2 新建工程项目下拉菜单 在这里需要完成下列事情: ①为工程取一个名称,工程名应便于记忆且文件名不宜太长; ②选择工程存放的路径,建议为每个工程单独建立一个目录,并且工程中需要的所有 文件都放在这个目录下; ③选择工程目录 F:\示范程序\Led_Light 和输入项目名 Led_Light 后,点击保存返回。 点击选择工程存放路径 填写新建工程的名称 图1.3 新建工程项目对话窗口 在工程建立完毕以后,Vision2 会立即弹出如图1.4 所示的器件选择窗口。器件选择的目的是告诉Vision2 最终使用的 80C51 芯片的型号是哪一个公司的哪一个型号, 因为不同型号的 51 芯片内部的资源是不同的。,Vision2 可以根据选择进行 SFR 的预定义, 在软硬件仿真中提供易于操作的外设浮动窗口等。 图1.4 器件选择窗口 由图1.4可以看出,Vision2 支持的所有 CPU 器件的型号根据生产厂家形成器件组,用户可以根据需要选择相应的器件组并选择相应的器件型号,如 Philips 器件组内的 P80/P87C52X2 CPU。另外,如果用户在选择完目标器件后想重新改变目标器件,可点击工具栏project选项,在弹出的如图 1.5 所示的下拉菜单中选择是select device for target ‘target 1’命令。也将出现如图 1.4所示的对话窗口后重新加以选择。由于不同厂家的许多型号性能相同或相近,因此如果用户的目标器件型号在Vision2 中找不到, 用户可以选择其它公司的相近型号。 图1.5 器件选择命令下拉菜单 (4)到现在用户已经建立了一个空白的工程项目文件,并为工程选择好了目标器件,但是这个工程里没有任何程序文件。程序文件的添加必须人工进行,但如果程序文件在添加前还没有建立,用户还必须建立它。点击工具栏的File选项,在弹出的如图 1.6所示的下拉菜单中选择New命令。这时在文件窗口会出现如图1.7所示的新文件窗口Text1,如果多次执行New命令则会出现 Text2,Text3.等多个新文件窗口。 图 1.6 新建源程序下拉菜单 图 1.7 源程序编辑窗口 (5)现在 Led_Light.V2 项目中有了一个名为 Text1 新文件框架,在这个源程序编辑 框内输入自己的源程序 Led_Light.asm。下面是完整的 Led_Light.asm 源程序代码,用户可以输入。 ORG 0000H JMP MAIN ORG 0100H MAIN: MOV A,#0FEH ;流水灯向左移动 LEFT_MOV: MOV P1,A CALL DELAY RL A CJNE A,#0FEH,LEFT_MOV MOV A,#7FH ;流水灯向右移动 RIGHT_MOV: MOV P1,A CALL DELAY RR A CJNE A,#7FH,RIGHT_MOV JMP MAIN ;-----------------------延时子程序---------------------- DELAY: MOV R2,#250 DEL: MOV R3,#250 NOP DJNZ R3,$ DJNZ R2,DEL RET END (6) 输入完毕后点击工具栏的File选项,在弹出的下拉菜单中选择是save命令存盘源程序文件。这时会弹出如图1.8所示的存盘源程序文件画面,在文件名栏内输入源程序的文件名,在此示范中把Text1 保存成 Led_Light.asm。注意文件的扩展名不能省略,而且必须是.asm(如果是C则保存为*.c)。保存完毕后请注意观察,保存前后源程序有哪些不同,关键字变成蓝颜色了吗?这也是用户检查程序命令行的好方法。 图1.8 源程序存盘对话框 (7) 需要特别提出的是,这个程序文件仅仅是建立了而已,Led_Light.asm 文件到现在为止跟 Led_Light.V2 工程还没有建立起任何关系。此时用户应该把 Led_Light.asm源程序填加到Led_Ligh. V2工程中中,构成一个完整的工程项目。在project window窗口内,选中source group1后点击鼠标右键,弹出如图1.9所示的快捷菜单中选择Add Files to Group‘Source Group1’(向工程中加入源程序)命令。 图1.9添加源程序快捷菜单 此时会出现如图1.10所示的添加源程序文件窗口,选择刚才创建编辑的源程序文件Led_Light.asm。单击Add命令即可把源程序文件添加到项目中。由于添加源程序文件窗口中的默认文件类型是C Source File(*.c),这样在搜索显示区中则不会显示刚才创建的源程序文件( 由于它的文件类型是 *.asm) 。改变搜索文件类型为 All File(*.*),选择 Led_Light.asm 源程序文件后点击Add命令将弹出如图1.11所示的文件类型确认窗口,在type下拉菜单中选择assembly language file后确认返回图1.10添加源程序文件窗口,此时点Add命令即可将源程序添加进项目工程中。 图1.10 添加源程序文件窗口 图1.11 文件类型确认窗口 1.2 程序文件的编译、连接 (1) 编译环境的设置 工程建立好后,还要对工程进行进一步的设置,以满足要求。 首先单击左边窗口的‘Target’,然后选择options for Target‘Target1’ 参考图1.12。这时即出现如图1.13所示的调试环境设置窗口。 图1.12 调试环境设置窗口下拉菜单 点击 Output 选项卡在出现的窗口中选中 Create Hex File 选项,在编译时系统将自动生成目标代码文件*.HEX。选择 Debug 选项会出现如图1.14所示的工作模式选择窗口,在此窗口中我们可以设置不同的仿真模式。 图1.13 Keil C51 调试环境设置窗口 图1.14 Debug 设置窗口 从图1.14可以看出,Vision2 的 2 种工作模式分别是:Use Simulator(软件模拟) 和 Use(硬件仿真)。其中 Use Simlator 选项是将Vision2 调试器设置成软件模拟仿真模式,在此模式下不需要实际的目标硬件就可以模拟 80C51 微控制器的很多功能,在准备 硬件之前就可以测试您的应用程序,这是很有用的。 (2)程序的编译、连接、运行 完成以上的工作就可以编译程序了。点击如图1.15所示的Rebuild All Target Files 命令,对所有的工程文件进行重新编译,此时会在“Output windows”信息输出窗口输出一些相关信息,如图1.16所示。 图1.15 编译命令菜单 图1.16 输出提示信息 其中第二行 assembling Led_Light.asm 表示此时正在编译 Led_Light.asm 源程序,第三行 linking..表示此时正在连接工程项目文件,第五行 Creating hex file from‘Led_Light’说明已生成目标文件 Led_Light.hex,最后一行说明 Led_Light.V2 项目 在编译过程中不存在错误和警告,编译链接成功。若在编译过程中出现错误,系统会给出错 误所在的行和该错误提示信息,用户应根据这些提示信息,更正程序中出现的错误,重新编译直至完全正确为止。 对源程序进行编译之后,还需要实际的运行来验证程序的正确性。点击如图1.17所示的start/stop debug session命令,将程序与硬件进行连接,如果与硬件连接正确,会在Output windows窗口出现如图1.18所示的提示信息,如果连接不正确,会出现如图1.19所示的信息,此时请复位硬件,然后重新编译、连接。 图1.17 start/stop debug session命令窗口 图1.18 与硬件连接正确提示信息 图1.19 与硬件连接不正确提示信息 完成以上步骤,与硬件连接正确之后,用户就可以按图1.20所示的运行命令进行在线仿真了。 图 1.20 运行命令窗口 以下与实验内容无关,作为了解,可以跳过。 ① 在调试环境设置窗口的target页面下,(参考图1.13),xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高频率值。一般将其设置成为实际所使用的晶振频率值。 Memory Model用于设置RAM使用情况,有3个选择项。 I. small :是所有变量都在单片机的内部RAM中,如果内部RAM空间不够,才会存到外部RAM中。这种数据存储方式的好处在于运算速度最快,也是我们一般常选择的方式。 II. Compact :变量存储在外部RAM里,使用8位间接寻址。即将变量放在外部RAM的前256个字节里。 III.Large: 变量放在外部RAM里,使用16位间接寻址。 Code Rom size用于设置ROM空间的使用,也有3个选项。 I. Small:只用低于2K的程序空间,适用于AT89C2051这些芯片。 II.Compact:单个函数的代码量不能超过2KB,整个程序可以使用64KB的程序空间。 III.Large:可用全部64KB的空间,表示程序和子函数代码都可以大到64KB。 Operating项是操作系统选择项,Keil C51提供了两种操作系统:Rtx tiny和Rtx full。通常不使用任何操作系统,用该项的默认值:None(不使用任何操作系统)。 Use on-chip ROM(0x0-0xfff)选择项,表示使用片上的ROM。该选项取决于单片机应用系统,如果单片机的EA接高电平,则选中,表示使用内部的ROM,如果单片机的EA接低电平,则不选中该选项,表示使用外部的ROM。 Off-chip Code memory:表示片外ROM的开始地址和大小。如果没有外接程序存储器,那么不需要填任何数据。 Off-chip Xdata memory:用于确定系统扩展RAM的地址范围,可以填上外接Xdata外部 数据存储器的起始地址和大小。这些选择项必须根据所用硬件来决定。 ② 在Output页面下,见图1.21。 select Folder for objects:用来选择最终的目标文件所在的文件夹,默认则表示与工程文件在同一个文件夹中。 Name of Executable:设置生成的目标文件的名字,默认情况下与项目的名字一样。 Creat Executable:creat hex用于生成可执行代码文件,默认情况下该项未选中,如果要烧录芯片做硬件实验,就必须选中该项。 图1.21 output设置窗口 (3) 本实验当中编译环境的设置说明 1.在调试环境设置窗口的Device选项卡中器件选择SST89C58。(参考图1.4) 2. 在调试环境设置窗口的Target选项卡中xtal(Mhz)项填写12。选中Use on-chip ROM。其它项不必改动,具体设置参考图1.13。 3 在调试环境设置窗口的debug设置窗口中选择keil monitor-51 drive仿真设置。(参考图1.14)用鼠标点击keil monitor-51 drive后的setting,将弹出1.22所示的窗口。在实验当中根据与计算机连接情况选择串口,波特率固定选择38400。 图1.22 串口设置窗口 实验2 基本算术运算 本章内容采用软件仿真,请在图1.14中选择左边use simulator项,其余设置采用默认项即可。 2.1 二进制加法 设在内部RAM的40H~44H单元开始有一组无符号数据块,值分别为从1~5,编程求无符号数据块的和,将结果放入45h(低位)、46H(高位)中。 实现程序为: datastart DATA 40H ;数据块开始地址 SUML DATA 45H ;累加和低位地址定义 SUMH DATA 46H ;累加和高位地址定义 datanum DATA 48H ;保存数据个数的地址 ORG 0000H ;程序上电或复位入口 JMP start ORG 0100H start: MOV SP,#60h ;设置堆栈 MOV datastart, #01H ;求和数据初始化 MOV datastart+1,#02H MOV datastart+2,#03H MOV datastart+3,#04H MOV datastart+4,#05H ; MOV datanum,#05H ;数据个数 CALL SUM ;调用求和子程序 JMP $ ;停机 ;======================== ;无符号数据块求和子程序 ;影响资源:R0 ;======================== SUM: PUSH ACC ;保护ACC中值 PUSH PSW ;保护PSW MOV SUML,#00H MOV SUMH,#00H ;累加和单元清零 MOV R0,#datastart ;数据块起始地址送R0 SUMLOOP: MOV A,@R0 ;将R0指向地址中的数据放入A中。 ADD A,SUML MOV SUML,A JNC NEXT ;如果发生进位,SUMH单元+1 INC SUMH ; NEXT: INC R0 ;R0指向下一个地址 DJNZ datanum,SUMLOOP POP PSW POP ACC ;恢复现场 RET END 对于程序运行结果的观察,可参考如下步骤: I. 在图1.14中选择use simulator。 II. 在程序JMP $ 处设立一个断点。 III. 在对源程序进行编译、连接、运行之后(参考第一章1.2(2)节),为观察程序运行结果,点击图2.1所示的memory window命令,将出现图2.2所示的数据观察窗口。 图 2.1 memory windows 命令 图2.2 数据观察窗口 III. 在数据观察窗口的Address项中输入 d:0x49,即可观察内部RAM中0x49地址开始单元中的数据。 以下几个运算程序调试方法与此类似。 2.2 双字节除单字节除法 设在内部RAM的45H~46H(45h中是低位数据、46H中是高位数据)单元存有一组无符号数据。编程求此组数据除以一个单字节数据的结果,将结果放入49H单元中。 实现程序为: SUML DATA 45H ;被除数低子节 SUMH DATA 46H ;被除数高字节 datanum DATA 48H ;保存数据个数的地址 average DATA 49H ;除的结果存放单元 ORG 0000H JMP start ORG 0100H start: MOV SP,#60H MOV SUML,#0FH MOV SUMH,#00H MOV datanum,#05H ;初始化 MOV R4,SUMH MOV R5,SUML ;装入被除数 MOV R7,datanum ;装入除数 CALL AVER ;调用求平均值子程序 MOV average,R3 ;结果放入average单元中 JMP $ ;====================== ;双字节二进制无符号数除以单字节二进制数 ;输入参数: 被除数在R4、R5中,除数在R7中 ;输出参数: 结果在R3中 ; 如果结果溢出,则0v=1.反之为0 ;影响资源: R3 R4 R5 R7 ;======================= AVER: CLR C MOV A,R4 SUBB A,R7 JC DV50 SETB OV ; ;商溢出 RET DV50: MOV R6,#8 ; ;求平均值(R4R5/R7-→R3) DV51: MOV A,R5 RLC A MOV R5,A MOV A,R4 RLC A MOV R4,A MOV F0,C CLR C SUBB A,R7 ANL C,/F0 JC DV52 MOV R4,A DV52: CPL C MOV A,R3 RLC A MOV R3,A DJNZ R6,DV51 MOV A,R4 ; ;四舍五入 ADD A,R4 JC DV53 SUBB A,R7 JC DV54 DV53: INC R3 DV54: CLR OV RET END 2.3 二进制转BCD码 设在内部RAM的49H单元存有一个二进制数据。编程求将该数据转换成BCD 码,将结果放入4AH为起始的连续单元中。 实现程序为: average DATA 49H ;欲转换的二进制数存放单元 displaydata DATA 4AH ;转换后的BCD码存放单元 ORG 0000H JMP start ORG 0100H start: MOV SP,#60H MOV average,#0x0ff MOV A,average CALL HBCD JMP $ ;============================================== ;单字节十六进制整数转换成单字节BCD码整数 ;入口 : ACC ----- 欲转换的十六进制数 ;出口 : displaydata ---- 转换后的数据存放地址 ; displaydata ---- 百位 ; dispalydata+1 ---- 十位 ; displaydata+2 ---- 个位 ;============================================== HBCD: MOV B,#100 ;分离出百位,存放在R3中 DIV AB MOV displaydata,A MOV A,#10 ;余数继续分离十位和个位 XCH A,B DIV AB MOV displaydata+1,A MOV displaydata+2,B RET END 实验3 分支和循环程序设计实验 1 实验目的 (1)熟悉分支程序的编写方法 (2)掌握循环程序设计技巧。 2实验内容 (1)散转程序设计 (2)求最小值程序设计 3 实验要求 (1)画出程序流程图 (2)编写实验程序 4 实验步骤 (1)散转程序 试编一个能根据20h中的数i(i≤3) 进行循环散转的程序。该程序要能该据i值转移到相应处理程序BRi,BRi处理程序功能是能使Ri加1,然后实现((20H)+1∧03H 20H操作,以便重复根据20H中的内容散转。程序流程如图所示。 (2)求最小值程序 编一个能在内部RAM 20H为始址的连续10个存储单元中找出最小值并存入1FH单元的程序。编译、连接、进入调试状态。程序流程如图所示。 在数据存储器窗口,使用d:0x20显示片内ram20H开始数据,修改从20H开始的连续10个单元,并记住最小的数。 执行程序,检查结果是否正确,若不正确,可单步运行、断点运行排除错误。 实验4 基本指令和片内RAM操作实验 1 实验目的 (1)熟悉单片机片内RAM的结构和操作方法 (2)掌握单片机的基本指令系统 2实验内容 (1)片内RAM数据传送指令操作 (2)清零子程序操作子程序设计 (3)BCD码减法子程序设计 4 实验步骤 (1)数据块传送程序设计 编写程序将40H开始的16个数据送到90H开始的16个单元中,程序如下: ORG 0000H JMP 100H ORG 100H MOV R0,#40H MOV R1,#90H MOV R7,#16 MOV A,@R0 LOOP: MOV @R1,A INC R0 INC R1 DJNZ R7,LOOP SJMP $ END (2)清零程序 编写程序将20H开始的32个单元清零,程序如下 ORG 0000H JMP 100H ORG 0100H MOV R0,#20H MOV A,#0 MOV R7,#32 LOOP: MOV @R0,A INC R0 DJNZ R7,LOOP SJMP $ END (3)BCD码减法 已知在20h中有一个BCD码91H和21H中有一个BCD码36H,如下BCD键发程序可以完成91-36并把差送到21H中。 ORG 0000H JMP MAIN MAIN: CALL BCD_SUB SJMP $ BCD_SUB: CLR C MOV A,#9AH SUBB A,21H ADD A,20H DA A MOV 21H,A CLR C RET END 4 思考题 (1)BCD减法中,对减法球部和二进制数的球部有何差别 (2)体会设置断点和断点次数对于调试程序的作用 实验5 流水灯控制实验 1 实验目的 (1)熟悉并行接口P0~P3的内部结构 (2)掌握I/O口的基本控制。 2实验原理 P0~P3接口的功能及内部结构查阅课本相关内容。 本实验流水灯控制相关硬件电路如图所示 a. LED电路 b. 跳线电路 有LED电路可看出要是该灯亮,就必须将其对应的发光二极管负端拉低。而由跳线电路可见发光二极管的负端是由P1口的,如要是LED1亮,则需P1.0置“0”,即完成给P1.0端口写“0”操作。但是由于发光二极管的控制端与A,B……DP复用P1口,所以要用跳线帽短接LED端与P1口。 3 实验内容 编写程序实现8个二极管的轮流点亮。 org 0000h jmp main org 0100h main: mov p1,#55h call delay mov p1,#0aah call delay jmp main delay: mov r2,#255 del: mov r3,#255 djnz r3,$ djnz r2,del ret end 4 实验步骤 (1)在keil集成开发环境下,编写并输入程序,保存为light.asm; (2)新建工程LIGHT,并添加文件light.asm; (3)编译、连接并生成目标文件; (4)进入调试状态,单步运行程序,查看片内片外存储器对应单元的数据变化情况。 (5)全速运行程序,观察运行结果。 5 思考题 1.在实验1的范例程序也是一个流水灯控制的程序,它是一个点亮的灯从左向右,再从右向左的循环,那么还有其他的循环方式,请同学们自己练习。 2.上面的延时程序的作用是什么,将255改成300可以吗,为什么? 实验6 显示和键盘 1 硬件电路 显示电路采用动态扫描方法,使用P0口低4位作为位选码控制端,P1口作为段选码控制端。 图1 显示电路图 键盘电路如图2所示,P2口8位分别用来检测8个键的状态,当有键按下对应的该I/O口为低电平,无键按下该端口为高电平。 图2 键盘电路图 2 显示程序 本程序的现象将是在数码管上显示1234。 为了便于在本实验中程序的通用性,实验中所有程序均采用模块化设计,即将程序设计成子程序形式,方便各模块间子程序的调用。为此,我们定义了一个显示数据缓冲区displaydata,地址范围从40H~43H。程序中即将把该显示缓冲区中的数据显示到数码管上。 另外程序中要注意的是: I. 该缓冲区范围内地址不能被其它的资源占用,只能是显示程序或改变显示数据的程序可以访问。 II. 显示缓冲区中不能存在LED显示码表中显示段码不能表示的非法字符。 III.由于人眼的视觉惰性,当选中某个数码管并送上显示段码,在选择下一个数码管之前,必须要让显示数据在选择的数码管上停顿一定的时间。这正是本程序在显示程序当中加入了一段延时程序的原因。 显示程序的源码如下: displaydata data 40h ORG 0000H JMP START ORG 0100H START: MOV displaydata,#01H ;显示初始化,装显示初志,显示1234 MOV displaydata+1,#02H MOV displaydata+2,#03H MOV displaydata+3,#04H MAIN: CALL DISPLAY ;调显示自程序 JMP MAIN ;-------------------------显示子程序--------------------------- DISPLAY: MOV R2,#0FEH MOV R1,#displaydata DIS0: MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A INC R1 MOV P0,R2 MOV A,R2 RL A MOV R2,A CALL DELAY ;调延时子程序 CJNE R1,#44H,DIS0 RET ;-------------------------延时子程序--------------------------- DELAY: MOV R7,#02H DL: MOV R6,#0FFH DL6: DJNZ R6,DL6 DJNZ R7,DL RET ;-------------------------LED显示码表-------------------------- TAB: DB 0c0H, 0f9H, 0a4H, 0b0H, 99H, 92H ; 0 1 2 3 4 5 ; 00H 01H 02H 03H 04H 05H ; DB 82H, 0f8H, 80H, 90H, 88H, 83H ; 6 7 8 9 A b ; 7DH 07H 08H 09H 0AH 0BH ; DB 0c6H, 0a1H, 86H, 8eH, 8cH, 0c1H ; C D E F P U ; 0CH 0DH 0EH 0FH 10H 11H ; DB 89H, 0c7H,0bfH, 91H,00H,0ffH ; H L - y ON OFF ; 12H 13H 14H 15H 16H 17H ; DB 92H, 77H, 8bH, 0afH, 0a3H, 0a1H ; S t h r o d ; 18H 19H 1AH 1BH 1CH 1DH ; DB 0f0H, 0FH, 8bH, 0afH, 0a3H, 0a1H ; S t h r o d ; 1EH 1FH 20H 21H 22H 23H End 3.2 键盘程序 我们将实验板上按键按从左到右,从上到下的顺序定义键号为KEY0~KEY7。各键对应的键值列表如下: 键号 KEY0 KEY1 KEY2 KEY3 KEY4 KEY5( KEY6 KEY7 键值 FEH FDH FBH F7H EFH DFH BFH 7FH 为了直观的观察按键效果,在键盘程序中加入了显示程序,最终我们程序的效果是按键KEY0,显示缓冲区displaydata处数据加一,按键KEY1,显示缓冲区displaydata+1处数据加1,依次类推。当显示数据超10时,对应缓冲区数据清零。对于KEY6、KEY7、KEY5、KEY4键在本程序中将不起作用。 主程序的流程图为: 键盘程序的流程图为: 程序中要注意的是: I. 为了避免外界干扰带来的按键误判,必须要有一个延时去抖动(一般100ms),然后再次判断是否有键被按下。这样做的目的是为了保证键盘工作的可靠性。 II.由于程序当中采用的是循环扫描的显示方式,为了保证显示的稳定性,不出现数码管闪烁、亮度不均匀的问题,因该在程序中的适当多调用显示程序。本程序中的解决办法是在延时消抖动期间再次调用了显示程序,避免了可能存在的问题。 实现的程序代码如下: dis_data data 40h ;显示数据首地址 key_hold bit 20h.0 ORG 0000H JMP START ORG 0100H START: MOV SP,#60H MOV dis_data,#00H MOV dis_data+1,#01H MOV dis_data+2,#02H MOV dis_data+3,#03H ;显示数据初始化 ;主程序 MAIN: CALL DISPLAY CALL KEY_WORK JMP MAIN ;-------------------------显示子程序--------------------------- DISPLAY: MOV R2,#0FEH MOV R1,#dis_data DIS0: MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV P1,A INC R1 MOV P0,R2 MOV A,R2 RL A MOV R2,A CALL DELAY ;调延时子程序 CJNE R1,#44H,DIS0
展开阅读全文

最新标签

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2017-2019 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922