微机原理实验参考程序

合集下载

微机原理及应用实验报告

微机原理及应用实验报告
2•深入了解数据在存储器中的存取方法及堆栈中数据的压入与弹出。
3•掌握各种寻址方法以及简单指令的执行过程。
二、实验要求
1实验前要作好充分准备,包括汇编程序清单、调试步骤、调试方法以及对程序结果的分 析等。
2•本实验要求在PC机上进行。
3•本实验只要求在DEBUC调试状态下进行,包括汇编程序,调试程序,执行程序。
4•熟悉建立源文件,进行汇编和连接的全过程,并对程序进行调试。
二、实验要求
1•实验前准备
1分析题目,将程序中的原始数据、中间结果和最终结果的存取方式确定好。
2写出算法或画出流程图。
3写出源程序。
4对程序中的结果进行分析,并准备好上机调试的过程。
2•本实验要求在PC机上进行。
3•汇编过程中出现问题,可用DEBU(进行调试。
xorax,ax pushax movax,data movds,ax leasi,data1 leadi,data2 leabx,data3 moval,[si+3] movah,[di+3] an dal,0fh an dah,0fh addal,ah oral,30h mov[bx+3],al moval,[si+2] movah,[di+2] an dal,0fh an dah,0fh adcal,ah oral,30h mov[bx+2],al moval,[si+1] movah,[di+1] an dal,0fh an dah,0fh adcal,ah oral,30h mov[bx+1],al moval,[si] movah,[di] an dal,0fh an dah,0fh adcal,ah
;exercize21

微机原理课程设计说明书(加热器)

微机原理课程设计说明书(加热器)

1.课程设计任务书设计内容:设计当把物品放入加热器中,首先要启动加热器和电机工作,设定加热时间为3(5)分钟,为使物品均匀加热,每隔20(30)秒电机要反转一次,(正转→反转、反转→正转),加热时间到后,停止加热器和电机工作,并发声,告知加热结束。

设计目标:在规定的时间内设计出符合要求的汇编语言程序,并提交一份符合本科生毕业设计论文规范的报告。

进度安排:8月13日-8月16日-----------------------确定设计内容并完成硬件部分8月17日-8月21日------------------------------------完成程序清单8月22日-8月23日------------------------------完成课程设计说明书2. 总体设计思路2.1、分析设计所用到的芯片的原理及使用方法:⑴8259A的使用方法:8259A有四个初始化命令字ICW及3个操作操作命令字OCW。

8259A的编程就是根据应用需要将初始化命令字ICW1-ICW4和操作命令字OCW1- OCW3分别写入初始化命令寄存器组和操作命令寄存器组。

ICW1-ICW4各命令字格式如图2-1所示,OCW1-OCW3各命令字格式如图2-2所示,其中OCW1用于设置中断屏蔽操作字,OCW2用于设置优先级循环方式和中断结束方式的8操作命令字,OCW3用于设置和撤销特殊屏蔽方式、设置中断查询方式以及设置对8259内部寄存器的读出命令。

图2-1ICW1-ICW4各命令字格式如图2-2OCW1-OCW3各命令字格式如图⑵8255的使用方法:方式0 —基本输入/出方式;方式1 —选通输入/出方式;方式2 —双向选通工作方式。

图2-3 8255命令字格式图⑶8253的使用方法:(1) 方式0:计数到0结束输出正跃变信号方式。

(2) 方式1:硬件可重触发单稳方式。

(3) 方式2:频率发生器方式。

(4) 方式3:方波发生器。

(5) 方式4:软件触发选通方式。

华南理工大学微机与接口实验报告(四实验,题目原理流程图代码截图完整版)

华南理工大学微机与接口实验报告(四实验,题目原理流程图代码截图完整版)

微机原理实验报告班 级:2012级电子科学与技术卓工班级电子科学与技术卓工班姓 名: 黄中一黄中一 学 号: 201236460273序 号:评阅分数:评阅分数:实验一一、实验目的1、学会如何建立汇编源文件ASM2、学会调用MASM 宏汇编程序对源文件进行汇编,获得目标程序宏汇编程序对源文件进行汇编,获得目标程序 OBJ 及LST 列表文件列表文件3、学会调用LINK 连接程序汇编后的目标文件OBJ 连接成可执行的文件连接成可执行的文件EXE 4、学会使用DEBUG 调试程序把可执行文件装入内存并调试运行,用D 命令显示目标程序,用U 命令对可执行文件反汇编,用G 命令运行调试。

命令运行调试。

二、实验设备装有MASM 软件的IBM PC 机三、实验内容1、汇编程序对源程序进行编译,生成扩展名为OBJ 的目标文件;连接程序是将目标程序和库文件进行连接、定位,生成扩展名为EXE 的可执行文件;调试程序是对目标文件进行调试,验证它的正确性。

是对目标文件进行调试,验证它的正确性。

2、DEBUG 程序各种命令的使用方法程序各种命令的使用方法功能功能命令格式命令格式 使用说明使用说明显示内存单元内容显示内存单元内容D 地址地址从指定地址开始显示40H 个字节或80H 个字节个字节 修改内存单元内容修改内存单元内容 E 地址地址先显示地址和单元内容等待输入修改的内容输入修改的内容检查和修改寄检查和修改寄存器的内容存器的内容R 显示全部寄存器和标志位及下条指令单元十六进制数码和反汇编格式和反汇编格式反汇编反汇编U 地址地址从指定地址开始反汇编16个或32个字节个字节 汇编汇编 A 地址地址从指定地址直接输入语句并从指定指定汇编装入内存从指定指定汇编装入内存跟踪跟踪 T =地址=地址 从指定地址开始逐条跟踪指令运行运行 G =地址=地址无断点,执行正在调试的指令执行正在调试的指令 退出退出Q退出DEBUG 返回DOS3、实验过程①、在edit 环境,写字板,记事本等中输入源程序。

微机原理及应用实验(题目)

微机原理及应用实验(题目)

微机原理及应用实验实验一开发环境的使用一、实验目的掌握伟福开发环境的使用方法,包括源程序的输入、汇编、修改;工作寄存器内容的查看、修改;内部、外部RAM内容的查看、修改;PSW中个状态位的查看;机器码的查看;程序的各种运行方式,如单步执行、连续执行,断点的设置。

二、实验内容在伟福开发环境中编辑、汇编、执行一段汇编语言程序,把单片机片内的30H~7FH 单元清零。

三、实验设备PC机一台。

四、实验步骤用连续或者单步的方式运行程序,检查30H-7FH 执行前后的内容变化。

五、实验思考1.如果需把30H-7FH 的内容改为55H,如何修改程序?2.如何把128B的用户RAM全部清零?六、程序清单文件名称:CLEAR.ASMORG 0000HCLEAR: MOV R0,#30H ;30H 送R0寄存器MOV R6,#50H ;50H 送R6寄存器(用作计数器)CLR1: MOV A,#00H ;00 送累加器AMOV @R0,A ;00 送到30H-7FH 单元INC R0 ;R0 加1DJNZ R6,CLR1 ;不到50H个字节,继续WAIT: LJMP WAITEND实验二数据传送一、实验目的掌握MCS-51指令系统中的数据传送类指令的应用,通过实验,切实掌握数据传送类指令的各种不同的寻址方式的应用。

二、实验内容1.编制一段程序,要求程序中包含7中不同寻址方式。

2.编制一段程序,将片内RAM30H~32H中的数据传送到片内RAM38H~3AH中。

3.编制一段程序,将片内RAM30H~32H中的数据传送到片外RAM1000H~1002H 中。

4.编制一段程序,将片内RAM40H~42H中的数据与片外RAM2000H~2002H中的数据互换。

三、实验设备PC机一台。

四、实验步骤逐段编制程序,汇编无误后,用连续或者单步的方式运行程序,检查程序的运行结果,看是否达到预期的效果。

五、实验思考1.如何把片外RAM中1000H~100FH单元中的数传送到片外RAM中2000H~200FH单元中?2.如何把ROM中0200H~0207H单元的数传送至片外RAM0000H~0007H单元中?实验三数码转换一、实验目的掌握采用软件方法进行不同形式数据之间的转换,如十进制数与二进制数的转换、十六进制数与BCD码的转换、BCD数与ASCII码之间的转换、非压缩BCD码与压缩BCD码之间的转换。

武汉理工实验指导书-微机原理及接口技术

武汉理工实验指导书-微机原理及接口技术

《微机原理及接口技术B》实验指导书※实验环境实验设备——唐都TD-PITE 80X86 微机原理及接口技术微机实验平台。

每套设备包括实验箱一台、配备安装有Wmd86联机操作软件的PC微机一台、连接线及电源线。

图1 实验平台连接示意图图2 唐都TD-PITE实验箱图3 唐都TD-PITE实验箱布局图操作步骤:1、打开电脑。

2、插好实验平台电源线。

3、通过串口连接线连接实验箱与微机。

4、打开Wmd86联机操作软件。

5、检查端口是否选择好。

6、进行实验接线。

7、录入汇编程序。

8、编译、链接、下载,观察结果。

图4 Wmd86联机操作软件实验一定时器的使用1.实验目的和意义●熟悉接口试验箱的使用环境。

●体会接口电路通过外部总线与处理器连接原理。

●掌握可编程芯片8253的编程方法。

2.实验设备PC 机一台,TD-PITE 实验装置一套。

3.实验内容1、编写程序,将8254 的计数器0 和计数器1 都设为方式3,用信号源1MHz 作为CLK0时钟,OUT0 为波形输出1ms 方波,再通过CLK1 输入,OUT1 输出1s 方波。

2、编写程序,将8254 的计数器0 设为方式3,计数值为十进制数4,用单次脉冲KK1+作为CLK0 时钟,OUT0 连接MIR7,每当KK1+按动 5 次后产生中断请求,在Wmd86程序运行结果栏上显示字符M 。

改变计数值,验证8254 的计数功能。

4.背景知识〔1〕8254的功能➢8253具有三个独立的16位计数器〔0#~2#通道〕;➢每个通道有6种工作方式;➢可以进行二进制或十进制计数,计数方式为减1计数。

〔最高计数频率2.6MHZ〕〔2〕8254 的内部结构和外部引脚图1.1 8254内部结构图1.2 8254外部引脚〔3〕8254 的工作方式●方式0:计数到0 结束输出正跃变信号方式。

●方式1:硬件可重触发单稳方式。

●方式2:频率发生器方式。

●方式3:方波发生器。

●方式4:软件触发选通方式。

微机原理实验4-逐次比较式ADC0809

微机原理实验4-逐次比较式ADC0809

实验三 逐次比较式A/D 转换器0809的原理及编程一、实验目的1. 熟悉逐次逼近式A/D 转换器芯片的工作原理。

2. 了解A/D 转换芯片0809的接口设计方法。

3. 掌握A/D 转换器0809简单的应用编程。

二、实验任务1. 分析本实验模板的电路原理,它与EPP 接口数据传送的方法,所使用的端口地址。

2. 编写出逐次逼近式A/D 转换器芯片0809的转换与显示的控制程序。

三、实验原理1.电路组成及转换原理ADC0809是带有8位A/D 转换器、8路多路开关,以及与微型计算机兼容的控制逻辑的CMOS 组件。

8位A/D 转换器的转换方法为逐次逼近法。

在A/D 转换器内部含有一个高阻抗斩波稳定比较器,一个带有模拟开关数组的256电阻分压器,以及一个逐次逼近的寄存器。

8路的模拟开关由地址锁存器和译码器控制,可以在8个通道中任意访问一个单边的模拟信号。

其原理图如图3-1所示。

8通道多路模拟开关5432128272625242322地址锁存器和译码器W 1W 2逐次逼近型寄存器SAR控制逻辑开关树组256R 电阻分压器610V x V c7输出缓冲锁存器三态212019188151417916111312模拟量输入A B CA L E地址选择地址锁存允许V cc G N D V R E F (+)V R E F (-)E N A B L E数字量输出转换结束(中断)E O CS TA R TC L O C KD 7D 6D 5D 4D 3D 2D 1D 0IN 7IN 6IN 5IN 4IN 3IN 2IN 1IN 0图3-1 ADC0809内部原理图从图中可以看出,ADC0809由两部分组成,第一部分为八通道多路模拟开关,控制C 、B 、A 和地址锁存允许端子,可使其中一个通道被选中。

第二部分为一个逐次逼近型A/D 转换器,它由比较器、控制逻辑、输出锁存缓冲器、逐次逼近寄存器以及开关数组和256R 梯型解码网络组成,由后两种电路(开关数组和256R 梯型电阻)组成D/A 转换器。

微机原理与接口技术实验综合实验实验报告

微机原理与接口技术实验综合实验实验报告

微机原理与接口技术实验《简单手势无线遥控小车》实验报告通信科学与工程于广溪113007200701.总体概况与说明1.1 选题概况与说明1.2遥控部分概况与说明1.3机动部分概况与说明2.机械部分分析实现3.硬件系统设计实现3.1电源设计实现3.1.1标准电源来源与稳压3.1.1.1电源的电压和电流要求3.1.1.2电源的纹波要求3.1.1.3 防止电源判定空载关机的方法3.1.2电源升压3.1.3电源降压3.2单片机最小系统版设计实现3.3红外光电开关部分设计实现3.4减速直流电机驱动设计实现3.5 STC单片机USB-串口下载调试实现3.6无线模块分析实现3.7系统总电路图4.软件系统设计实现4.1遥控部分软件系统设计实现4.1.1ST188时序检测方法4.1.2 nRF24L01+驱动程序说明4.1.3 遥控部分所有代码文件4.1.3.1 主文件yaokong.c:4.1.3.2 nRF24L01+驱动程序nRF24L01.c4.1.3.3延时文件delay.c4.1.3.4 52单片机寄存器头文件reg52.h4.1.3.5 所有头文件的头文件allhead.h4.1.3.6 变量声明重定义vartypeabbreviation.h4.1.3.7 电机控制命令定义motorcommand.h4.1.3.8 延时头文件delay.h4.1.3.9 nRF24L01+驱动程序头文件nRF24L01.h 4.2机动部分软件系统设计实现4.2.1直流减速电机的驱动方式说明4.2.2机动部分所有代码文件5.总结1.总体概况说明1.1选题概况与说明:本次微机原理与接口技术实验(综合)实验,我选择的题目是一个可以通过手势动作无线控制的小车。

希望实现的是在遥控端通过产生简单的5种手势动作来控制小车的运动状态和方向。

简单来说就是通过手的向前滑动,向后滑动,向左滑动,向右滑动以及在特定区域滑动实现小车的前后左右以及停止5种动作。

微机原理Emu8086仿真软件实验讲义剖析

微机原理Emu8086仿真软件实验讲义剖析

实验一显示程序实验1.emu8086介绍Emu8086-Assembler and Microprocessor Emulator是一个可在Windows 环境下运行的8086CPU汇编仿真软件,Emu8086集源代码编辑器,汇编/反汇编工具以及可以运行debug的模拟器(虚拟机器)于一身,它优于一般编译器的地方在于提供了一个虚拟的80x86环境,拥有自己一套独立的“硬件”,可以完成一些纯软件编译器无法完成的功能例如Led显示,交通灯,步进电机等等,而且动态调试(DEBUG)时非常方便一.软件启动启动界面如图1所示,用户可以选择新建文本、程序实例、启动指南、近期文档。

注册的用户名随意,密码112,即可成功。

二.新建文件单击图1中的“New”选项,软件会弹出如图2所示的选择界面。

●COM模板——适用于简单且不需分段的程序,所有内容均放在代码段中,程序代码默认从ORG 0100H开始;●EXE模板——适用于需分段的复杂程序,内容按代码段、数据段、堆栈段划分。

需要注意的是采用该模板时,用户不可将代码段人为地设置为ORG 0100H,而应由编译器自动完成空间分配;●BIN模板——二进制文件,适用于所有用户定义结构类型;●BOOT模板——适用于在软盘中创建文件。

此外,若用户希望打开一个完全空的文档,则可选择empty workspace的选项。

三.编译和加载程序用户可根据上述选择的模板中编写程序,如图3所示。

该编辑界面集文档编辑、指令编译、程序加载、系统工具、在线帮助为一体,其菜单功能如表1所示。

编写完程序后,用户只需单击工具栏上的“compile”按钮,即可完成程序的编译工作,并弹出如图4所示的编译状态界面。

若有错误则会在窗口中提示,若无错误则还会弹出保存界面,让用户将编译好的文件保存相应的文件夹中。

默认文件夹为…\emu8086\MyBuild\,但您可以通过菜单中assembler/ set output directory对默认文件夹进行修改。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

T1a.asm;4000H起256个字节清0Block equ 4000hmov dptr, #Block ; 起始地址mov r0, #0 ; 清 256 字节clr aLoop: movx @dptr, ainc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一ljmp $endT1a.c;4000H起256个字节清0xdata unsigned char Buffer[256] _at_ 0x4000; void main(){unsigned int index;unsigned char xdata * ptr;ptr = &Buffer; // 起始地址for (index = 0; index <= 255; index++) {*ptr++ = 0; // 清0, 地址加一}}T1b.asm;3000H起长度256字节的存储块移到4000Hmov r0, #30hmov r1, #00hmov r2, #40hmov r3, #00hmov r7, #0Loop: mov dph, r0mov dpl, r1movx a, @dptrmov dph, r2mov dpl, r3movx @dptr, acjne r1, #0ffh, Goon1inc r0Goon1: inc r1cjne r3, #0ffh, Goon2inc r2Goon2:inc r3djnz r7, Loopljmp $endT1b.c;3000H起长度256字节的存储块移到4000Hxdata unsigned char Buffer1[256] _at_ 0x3000;xdata unsigned char Buffer2[256] _at_ 0x4000;void main(){unsigned int index;unsigned char xdata * ptr1;unsigned char xdata * ptr2;ptr1 = &Buffer1;ptr2 = &Buffer2;for (index=0; index <= 255; index++) {*ptr2++ = *ptr1++;}}T2.ASM 8255输入输出实验mode equ 082h ; 方式0,PA,PC输出,PB输入1000,0010 PortA equ 8000h ; Port APortB equ 8001h ; Port BPortC equ 8002h ; Port CCAddr equ 8003h ; 控制字地址org 0hmov a, #modemov dptr, #CAddrmovx @dptr,a ; 输出控制字;实验1:PA口作输出,驱动LED,实现单个LED循环点亮。

EX_A: mov a,#80H ;最左灯先亮mov dptr,#PortAmov b,#8H ;右移位数OutA: movx @dptr,a ; 输出PortA,使相应灯亮rr a ; 亮灯右移位mov r5,#1 ;延时时间与r5成正比call delay ; 延时djnz b, OutA;实验2:PB口作输入,读入开关量,所得的数据由PA口输出,驱动LED EX_B: mov dptr,#PortBmovx a,@dptr ; 读入开关量mov dptr,#PortA ; 开关量输出到PortA驱动LEDmovx @dptr,amov r5,#2 ;延时时间与r5成正比call delay ;延时延时ljmp 0;延时子程序delay: mov r7,#0mov r6,#0ddd: djnz r7,ddddjnz r6,ddddjnz r5,dddretendT2.c 8255输入输出实验#define mode 0x82 // 方式0,PA,PC输出,PB输入xdata unsigned char PortA _at_ 0x8000 ; // Port Axdata unsigned char PortB _at_ 0x8001 ; // Port Bxdata unsigned char PortC _at_ 0x8002 ; // Port Cxdata unsigned char CAddr _at_ 0x8003 ; // 控制字地址void delay(unsigned char CNT){unsigned int i;while (CNT-- !=0)for (i=20000; i !=0; i--);}void main(){register unsigned char i, dd;CAddr = mode; // 方式0, PA,PC输出, PB输入while(1){dd = 0x80;for(i = 0; i<8; i++){PortA = dd; // 输出到PAdd >>= 1; // 移位delay(1); // 延时};dd = PortB; // PB输入PortA = dd; // 再输出到PAdelay(2);}#include <reg51.h>sbit LED = P1^0;bit LEDBuf;void ExtInt0() interrupt 0{LEDBuf = !LEDBuf;LED = LEDBuf;}void main(){LEDBuf = 0;LED = 0;TCON = 0x01; // 外部中断0下降沿触发IE = 0x81; // 打开外部中断允许位(EX0)及总中断允许位(EA) while (1) ;}T4.ASM 计数器/定时器实验;用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转Tick equ 10000 ; 10000 ×100us = 1sT100us equ 256-50 ; 100us时间常数(6M)C100us equ 30h ; 100us记数单元,初值=10000,高位低地址 LEDBuf equ 0 ;可寻址位00h作显示缓冲区LED equ P1.0ljmp Start;中断服务程序org 000bh ;中断入口T0Int: push PSWmov a, C100us+1 ;10000的低8位不为0时,继续-1jnz Goondec C100us ; 10000的低8位为0时,10000的高8位-1 Goon: dec C100us+1mov a, C100usorl a, C100us+1jnz Exit ; 100us 记数器不为0, 返回mov C100us, #high(Tick) ; 1秒定时到,重置记数器,取反LED mov C100us+1, #low(Tick)cpl LEDBufExit: pop PSWreti;主程序Start: mov TMOD, #02h ; 方式2, 定时器mov TH0, #t100usmov TL0, #t100usmov IE, #10000010b ; EA=1, IT0 = 1setb TR0 ; 开始定时clr LEDBufclr LEDmov C100us, #high(Tick) ; 100us记数单元初值=10000的高8位 mov C100us+1, #low(Tick) ; 100us记数单元初值=10000的低8位Loop: mov c, LEDBuf ;显示输出mov LED, cljmp LoopendT4.c 计数器/定时器实验;用CPU内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转#include <reg51.h>#define Tick 10000 // 10000 x 100us = 1s#define T100us (256-50) // 100us时间常数(6M)unsigned int C100us; // 100us记数单元bit LEDBuf;sbit LED = P1^0;void T0Int() interrupt 1{C100us--;if (C100us == 0) {C100us = Tick; // 100us 记数器为0, 重置记数器LEDBuf = !LEDBuf; // 取反LED}}void main(){TMOD = 0x02; // 方式2, 定时器TH0 = T100us;TL0 = T100us;IE = 0x82; // EA=1, IT0 = 1LEDBuf = 0;LED = 0;C100us = Tick;TR0 = 1; // 开始定时while (1) {LED = LEDBuf;}}T5a.ASM; 利用实验仪提供的显示电路,动态显示一行数据OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲Num equ 70h ; 显示的数据DelayT equ 75h ;ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED: ; 显示子程序mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #01call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopmov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管retStart: ;主程序mov sp, #40hmov Num, #0MLoop: inc Nummov a, Nummov b, amov r0, #LEDBufFillBuf:mov a, banl a, #0fhmov dptr, #LEDMapmovc a, @a+dptr ; 数字转换成显示码mov @r0,a ; 显示在码填入显示缓冲 inc r0inc bcjne r0, #LEDBuf+6, FillBufmov DelayT,#30DispAgain:call DisplayLED ; 显示djnz DelayT,DispAgainljmp MLoopendT5a.c;利用实验仪提供的显示电路,动态显示一行数据#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i, j;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}OUTBIT = 0; // 关所有八段管}void main(){unsigned char i = 0;unsigned char j;while(1) {LEDBuf[0] = LEDMAP[ i & 0x0f];LEDBuf[1] = LEDMAP[(i+1) & 0x0f];LEDBuf[2] = LEDMAP[(i+2) & 0x0f];LEDBuf[3] = LEDMAP[(i+3) & 0x0f];LEDBuf[4] = LEDMAP[(i+4) & 0x0f];LEDBuf[5] = LEDMAP[(i+5) & 0x0f];i++;for(j=0; j<30; j++)DisplayLED(); // 延时}}T5b.ASM; 把按键输入的键码在六位数码管上显示出来OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口LEDBuf equ 60h ; 显示缓冲ljmp StartLEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED: ; 显示子程序mov r0, #LEDBufmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop: mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey: ;检测是否有按键mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线置为0mov dptr, #INmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey: mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000bmov r2, #6KLoop: mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp ExitGoon1: mov r1, a ; 键值 = 列 X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1中为读入的行值 mov r1, #4LoopC: rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit: mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, @a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retStart: ;主程序mov sp, #40hmov LEDBuf+0, #0ffh ; 显示 8.8.8.8. mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0MLoop: call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示 call GetKey ; 读入键码anl a, #0fh ; 显示键码mov dptr, #LEDMapmovc a, @a+dptrmov LEDBuf+5, aljmp MLoopendT5b.c;把按键输入的键码在六位数码管上显示出来#define LEDLen 6xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口xdata unsigned char IN _at_ 0x8001; // 键盘读入口unsigned char LEDBuf[LEDLen]; // 显示缓冲code unsigned char LEDMAP[] = { // 八段管显示码0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};void Delay(unsigned char CNT){unsigned char i;while (CNT-- !=0)for (i=100; i !=0; i--);}void DisplayLED(){unsigned char i;unsigned char Pos;unsigned char LED;Pos = 0x20; // 从左边开始显示for (i = 0; i < LEDLen; i++) {OUTBIT = 0; // 关所有八段管LED = LEDBuf[i];OUTSEG = LED;OUTBIT = Pos; // 显示一位八段管Delay(1);Pos >>= 1; // 显示下一位}}code unsigned char KeyTable[] = { // 键码定义0x16, 0x15, 0x14, 0xff,0x13, 0x12, 0x11, 0x10,0x0d, 0x0c, 0x0b, 0x0a,0x0e, 0x03, 0x06, 0x09,0x0f, 0x02, 0x05, 0x08,0x00, 0x01, 0x04, 0x07};unsigned char TestKey(){OUTBIT = 0; // 输出线置为0return (~IN & 0x0f); // 读入键状态(高四位不用)}unsigned char GetKey(){unsigned char Pos;unsigned char i;unsigned char k;i = 6;Pos = 0x20; // 找出键所在列do {OUTBIT = ~ Pos;Pos >>= 1;k = ~IN & 0x0f;} while ((--i != 0) && (k == 0));// 键值= 列x 4 + 行if (k != 0) {i *= 4;if (k & 2)i += 1;else if (k & 4)i += 2;else if (k & 8)i += 3;OUTBIT = 0;do Delay(10); while (TestKey()); // 等键释放return(KeyTable[i]); // 取出键码} else return(0xff);}void main(){LEDBuf[0] = 0xff;LEDBuf[1] = 0xff;LEDBuf[2] = 0xff;LEDBuf[3] = 0xff;LEDBuf[4] = 0x00;LEDBuf[5] = 0x00;while (1) {DisplayLED();if (TestKey()) LEDBuf[5] = LEDMAP[GetKey() & 0x0f];}}T6.ASM; 实现两个实验台之间的串行通讯。

相关文档
最新文档