浙江大学微机原理实验指导书

更新时间:2023-11-23 10:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 实验装置

一.伟福开发环境的使用

1.菜单

文件菜单选项

? 文件 | 打开文件 打开用户程序,进行编辑。如果文件已经在项目 中,

可以在项目窗口中双击相应文件名 打开文件。

? 文件 | 保存文件 保存用户程序。用户在修改程序后,如果进行编译,则在

编译前,系统会自动将修改过的文件存盘。

? 文件 | 新建文件 建立一个新的用户程序, 在存盘的时候,系统会要求用

户输入文件名。

? 文件 | 另存为 将用户程序存成另外一个文件, 原来的文件内容不会改变 ? 文件 | 重新打开 在重新打开的下拉菜单中有最近打开过的文件及项目,选

择相应的文件名或项目名就可以重新打开文件或项目。

? 文件 | 打开项目 打开一个用户项目,在项目中,用户可以设置仿真类型。

加入用户程序,进行编译,调试。系统中只允许打开一个项目,打开一个 项目或新建一个项目时,前一项目将自动关闭。

伟福开发环境的项目文件包括仿真器设置,模块文件,包含文件。仿真器设置包括仿真器类型,仿真头(POD)类型,CPU类型,显示格式和产生的目标文件类型可以用以下几种方法设置仿真器。

? 在项目窗口中双击第一行,将打开仿真器设置窗口,对仿真器进行设置。

? 按鼠标右键,在弹出菜单中选择[仿真器设置]。 ? 主菜单 | 仿真器 | 仿真器设置。 加入模块文件

? 按鼠标右键,在弹出菜单中选择[加入模块文件] ? 主菜单 | 项目 | 加入模块文件 加入包含文件

? 按鼠标右键,在弹出菜单中选择[加入包含文件] ? 主菜单 项目|加入包含文件

用户可以将以前单文件方式仿真转为WINDOWS下的项目方式进行仿真 ? 主菜单 文件|新建项目,在新建项目时,前一个项目自动关闭。 ? 加入模块文件时,选择要调试的程序文件名,将文件加入项目。 ? 将项目存盘。

? 编译,运行,调试项目。

? 文件 | 保存项目 将用户项目存盘。用户在编译项目时,自动存盘。 注意:

当用项目仿真时,系统要求项目文件,模块文件,包含文件在同一个目录(文件夹)下。

? 文件 | 新建项目 当用户开始新的任务时,应新建一个项目,在项目中,设

置所用仿真器类型,POD类型,加入用户程序(模块)。

? 文件 | 关闭项目 关闭当前项目,如果用户不想用项目方式调试单个程序,

就要先关闭当前项目。

? 文件 | 项目另存为 将项目换名存盘,此方法只是将项目用另一个名字,而

不会将项目中的模块和包含文件换成另一个名字存盘。如果想将整个项目及模块存到另一个地方,请用复制项目方法。

编辑菜单选项(E)

? 编辑 | 撤消键入 取消上一次操作 ? 编辑 | 重复键入 恢复被取消的操作

? 编辑 | 剪切 删除选定的正文,删除的内容被送到剪贴板上 ? 编辑 | 复制 将选定的内容,复制到剪贴板上 ? 编辑 | 粘帖 将剪贴板的内容插入光标位置 ? 编辑 | 全选 选定当前窗口所有内容。

搜索菜单选项(S)

? 搜索 | 查找 在当前窗口中查找符号,字串。可以指定区分大小写方式,全

字匹配方式,可以向上/向下查找。

? 搜索 | 在文件中查找 可以在指定的一批文件中查找某个关键字。

? 搜索 | 替换 在当前窗口查找相应文字,并替换成指定的文字,可以指定区

分大小写方式和全字匹配方式查找,可以在指定处替换,也可以全部替换。 ? 搜索 | 查找下一个 查找文字符号下一次出现的地方

? 搜索 | 项目中查找 在项目所有模块(文件)中查找符号,字串。在项目所

包含的文比较多时,用此方法可以很方便地查到字串在什么地方出现。 ? 搜索 | 转到指定行 将光标转到程序的某一行。

? 搜索 | 转到指定地址/标号 将光标转到指定地址或标号所在的位置。 ? 搜索 | 转到当前PC所在行 将光标转到PC所在的程序位置。

项目(P)

? 项目 | 编译 编译当前窗口的程序。如有错误,系统将会指出错误所在的位

置。

? 项目 | 全部编译 全部编译项目中所有的模块(程序文件),包含文件。如有

错误系统会指出错误所在位置。

? 项目 | 装入OMF文件 建好项目后,无须编译,直接装入在其它环境中编译

好的调试信息,在伟福环境中调试。

? 项目 | 加入模块文件 在当前项目中添加一个模块。 ? 项目 | 加入包含文件 在当前项目中添加一个包含文件

执行(R)

? 执行 | 全速执行 运行程序

? 执行 | 跟踪 跟踪程序执行的每步,观察程序运行状态。

? 执行 | 单步 单步执行程序,与跟踪不同的是,跟踪可以跟踪到函数或过程

的内部,而单步执行则不跟踪到程序内部。

? 执行 | 执行到光标处 程序从当前PC位置,全速执行到光标所在的行。如

果光标所在行没有可执行代码。则提示“这行没有代码” ? 执行 | 暂停 暂停正在全速执行的程序。

? 执行 | 复位 终止调试过程,程序将被复位。如果程序正在全速执行,则应

先停止。

? 执行 | 设置PC 将程序指针PC,设置到光标所在行。程序将从光标所在行

开始执行。

? 执行 | 自动单步跟踪/单步 模仿用户连续按F7或F8单步执行程序。

? 执行 | 设置/取消断点 将光标所在行设为断点,如果该行原来已为断点,则

取消该断点。所有断点通过断点窗口进行管理。四种方法可以在光标处设置断点

? 将光标移到编辑窗口内,行左边的空白处,光标变成“手指圆”箭头,

单击鼠标左键,可以设置/取消断点。

? 使用Ctrl-F8快捷键,可以在光标所在行设置/取消断点 ? 右击鼠标, 弹出菜单,选择 设置/取消断点

? 主菜单 执行/设置取消断点,也可以用Alt-R / B 菜单快捷设置取消断点

? 执行 | 清除全部断点 清除程序中所有的断点。让程序全速执行

窗口(W)菜单选项

? 窗口 | 刷新 刷新打开的所有窗口,及窗口里的数据。

? 窗口 | 项目窗口 打开项目窗口,以便在项目中加入模块或包含文件。(图:

项目窗口)

? 窗口 | 信息窗口 显示系统编译输出的信息。如果程序有错,会以图标形式

指出,表示错误,表示警告,表示通过。在编译信息行会有相关的生成文件,双击鼠标左键,或击右键在弹出菜单中选择“打开”功能,可以打开相关文件。如果有编译错误,双击左键,可以在源程序中指出错误所在行,有时前一行或后一行程序有错,会造成当前行编译不通过。而将错误定位在本行,所以如果发现了错误,但在本行没有发现错误,可以查查本行上下的程序。

? 窗口 | CPU窗口 通过CPU窗口,可以打开反汇编窗口,SFR窗口和REG

窗口。在反汇编窗口中可观察编译正确的机器码及反汇编程序,可以让你更清楚地了解程序执行过程;SFR窗口中可以观察到单片机使用的SFR(特殊功能寄存器)值和位变量的值;REG窗口为R0?R7、A、DPTR等常用寄存器的值。

反汇编窗口内为程序地址,机器码,反汇编码。在机器码窗口内也支持点屏功能,在反汇编码处,点击寄存器,可以看到寄存器的值。

反汇编窗口的弹出菜单

? 执行到光标处:使程序从当前PC值,全速执行到光标所在行,用这

种方法可以在调试程序时,跳过一些不必要的指令。将程序停到所要求的位置上。

? 转到指定地址/标号:将光标跳到某个地址或标号所在位置,以便察

看相应的程序,或使用 “执行到光标处”功能,也可以设置断点,将程序全速执行到相应位置。

? 转到当前PC所在行: 将光标跳到PC所在行,由于在检查程序时,

可能会将PC所在行移出当前窗口,用这种方法可找回PC所在行。 ? 取消/设置断点: 在光标所在行,设置断点,使程序全速执行到此处。

若此行已是断点,再次点击将取消该断点。

寄存器窗口的弹出菜单

? 加入观察:将当前寄存器放入观察窗口,以方便随时察看。

? 修改:修改当前寄存器值。在程序执行时,可以用这种方法,把寄存器值改为你所指定的值,从而观察程序在此值时运行的结果。

? 窗口 | 数据窗口 数据窗口根据选择的CPU类型不同,名称有所不同。51

系列有以下四种数据窗口:DATA-内部数据窗口;CODE-程序数据窗口;XDATA-外部数据窗口;PDATA-外部数据窗口(页方式);BIT窗口。以51系列为例说明数据窗口的操作方法: 内部数据窗口(DATA):

在内部数据窗口中可以看到CPU内部的数据值,红色的为上一步执行过程中,改变过的值。窗口状态栏中为选中数据的地址,可以在选中的数据上

直接修改数据的十六进制值,也可以用弹出菜单的修改功能,修改选中的数据值。

弹出菜单:

? 修改:修改选中数据的值,可以输入十进制,十六进制,二进制的值,

与直接修改不同的是,用这种方法可以输入多种格式数据,而直接修改只能输入十六进制数据。46(十进制),2EH(十六进制),00101110B(二进制)都是有效的数据格式。 ? 转到指定地址/标号:将数据地址直接转到指定的地址和标号所在的位置。 ? 生成数据源码:将窗口中某段数据转换成源程序方式的数据,可以贴到

你的源程序中。

? 块操作:对窗口中的数据块进行填充、移动、写文件、读入等操作。 ? 显示为:选择不同的数据类型显示数据内容,可以是字节方式(BYTE),

也可以是字方式(WORD,两字节),可以是长整型(LONGINT,四字节),也可以是实数型(REAL,四字节)。这里是选择整个窗口的显示方式,如果想指定个别数据的显示方式,可以用主菜单[执行|编辑观察项]功能,选择所要选择的显示类型。(参见编辑观察项窗口)

? 显示列数:将窗口中数据以4列、8列、16列方式显示。适应不同需要。

程序数据窗口(CODE)

程序数据窗口显示的是编译后程序码,状态栏显示的是选中数据的地址,可以对在选中数据上直接修改程序数据的十六进制值,也可以对程序数据进行‘块填充’,‘块移动’操作,也可以读入一段二进制代码插入程序数据中,也可以将程序数据中的某段代码写文件中。 弹出菜单:

? 修改:修改选中数据的值,可以输入十进制,十六进制,二进制的值,

与直接修改不同的是,用这种方法可以输入多种格式数据,而直接修改只能输入十六进制数据。46(十进制),2EH(十六进制),00101110B(二进制)都是有效的数据格式。

图2-1

步骤二:配置

从Keil 用户界面选择“Option for ‘Targe1t’”,在“Option for ‘Targe1t’”窗口Debug 栏中,选择“Use Keil Monitor-51 Driver”,注意当每次RESET目标板时用户的代码区会被擦除,如果用户程序需要在开始时下载到目标板, 要勾上“ Load Application at Startup” 。

点击Setting 项,弹出Target Setup 窗口进行配置,选择目标板与PC通讯的串行接口(COM1-COM4)和波特率,如果需要显示存储器的实时窗口,不要选择Cache Option。注意如果选择了Serial Interrupt,去Stop Porgram Execution,SoftICE 将修改在位置c:0023h 的中断向量3个BYTE,请确保用户程序没有占用这些地址。

以上的设定可以在程序调试过程再次修改。 步骤3:开始调试

从Debug 菜单点击Start/Stop Debug Session 开始调试过程。在连接过程中,偶尔会出现连接重试的情况,此时只要按一下复位按钮即可连接成功,建议每次连接之前进行复位。连接成功之后就可直接单步、断点、全速运行。

实验板上的功能器件 名称 功 能 说 明 七段数码管 8个共阳LED数码管段位接CH451的SEG端,字位接CH451的DIG端 CH451 整合了数码管显示驱动和键盘扫描控制以及μP 监控的多功能外围芯片。 MCU 系统控制、编程、下载等 MAX232 RS232串口通讯 继电器 在自动控制电路中起控制与隔离作用的执行部件,可以用低电压、小电流来控制大电流、高电压的自动开关。 25045 看门狗+复位+RAM TLC549 8 位I2C A/D 转换 TLC5615 10 位I2C D/A 转换 24C02 I2C EEPROM DS1302 SPI 串行实时时钟 蜂鸣器 音乐程序演示,接P3.7 PCF8574 I2C 串口转并I/0口 DS18B20 一线温度传感器 LED 8×8 点阵块 文字及图形显示实验 LCD 1602 字符显示实验 红色LED 8个红色发光二极管通过一片74LS245与P0口相连 黄色LED 8个黄色发光二极管通过一片74LS245与P1口相连 绿色LED 8个绿色发光二极管通过一片74LS245与P2口相连 矩阵键盘 4×4 矩阵键盘,行与列分别接CH451的SEG端(SEG0-SEG3)和DIG端(DIG0-DIG3)

应用接口和功能开关 标号 名称 功能说明 通过连接40PIN 仿真头对其他目标系统仿真调试,J6 仿真接口 也可通过此接口引出CPU信号扩展其他实验 J3 LCD12864液晶接口 此接口可用来外接一块12864汉字图形液晶屏 8个状态开关分别与P2口的8位IO口相连,通过设置K0-K7 状态开关 某位状态开关可将P2口的某一位设成低电平。 W4 对比度调整旋扭 此旋扭用来调整LCD1602液晶屏显示对比度 将2 拨通此时8位红色LED发光管与P0口接通,反之则断开。将3拨通此时8位绿色LED发光管与P2口接通反之则断开。将4拨通此时8位黄色LED发光管与P1口接通,反之则断开。将5拨通此时PCF8574的8K12 拨码开关 位并口IO口与8位绿色LED发光管接通。同时拨通7,8此时P0,P2口与LCD1602接通这时MCU通过P0,P2口对液晶屏显示控制。拨通6此时P2口与LED8X8模块接通,这时MCU通过P2口对模块显示控制。 TLC549模拟电压输实验时通过旋转次旋扭改变输入电压值,TLC 549 W2 入旋扭 可以采集不同电压值进行转换。 TLC5615参考电压W3 旋转此旋扭,可以向TLC5615提供合适的参考电压。 旋扭

第二章 微机原理及应用实验

实验一 开发环境的使用 一、 实验目的

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

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

PC机一台。 四、实验步骤

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

1.如果需把30H-7FH 的内容改为55H,如何修改程序? 2.如何把128B的用户RAM全部清零? 六、程序清单

文件名称:CLEAR.ASM

ORG 0000H

CLEAR: MOV R0,#30H ;30H 送R0寄存器

MOV R6,#50H ;50H 送R6寄存器(用作计数器)

CLR1: MOV A,#00H ;00 送累加器A

MOV @R0,A ;00 送到30H-7FH 单元 INC R0 ;R0 加1

DJNZ R6,CLR1 ;不到50H个字节,继续

WAIT: LJMP WAIT

END

实验二 数据传送 一、 实验目的

掌握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码之间的转换。 二、实验内容

1.编制一段程序,将31H单元中的无符号数转换成BCD码,存入32H~34H单元中。

2.编制一段程序,将到片内RAM40H,41H中的BCD数转换成十六进制数,存入42H单元中。

3.编制一段程序,将片内RAM30H~32H中的BCD数转换成ASCII码,结果存入外内RAM40H~42H中。

4.编制一段程序,将片内RAM40H~4FH中的BCD码转换成压缩BCD码,结果存入片外RAM0800H~0807H中。 三、实验设备

PC机一台。 四、实验步骤

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

1.如何把一个2字节无符号数转换成BCD码? 2.如何把一个3字节十六进制数转换成ASCII码?

实验四 数值运算 一、 实验目的

掌握采用软件方法进行多字节二进制数、BCD码的加、减运算。 二、实验内容

1.编制一段程序,将30H~35H单元中的无符号与40H~45H单元中的无符号数相加,结果存入30H~35H单元中。

2.编制一段程序,将40H~45H单元中的无符号与46H~4BH单元中的无符号数相减,结果存入40H~45H单元中。

3.编制一段程序,将30H~35H单元中的压缩BCD码与40H~45H单元中的压缩

BCD码相加,结果存入30H~35H单元中。 三、实验设备

PC机一台。 四、实验步骤

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

若有一个多字节有符号数的原码,如何求其补码?

实验五 堆栈操作 一、实验目的

掌握堆栈的使用方法何特点,学习部分有关堆栈操作的编程技巧。 二、实验内容

1.编制一段程序,利用堆栈将30H~35H单元中的数传送到40H~45H单元中。 2.编制一段包含子程序调用的程序,观察子程序调用过程中堆栈指针SP的变化以及堆栈中数据的变化。 三、实验设备

PC机一台。 四、实验步骤

逐段编制程序,汇编无误后,用“步入”的方式运行程序,检查程序运行过程中堆栈指针SP的变化以及堆栈中数据的变化,了解堆栈中的数据与子程序调用语句所处位置间的关系。 五、实验思考

如何在子程序执行完成后,不返回到原调用处,而是返回到某一指定地址处?

实验六 查表操作 一、实验目的

掌握查表程序的编程方法和技巧。 二、实验内容

1.以PC为基址寄存器,查表求30H单元中BCD码的平方,结果存入31H单元。 2.以DPTR为基址寄存器,查表求30H单元中无符号数的平方,结果存入40H、41H单元中。 四、实验步骤

逐段编制程序,汇编无误后,用连续或者单步的方式运行程序,检查程序的运行结果,看查表结果是否正确。 五、实验思考

如何用查表的方法求一个2字节无符号数的平方?

实验七 逻辑运算操作 一、实验目的

掌握逻辑运算操作的编程方法和应用技巧。 二、实验内容

1.设有X1、X2、X3、X4、X5、X6共六个十六进制数,存放在30H~35H单元中,求(X1·X2)⊕(X3+X4)+/(X5⊕X6)之值,并将结果存入40H单元。X1~X6的初始值分别为:X1=35H、X2=AAH、X3=67H、X4=4FH、X5=D9H、X6=08H。

2.编制一段程序,采用移位的方法,将50H~53H单元中的无符号数乘以8,不考虑溢出。

3.编制一段程序,采用移位的方法,将50H~53H单元中的无符号数除以128,不考虑余数。 三、实验设备

PC机一台。 四、实验步骤

逐段编制程序,汇编无误后,用连续或者单步的方式运行程序,检查程序的运行结果,看查表结果是否正确。 五、实验思考

如何将一个字节中的各位逆序排列(例如:由82H变为41H)?

实验八 中断及I/O口实验 一、实验目的

掌握中断程序的编程方法以及LJD-SY-5100实验开发板的使用。 二、实验内容

1.利用定时/计数器T0,实现1秒定时器。在中断服务程序中,将P1口的内容左移一位,由此实现与P1口相连的8个LED中一个点亮的LED每隔1秒左移一位。

2.在P0口、P1口、P2口各取一个LED,模拟红、黄、绿交通指示灯。利用定时/计数器T1,实现红灯亮2秒、黄灯亮1秒、绿灯亮4秒的循环。 三、实验设备

1.PC机一台;

2.LJD-SY-5100实验开发板一套; 四、实验步骤

1.接好LJD-SY-5100实验装置的电源,并将LJD-SY-5100实验装置的串行接口与PC机的串行接口相连。

2.开启LJD-SY-5100实验装置的电源。 3.在PC机上运行Keil C51软件,然后按《实验指导书》第一章中“LJD-SY-5100 学习实验开发板的使用”一节的步骤操作,输入源程序并进行调试。 五、实验思考

如何实现红灯亮2秒、黄灯亮以0.5秒间隔闪烁2次、绿灯亮4秒的循环。? 六、参考程序

以下程序的功能:使P1.0所连接的LED每隔0.5秒闪烁一次。其原理是利用定时器T0定时50ms,再利用计数器COUNT计数10次,构成0.5秒定时器。每当0.5秒

定时时间到,将P1.0的状态反转。

;============================================================== COUNT EQU 30H

;============================================================== ORG 0000H LJMP START

ORG 000BH LJMP T0_INT

;==============================================================

ORG 0030H START: MOV SP,#6FH

MOV TMOD,#01H MOV TH0,#4CH MOV TL0,#00H ;晶振11.0592MHz,定时50ms MOV COUNT,#10 ; 10×50=500ms,状态反转一次 MOV P1,#01H

SETB TR0 ;启动T0 SETB ET0 ;T0中断允许 SETB EA ;总中断允许

SJMP $ ;等待

;============================================================== ;T0中断服务程序

;============================================================== T0_INT:

MOV TH0,#4CH MOV TL0,#00H ;晶振11.0592MHz,定时50ms DJNZ COUNT,T0_INT1 ;10次计数值未到,返回 MOV COUNT,#10H ;重置计数器 CPL P1.0 T0_INT1:

RETI

END

实验九 串行通讯实验 一、实验目的

掌握串行通讯程序的编程方法。 二、实验内容

1.理解参考程序并在LJD-SY-5100实验开发板上调试通过。

2.对参考程序进行改造,增加串行口初始化程序及串行口中断服务程序,并进行双机通讯实验。 三、实验设备

1.PC机一台;

2.LJD-SY-5100实验开发板一套; 四、实验步骤

1.接好LJD-SY-5100实验装置的电源,并将LJD-SY-5100实验装置的串行接口与PC机的串行接口相连。

2.开启LJD-SY-5100实验装置的电源。 3.在PC机上运行Keil C51软件,然后按《实验指导书》第一章中“LJD-SY-5100 实验开发板的使用”一节的步骤操作,输入参考程序进行调试并通过。

4. 在参考程序基础上对程序进行改造,将程序功能改为:每按一次按键,就将键号通过串行口发送出去;对方单片机接收到数据后,将其显示在LED上。

5. 程序修改完成后汇编成机器码,保存为.HEX或.BIN文件。

6.将机器码下载至单片机的Flash中,两台LJD-SY-5100实验开发板为一组进行串行通讯实验。为保障实验装置的安全,下载操作必须在教师指导下在指定LJD-SY-5100实验开发板上进行,严禁同学擅自进行下载实验。 五、实验思考

如何实现一次发送或接收一批数据? 六、参考程序

以下程序的功能:每次按键,所按键号将在LED上显示。

LOAD BIT P1.2 DIN BIT P1.0 DCLK BIT P1.1 DOUT BIT P3.3

;============================================================== DATA_KEY DATA 35H

;============================================================== ORG 0000H LJMP START

ORG 0013H LJMP CH451_INT1

;==============================================================

ORG 0030H START: MOV SP,#60H

;-------------------------------------------------------------- LCALL INITIAL ;初始化CH451

CLR IT1 ;置外部信号为低电平触发 CLR IE1 ;清中断标志 SETB PX1

SETB EX1 ;允许键盘中断 SETB EA ;开总中断

SJMP $ ;等待

;============================================================== ;键盘处理

;============================================================== CH451_INT1:

PUSH PSW ;现场保护 PUSH ACC

LCALL READ_KEY ;读键值

MOV R3,DATA_KEY K1:

CJNE R3,#40H,K2 MOV A,#03FH ;'0'的显示码 SJMP LED_DISP

K2:

CJNE R3,#41H,K3 MOV A,#06H ;'1'的显示码 SJMP LED_DISP K3: CJNE R3,#42H,K4 MOV A,#5BH ;'2'的显示码 SJMP LED_DISP K4: CJNE R3,#43H,K5 MOV A,#4FH ;'3'的显示码 SJMP LED_DISP K5: CJNE MOV SJMP K6: CJNE MOV SJMP K7: CJNE MOV SJMP K8: CJNE MOV SJMP K9: CJNE MOV SJMP K10: CJNE MOV SJMP K11: CJNE MOV SJMP K12: CJNE MOV SJMP K13: CJNE MOV SJMP K14: CJNE MOV SJMP K15: CJNE MOV SJMP R3,#48H,K6 A,#66H LED_DISP R3,#49H,K7 A,#6DH LED_DISP R3,#4AH,K8 A,#7DH LED_DISP R3,#4BH,K9 A,#07H LED_DISP R3,#50H,K10 A,#7FH LED_DISP R3,#51H,K11 A,#6FH LED_DISP R3,#52H,K12 A,#77H LED_DISP R3,#53H,K13 A,#7CH LED_DISP R3,#58H,K14 A,#39H LED_DISP R3,#59H,K15 A,#5EH LED_DISP R3,#5AH,K16 A,#79H LED_DISP

;'4'的显示码 ;'5'的显示码 ;'6'的显示码 ;'7'的显示码 ;'8'的显示码 ;'9'的显示码 ;'A'的显示码;'B'的显示码 ;'C'的显示码 ;'D'的显示码;'E'的显示码 K16: CJNE R3,#5BH,K17 MOV A,#071H ;'F'的显示码

;------------------------------------------------------------ LED_DISP: MOV B,#08H LCALL WRITE

CLR IT1 ;置外部信号为低电平触发 SETB PX1 SETB EX1 ;允许键盘中断 SETB EA K17: POP ACC POP PSW CLR IE1 ;清中断标志 RETI

;============================================================ ;初始化CH451

;============================================================ INITIAL:

MOV P1,#60H ;禁止其它芯片

CLR DIN ;初始化CH451 SETB DCLK SETB DIN SETB LOAD SETB DOUT NOP

MOV B,#04H ;设置CH451 MOV A,#03H ;关看门狗开显示键盘 LCALL WRITE RET

;============================================================ ;入口: B中为传送数据位数 ;出口: 无

;影响寄存器: A,R7,PSW

;============================================================ WRITE:

CLR EX0 CLR LOAD MOV R7,#08H WRITE_1:

RRC A CLR DCLK MOV DIN,C SETB DCLK DJNZ R7,WRITE_1 MOV A,B MOV R7,#04H WRITE_2:

RRC A CLR DCLK MOV DIN,C SETB DCLK DJNZ R7,WRITE_2 SETB LOAD

SETB EX1 RET

;============================================================ ;入口: 无

;出口: 键盘扫描值在DATA_KEY中 ;影响寄存器: 无

;============================================================ READ_KEY:

PUSH PSW ;现场保护 PUSH ACC CLR EX1

CLR MOV READ_KEY_4: SETB RRC CLR MOV SETB CJNE SETB MOV READ_KEY_7:

MOV CLR RLC

SETB JC MOV

POP POP SETB CLR RET

LOAD ;命令开始 A,#0F7H ;读键值命令,忽略12位命令的低8位,高4位用作结束标志 C ;在高位添0以检测位数据结束 A ;低位在前,高位在后 DCLK

DIN,C ;送出一位数据 DCLK ;产生时钟上升沿锁通知CH451输入位数据 A,#0FFH,READ_KEY_4 ;位数据未完继续,共4位,完成后为0FFH LOAD ;产生加载上升沿通知CH451处理命令数据 A,#0FCH ;该数据用以检测位数据结束 C,DOUT ;读入一位数据 DCLK ;产生时钟下升沿通知CH451输出下一位 A ;数据移入ACC,高位在前,低位在后 DCLK READ_KEY_7 ;位数据未完继续,共7位,完成后才移出0 DATA_KEY,A ;保存键值 ACC PSW EX1 IE1 ;清中断标志,该指令需根据实际情况作修改

本文来源:https://www.bwwdw.com/article/7yct.html

Top