上QQ阅读APP看书,第一时间看更新
2.3 流水灯实例
本节基于上一节的硬件电路,首先介绍关于寻址方式的基础知识,然后给出了运用查表法实现的流水灯实例程序。
2.3.1 基础知识
寻址方式是指寻找、确定参与操作的数据地址的方式,8051单片机的寻址方式包括寄存器寻址、直接寻址、寄存器间接寻址、立即寻址以及基址寄存器加变址寄存器间接寻址,这5种寻址方式的功能见表2-7。下面将详细介绍基址寄存器加变址寄存器间接寻址的寻址方式。
表2-7 5种寻址方式的功能
基址寄存器加变址寄存器间接寻址方式一般用于访问程序存储器中的数据表格,这种寻址方式,是以DPTR或PC作基址寄存器,以累加器A作变址寄存器,并以两者内容相加形成的16位地址作为操作数的地址,以达到访问数据表格的目的。若累加器A中原有内容为05H,程序存储器0405H单元的内容为0C4H,执行如下指令后,程序存储器0405H单元的内容将被传送到累加器A,即执行后累加器A中的内容为0C4H。
MOV DPTR,#0400H MOV A,#05H MOVC A,@A + DPTR
2.3.2 软件程序设计
本实例直接给出完整的流水灯实例,并解释程序实例中新出现的指令。
1.程序全貌
以下为流水灯实例的软件程序。
;----------------------------------- ; 流水灯实例 ;功能:点亮发光管LED并闪烁 ;----------------------------------- ORG 0000H ;伪指令,指定程序从0000H开始存放 LJMP MAIN ;跳转指令,程序跳转到MAIN处 ORG 0100H ;伪指令,指定以下程序从0100H开始存放 MAIN: MOV SP,#60H ;给堆栈指针赋初值 MOV P1,#0FFH ;给P1赋初值,LED全灭 ;以下为查表程序 MOV DPTR,#LED_TABLE LIGHT: MOV R7,#42 LOOP: MOV A,#42 SUBB A,R7 ;(1) MOVC A,@A + DPTR MOV P1,A ;输出显示 LCALL DELAY ;调延时子程序 DJNZ R7,LOOP SJMP LIGHT ;跳转,程序继续 ;延时子程序 DELAY: MOV R7,#10H DELAY0: MOV R6,#7FH DELAY1: MOV R5,#7FH DJNZ R5,$ DJNZ R6,DELAY1 DJNZ R7,DELAY0 RET ;表格数据 LED_TABLE: DB 0FFH ;全部熄灭 DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH ;依次逐个点亮 DB 0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,080H,000H ;依次逐个叠加 DB 080H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH ;依次逐个递减 DB 07EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,07EH ;两边靠拢后分开 DB 07EH,03CH,018H,000H,000H,018H,03CH,07EH ;从两边叠加后递减 DB 000H ;全部点亮 END
程序(1)为带进位的减法指令,该指令从累加器A中减去源操作数内容和进位标志,结果存入A。如果位7有借位,则PSW寄存器的Cy位置1,否则清0;如果位3有借位,则PSW寄存器的Ac位置1,否则清0;如果位6有借位而位7没有借位,或者位7有借位而位6没有借位,则PSW寄存器的溢出标志位OV置1,否则溢出标志位清0。
2.运行结果
程序运行后,将依次循环出现8只LED依次逐个点亮、依次逐个叠加、依次逐个递减、从两边靠拢后分开、从两边叠加后递减的流水灯效果。
2.3.3 技巧总结
通过本实例可以看到:
● 查表指令可用于复杂代码转换显示,通过查表指令实现复杂的显示效果,并可以减少程序代码。