《51单片机应用开发从入门到精通》——2.3 流水灯实例

简介:

本节书摘来自异步社区《51单片机应用开发从入门到精通》一书中的第2章,第2.3节,作者 张华杰,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 流水灯实例

本节基于上一节的硬件电路,首先介绍关于寻址方式的基础知识,然后给出了运用查表法实现的流水灯实例程序。

2.3.1 基础知识

寻址方式是指寻找、确定参与操作的数据地址的方式,8051单片机的寻址方式包括寄存器寻址、直接寻址、寄存器间接寻址、立即寻址以及基址寄存器加变址寄存器间接寻址,这5种寻址方式的功能见表2-7。下面将详细介绍基址寄存器加变址寄存器间接寻址的寻址方式。


screenshot

基址寄存器加变址寄存器间接寻址方式一般用于访问程序存储器中的数据表格,这种寻址方式,是以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 技巧总结

通过本实例可以看到:

  • 查表指令可用于复杂代码转换显示,通过查表指令实现复杂的显示效果,并可以减少程序代码。
相关文章
|
1月前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
70 0
|
9月前
|
芯片
51单片机--点亮LED灯和流水灯
51单片机--点亮LED灯和流水灯
113 0
|
8月前
【单片机期中测试】4.按键不同时长控制流水灯
【单片机期中测试】4.按键不同时长控制流水灯
40 0
|
8月前
【单片机期中测试】3.按键控制流水灯循环
【单片机期中测试】3.按键控制流水灯循环
112 0
|
8月前
【单片机期中测试】1.简单的流水灯程序
【单片机期中测试】1.简单的流水灯程序
62 0
|
9月前
|
存储 调度
51单片机--定时器与按键控制流水灯模式
51单片机--定时器与按键控制流水灯模式
266 0
|
11月前
|
编译器
【51单片机】按键操作(单个灯闪烁&&流水灯)
按键操作(单个灯闪烁&&流水灯)
418 0
|
11月前
|
芯片
蓝桥杯STC15单片机流水灯
蓝桥杯STC15单片机流水灯
141 0
|
12月前
|
C语言
51单片机入门流水灯
51单片机入门流水灯
440 0