单片机第四章示例程序
单片机实验第四章完整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.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单片机的中断系统

第四章 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)第四章

访问 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章 单片机汇编语言程序设计

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.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)
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。