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 技巧总结

通过本实例可以看到:

● 查表指令可用于复杂代码转换显示,通过查表指令实现复杂的显示效果,并可以减少程序代码。