单片机第四章示例程序

合集下载

单片机实验第四章完整PPT

单片机实验第四章完整PPT

第四页
4、定义字命令DW
格式: 标号:DW 字或字表 功能: 定义若干个字(双字节) 例: ORG 8000H TAB:DW 7234H,8AH,10
汇编后: (8000H)= 72H (8001H)= 34H
(8002H)= 00H (8003H)= 8AH
(8004H)= 00H (8005H)= 0AH
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序 即小于零,等于零、大于零。
可以用两个条件转移指令来判断,
首先判断符号位,用指令JNB ACC.7, rel判断,
若ACC.7 = 1,则一定为负数;此时0
若ACC.7 = 0,则△≥0。此时再用指令JNZ rel 判断
若△≠0,则△> 0,否则△= 0
ANL A,#0FH
MOV DPTR,#ASCTAB
MOVC A,@A+DPTR
MOV HEX,A
DPTR
RET ASCTAB:DB
DB DB DB
0123
30H,31H,32H,333HH 344H,355H,366H,377H
8 9A B 38H,39H,41H,42H CDE F 43H,44H,45H,4466HH
例:一个十六进制数放在HEX单元的低四位, 将其转换成ASCII码
解:十六进制 0~9 的ASCII码为 30H~39H,
A~F 的ASCII码为 41H~46H,
ASCII码表格的首址为ASCIITAB
第十六页
编程1:
ORG 0200H
HEX EQU 30H HEXASC: MOV A,HEX
((AA))==135
例如:255(十进制)除以100,得 2(百位数)

第4章单片机原理及应用(C51编程)

第4章单片机原理及应用(C51编程)

4.3 C51的函数
4.3.1
返回值类型 { 函数体 }
C51函数的定义
函数名(形式参数列表)[编译模式][reentrant][interrupt n][using n]
一般形式:

编译模式为SMALL、COPACT或LARGE reentrant用于定义可重入函数 interrupt n 用于定义中断函数,n为中断号,可以为0~31 using n 确定工作寄存器组,取值为0~3
从而使DBYTE用于以字节形式对data区访问,可以写成:
与此类似: CBYTE用于以字节形式对code区进行访问; PBYTE用于以字节形式对pdata区进行访问; XBYTE用于以字节形式对xdata区进行访问。
CWORD、DWORD、PWORD和XWORD用于以字形式对 code区、data区、pdata区和xdata区进行访问。
4.2.4
C51程序编写示例
C51源程序
C51编译器
浮动目标码模块 系统库 连接器
列表文件 用户库
绝对定位目标码文件
映像文件
软件模拟器
转换器
硬件仿真器
OMF51格式文件 写入程序存储器 编程器
【例4-1】将30H至3FH共16个RAM单元初始化为“55H”。 #include <reg52.h> #include <absacc.h> void main(void) { unsigned char i; for (i=0;i<=15;i++) { DBYTE[0x30+i]=0x55; } while(1); } 编译系统自动连接了 startup.a51生成代码 一是将内部RAM的 00H~7FH清0; 二是设置堆栈指针SP。 有全局变量赋值时 编译系统会自动连接 init.a51生成代码

第4章8051单片机的中断系统

第4章8051单片机的中断系统
7
第四章 8051单片机的中断系统
例3-3 双字节数取补子程序。将(R4R5)中的双字节数取补,结果 送R4R5。 低8位送入A CMPT: MOV A,R5 低8位取反 CPL A ADD A, #1 低8位最低位加1 MOV R5, A MOV A, R4 CPL A 与前面相似 ADDC A, #0 MOV R4,A 无需SETB ACC.7 RET 对于二进制数,左移一位相当于乘以2,右移一位相当于除以2。 由于一般带符号数的最高位为符号位,故在执行算术移位操作时, 必须保持符号位不变。 原码表示的负数:由于负数的符号位为1,故移位时符号位不参 加移位; 8
第四章 8051单片机的中断系统
具体
14
第四章 8051单片机的中断系统 例3-10无符号二进制乘法程序。将(R2R3)和(R6R7)两个双字节 无符号数相乘,结果送R4R5R6R7。
NMUL: MOV R4, #0 MOV R5, #0 MOV R0, #16 ; 16位二进制数 CLR C NMLP: MOV A, R4 ;右移一位 RRC A MOV R4, A MOV A, R5 RRC A R4 R5 MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A JNC NMLN ;C为移出的乘数最低位, 若为0,则不执行加法 MOV A, R5 ;执行加法 15 ADD A, R3 MOV R5, A MOV A, R4 ADDC A, R2 MOV R4, A NMLN: DJNZ R0, NMLP ;循环16次 MOV A, R4 ;最后再右移一位 RRC A MOV R4, A R6 R7 MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A RET

(单片机完整课件PPT)第四章

(单片机完整课件PPT)第四章

访问 SFR 的 数据类型
例:
bit a1; unsigned char a2; unsigned int a3; unsigned char *a4; unsigned int *a5; a1=0; //位a1为0 a2=0x20; //字节变量a2=20h a3=0x1234; //整型(字)变量a3=1234h a4=0x30; //a4指向内RAM30h单元 a5=0x2000; //a5指向外RAM2000h单元
注意:
Unsigned char code a[10]={0,1,4,9,16,25,36,49,64,81}; Main() {unsigned char x,y; x=3; y=a[x];
a[3]=5;
定义表格数据, 存放在ROM里
}
Unsigned char a[10]={0,1,4,9,16,25,36,49,64,81}; Main() {unsigned char x,y; x=3; y=a[x]; a[3]=5; }
单片机原理与应用技术
厦门理工学院电子与电气工程系 陈志英
第四章 单片机C语言程序设计
4.1 C51的一般格式 4.2 51单片机的C51定义 4.3 C51程序设计简单举例
4.1 C51的一般格式
C程序(.C) 汇编程序(.ASM) 指令代码(.BIN)
C编译器 汇编器
C编译器
C51
FRANKLIN C51 KEIL C51 格式基本相同,可以兼容
数 据 类 型 data/idata/pdata 指针型 code/xdata 通用指针 sbit SFR SFR16
长度/位 8 16 24 1 8 16
字节数 1 2 3 — 1 2

第4章 单片机汇编语言程序设计

第4章  单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000

单片机第4章汇编语言程序设计

单片机第4章汇编语言程序设计
将汇编语言程序汇编成目标程序后,还要进行 调试,排除程序中的错误。只有通过上机调试并得 出正确结果的程序,才能认为是正确的程序。
4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。

第4章 MCS-51单片机汇编语言程序设计(2)

START:MOV DPTR,#TAB : MOV A,R7 ADD A,R7 MOV R3,A MOVC A,@A+DPTR
XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1

04.1 第四章 - 单片机中断系统(TCON、IE、IP)

❖计算机的中断应用现象
正在执行显示程序
处理键盘扫描
有人按键
单击鼠标左键
继续执行显示程序
继续处理键盘扫描
处理单击左键指令 完成鼠标操作
23:52
单片机技术
10
4.1.2 单片机中断系统
❖中断作用:
▪解决CPU与外设之间速度匹配的问题, 提高了计算机处理故障与 应变的能力。
❖相关寄存器
▪TCON、SCON、IE、IP
❖问答:
▪T0中断的入口地址? ▪5个中断源优先级从低到高的入口地址顺序是多少? ▪T1和/INT0中断的请求标志位分别是?
SETB PX1
不能
AJMP $ INT_0:CPL P1.0
因外中断源只有两个:/INT0和/INT1
RETI END
23:52
单片机技术
7
4.1.2 单片机中断系统
❖中断概念
• 指计算机在执行某一程序的过程中, 由于计算机系统内、 外的某 种原因, 而必须中止原来程序的执行, 转去执行相应的处理程序, 待处理结束之后, 再回来继续执行被中止的原程序的过程。
TFi RI 、TI
清除的方法
边沿触发时,硬件自动清除 电平触发时,软硬件清除(CLR IEi)
查询编程,软件清除(CLR TFi) 中断编程,硬件自动清除
软件清除(CLR RI 或 CLR TI)
23:52
单片机技术
17
思考与问答
❖思考:
▪51系列单片机共有几个中断源?分别是什么?如何区别? ▪中断源之间有什么关联?若两个以上中断源有效,CPU应 怎样处理谁先处理呢?
23:52
单片机技术
2
4.1.1 中断控制LED亮灭

单片机 第四章 80C51单片机汇编语言程序设计


(1)绝对调用指令:ACALL addr11 (2)长调用指令:LCALL addr16
(后续)
4.2.4 子程序设计
3.注意设置堆栈指针和现场保护 4.最后一条指令必须是RET指令 5.子程序可以嵌套,即子程序可以调用子程序
(接上)
6.在子程序调用时,还要注意参数传递的问题
子程序的基本结构
MAIN: ┇ ;MAIN为主程序或调用程序标号 ┇ LCALL SUB ;调用子程序 ┇ SUB:PUSH PSW PUSH ACC ;现场保护 ;
过程B
是 出口 (c) 循环结构
出口 (b) 分支结构
4.2.1
顺序程序结构
是汇编语言程序的最简单也是最基本的程序结 构。程序执行时一条接一条地按顺序执行指令, 无分支、循环以及调用子程序。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A , #30H ADD A , #58H MOV 30H , A SJMP $
二、定时程序 (2)多重循环定时程序(单片机频率为6MHz) 例 MOV R5,#TIME1 LOOP2: MOV R4,#TIME2 ;单周期指令 LOOP1: NOP ;单周期指令 NOP DJNZ R4,LOOP1 ;双周期指令 DJNZ R5,LOOP2 ;双周期指令 RET 公式: 循环体时间=(TIME2*4+2+1)*TIME1*2µs 总时间=循环体时间+4µs
机器编辑->交叉汇编->串行传送
(过程图见教材92页)
单片机的开发过程
设计硬件 软件编程 软件仿真调试 源代码烧入单片机 插入单片机脱机工作 模数电路/单片机硬件 MCS51汇编语言/C
计算机/MEDWIN环境

单片机第四章


3. 散转程序设计 利用基址寄存器加变址寄存器间接转移指令JMP 利用基址寄存器加变址寄存器间接转移指令 @A+DPTR,可以根据累加器 的内容实现程序多路分 ,可以根据累加器A的内容实现程序多路分 又称为散转程序. 支,又称为散转程序. 【例4.5】某段程序的运算结果在 中,要求根据 的内 】某段程序的运算结果在R0中 要求根据R0的内 分别转向0~ 个操作程序 个操作程序. 容,分别转向 ~255个操作程序.
4.2.2 分支程序的设计 分支程序主要是根据判断条件的成立与否来确定程序的 走向.因此在分支程序中需要使用控制转移类指令. 走向.因此在分支程序中需要使用控制转移类指令. 可组成简单分支结构和多分支结构. 可组成简单分支结构和多分支结构. 1. 单分支选择结构 当程序的判断仅有两个出口,两者选一, 当程序的判断仅有两个出口,两者选一,称为单分支结 构.通常用条件判断指令来选择并确定程序的分支出 口.
MOV R7,# ,#7FH;设置比较次数 ,# ; MOV R0,# ,#30H;设置数据块首址 ,# ; MOV A,@ ;取第一个数 ,@R0; ,@ MOV 20H,A; , ; LOOPl:INC R0 : MOV A,@ ;依次取下一个数 ,@R0; ,@ CJNE A,20H,LOOP , , LOOP:JNC LOOP2;两数比较后,其中小的数放在 : ;两数比较后, 20H单元 单元 MOV 20H,A , LOOP2:DJNZ R7,LOOP1;R7中内容为零则比较完 : , ; 中内容为零则比较完 SJMP $
ORG 0000H LJMP STRAT ORG 0030H START: MOV DPTR, #TABLE MOV A, R0 MOV B, #3 MUL AB MOV R1, A MOV A, B ADD A, DPH MOV DPH, A MOV A, R1 JMP @A+DPTR TABLE: LJMP OPR0 LJMP ORR1 LJMP OPR2 … LJMP OPR255 END
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第4章MCS-51程序设计例题解析【例4-1】已知16位二进制负数存放在R1、R0中,试求其补码,并将结果存放在R3、R2中。

解:二进制负数的求补方法可归结为“求反加1”,符号位不变。

利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。

注意这里不能用INC指令,因为INC 指令不影响标志位。

程序如下:CONT: MOV A, R0 ;读低8位CPL A ;取反ADD A, #1 ;加1MOV R2, A ;存低8位MOV A, R1 ;读高8位CPL A ;取反ADDC A, #80H ;加进位及符号位MOV R3, A ;存高8位RET ;返回【例4-2】将两个半字节数合并成一个1字节数。

解:设内部RAM的40H、41H单元中分别存放着8位二进制数。

要求取出两个单元中的低半字节,合并成一个字节后,存放在42H单元中。

程序如下:ORG 0000HSTART:MOV R1, #40HMOV A, @R1ANL A, #0FH ;取第一个半字节SWAP AINC R1XCH A, @R1 ;取第二字节ANL A, #0FH ;取第二个半字节ORL A, @R1 ;拼字INC R1MOV @R1, A ;存放结果SJMP $END【例4-3】拆字程序。

ORG 0000HSTART:MOV R1, #40HMOV A, @R1MOV B, A ;暂存B中ANL A, #0FH ;取第一个半字节INC R1MOV @R1, A ;存放第一个半字节MOV A, BSWAP AANL A, #0FH ;取第二个半字节INC R1MOV @R1, A ;存放第二个半字节SJMP $END【例4-4】求单字节有符号二进制数的补码。

解:正数的补码是其本身,负数的补码是其反码加1。

因此,程序首先判断被转换数的符号,负数进行转换,正数即为补码。

设二进制数放在累加器A中,其补码放回到A中。

程序如下:ORG 0000HCMPT:JNB ACC.7, NCH ;(A)>0,不需转换CPL AADD A, #1SETB ACC.7 ;保存符号NCH:SJMP $END【例4-5】两个无符号数比较大小。

解:设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。

程序如下:ORG 8000HST1 EQU 8040HSTART1:C LR C ;进位位清零MOV DPTR, #ST1 ;设数据指针MOVX A, @DPTR ;取第一个数MOV R2, A ;暂存R2INC DPTRMOVX A, @DTPR ;取第二个数SUBB A, R2 ;两数比较JNC BIG1XCH A, R2 ;第一个数大BIG0:I NC DPTRMOVX @DPTR, A ;存大数SJMP $BIG1:M OVX A, @DPTR ;第二个数大SJMP BIG0END【例4-6】多个单字节数据求和。

已知有10个单字节数据,依次存放在以内部RAM的50H单元开始的连续单元中。

要求把计算结果存入R2、R3中(高位存R2,低位存R3)。

解:程序如下:ORG 8000HSAD:MOV R0, #50H ;设数据指针MOV R5, #0AH ;计数值0AH→R5SAD1:MOV R2, #0 ;和的高8位清零MOV R3, #0 ;和的低8位清零LOOP:MOV A, R3 ;取加数ADD A, @R0MOV R3, A ;存和的低8位JNC LOP1INC R2 ;有进位,和的高8位+1LOP1:INC R0 ;指向下一个数据地址DJNZ R5, LOOPSJMP $END【例4-7】内部RAM单元清零。

要求:将60H为起点的9个单元清“0”。

解:程序如下:ORG 0000HCLEAR:CLR A ;A清0MOV R0, #60H ;确定清0单元起始地址MOV R6, #09 ;确定要清除的单元个数LOOP:MOV @R0, A ;清单元INC R0 ;指向下一个单元DJNZ R6, LOOP ;控制循环SJMP $END【例4-8】外部RAM单元清零。

要求:设有40个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首地址存放在DPTR中,设为3000H。

解:程序如下:ORG 0000HMOV DPTR, #3000HCLEAR:CLR AMOV R2, #28H ;置计数值LOOP:MOVX @DPTR, AINC DPTR ;修改地址指针DJNZ R2, LOOP ;控制循环END多重循环程序【例4-9】10秒延时程序。

延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。

程序如下:DEL:MOV R5, #100 ;1DEL0:MOV R6, #100 ;1DEL1:MOV R7, #249 ;1DEL2:DJNZ R7, DEL2 ;248*2DJNZ R6, DEL1 ;(248*2+1+2)*100DJNZ R5, DEL0 ;[(248*2+1+2)*100+1+2]*100RET【例4-10】请编出能把20H单元内两个BCD数变换成相应ASCII码放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。

解:根据ASCII字符表,0~9的BCD数和它们的ASCII码之间仅相差30H。

因此,仅需把20H 单元中两个BCD数拆开,分别和30H相加即可,可以编出程序如下:ORG 0000HASC1:MOV R0, #22HMOV @R0, #00HMOV A, 20HXCHD A, @R0ORL 22H, #30HSWAP AORL A, #30HMOV 21H, ASJMP $END【例4-11】一位十六进制数转换为ASCII码子程序。

解:程序如下:HASC:MOV R0, SPDEC R0DEC R0 ;R0为参数指针XCH A, @R0 ;保护ACC,取出参数ANL A, #0FHADD A, #2 ;加偏移量MOVC A, @A+PCXCH A, @R0 ;将查表结果放回堆栈中RETDB '0123456789' ;十六进制数的ASCII字符表DB 'ABCDEF'END【例4-12】把内部RAM中50H、51H的双字节十六进制数转换为4位ASCII码,存放于(R1)指向的4个内部RAM单元。

解:编写程序时可以将例4-10当作子程序调用,子程序名为HASC。

HA24:MOV A, 50HSWAP APUSH ACCACALL HASCPOP ACCMOV @R1, AINC R1PUSH 50HACALL HASCPOP ACCMOV @R1, AINC R1MOV A, 51HSWAP APUSH ACCACALL HASCPOP ACCMOV @R1, AINC R1PUSH 51HACALL HASCPOP ACCMOV @R1, AEND【例4-13】一个字节的两位十六进制数转换为两个ASCII码子程序。

解:参考程序如下:ORG 0000HHTA2:MOV R0, SPDEC R0DEC R0PUSH ACC ;保护累加器内容MOV A, @R0 ;取出参数ANL A, #0FHADD A, #12 ;加偏移量MOVC A, @A+PCXCH A, @R0 ;低位HEX的ASCII码放入堆栈中SWAP AANL A, #0FHADD A, #5 ;加偏移量MOVC A, @A+PCINC R0XCH A, @R0 ;高位HEX的ASCII码放入堆栈中INC R0XCH A, @R0 ;高位返回地址放入堆栈,并恢复累加器内容RETDB '0123456789'DB 'ABCDEF'END【例4-14】将内部RAM中50H、51H单元的内容以4位十六进制数的ASCII形式串行发送出去,可调用HTA2子程序。

解:参考程序如下:ORG 0000HSCOT4:PUSH 50HACALL HTA2POP ACCACALL COUTPOP ACCACALL COUTPUSH 51HACALL HTA2POP ACCACALL COUTPOP ACCACALL COUTCOUT:JNB TI, COUT ;字符发送子程序CLR TIMOV SBUF, ARETEND【例4-15】字符串发送子程序。

解:ORG 0000HSOUT:POP DPH ;栈中指针POP DPLSOT1:CLR AMOVC A, @A+DPTRINC DPTRJZ SENDJNB TI, $ ;$为本条指令地址CLR TIMOV SBUF, ASJMP SOT1SEND:JMP @A+DPTREND用MOVC A,@A+PC查表指令编程【例4-16】用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪3下,反复循环。

解:程序如下:START: MOV R0, #00HLOOP: CLR AMOV A, R0ADD A, #0CHMOVC A, @A+PCCJNE A, #03H, LOOP1JMP STARTLOOP1: MOV P1, AACALL DELINC R0JMP LOOPTAB: DB 01H, 02H, 04H, 08H, 10H, 20H, 40H, 80HDB 80H, 40H, 20H, 10H, 08H, 04H, 02H, 01HDB 00H, 0FFH, 00H, 0FFH, 00H, 0FFH, 03HDEL: MOV R7, #0FFHDEL1: MOV R6, #0FFHDEL2: DJNZ R6, DEL2DJNZ R7, DEL1RETEND用MOVC A,@A+DPTR查表指令编程【例4-17】用查表方法编写彩灯控制程序,编程使彩灯先顺次点亮,再逆次点亮,然后连闪3下,反复循环。

解:程序如下:START: MOV DPTR, #TABLELOOP: CLR AMOVC A, @A+DPTRCJNE A, #03H, LOOP1JMP STARTLOOP1: MOV P1, AACALL DELINC DPTRJMP LOOPTABLE: DB 01H, 02H, 04H, 08H, 10H, 20H, 40H, 80HDB 80H, 40H, 20H, 10H, 08H, 04H, 02H, 01HDB 00H, 0FFH, 00H, 0FFH, 00H, 0FFH, 03HDEL: MOV R7, #0FFHDEL1: MOV R6, #0FFHDEL2: DJNZ R6, DEL2DJNZ R7, DEL1RETEND用转移指令表实现散转在许多场合中,要根据某一单元的值0, 1, 2, …, n分别转向处理程序0,处理程序1, …,处理程序n。

相关文档
最新文档