3855|8

108

帖子

3839

TA的资源

等待验证会员

楼主
 

周工:哪怕再简单也要注重思路! [复制链接]

人们时常看到户外动画广告,一会儿从左到右地显示,一会儿又从右到左地显示,这就是流水灯效果,其特征是将想要显示的画面切割成N份,且每次只让其中的一个画面显示,同时让肉眼能够看得清楚。

假设先让其中的一幅画面显示,接着“立刻”点亮与其相邻的另一幅画面,且同时熄灭前一幅画面,画面切换间隔时间为µs级,由于人眼的反应速度非常之慢,所以无法看清楚画面切换的过程,以至于看起来的效果就是一幅全部点亮的画面,比如,电视画面,这就是人们常说的视觉暂存效应。


如果在点亮第一幅画面后,延时等待一个固定的时间值(假设延迟时间为ms或s级),再在点亮与其相邻的画面的同时熄灭前一幅画面,接着再延时等待一个固定的时间值……那么就能看到画面象流水一样显示的效果。


下面将用LED来模拟从右到左的流水灯的显示效果,将“与发光二极管D17-D24相连的JP4”用并行排线连接到“与单片机的P1.0-P1.7口相连的JP31”,然后短接JP39_5与JP39_6,即硬件电路连接完毕(省略图)。由此可以看出,只要单片机I/O口输出高电平1,那么经过反相器转变为低电平后,即可驱动LED发光,反之LED熄灭。

很显然如果想先点亮最右边第一个LED(D17),那么只要将数据01H传送到P1口即可。通过查看传送指令集,发现可以直接使用“MOV direct,#data”(MOV P1,#01H)指令来实现,那么只要在灯“流动”显示的过程中插入延时程序即可,程序清单1.1就是实现LED流水灯的程序,MAIN为主程序标号,就是程序计数器的PC,即起始地址0000 0000。

程序清单 1.1  LED流水灯程序范例(1)

  1. MAIN: MOV  
  2. P1,#01H                          
  3. ;01H = 0000 0001 ,P1.0为高电平1,D17发光
  4.       ;执行延时程序Delay                                      
  5.       MOV  P1,#02H                          
  6. ;02H = 0000 0010,P1.1为高电平1,D18发光
  7.       ;执行延时程序Delay                                      
  8.       ……
  9.       MOV  P1,#80H                          ;80H
  10. = 1000 0000,P1.7为高电平1,D24发光
  11.       ;执行延时程序Delay                                      
  12.       AJMP MAIN                             ;跳转到MAIN,循环执行程序
复制代码


虽然这种编程方法也能够达到目的,但效率却很低。通过分析上面的程序可以看出其中的规律,即数据01H、02H、04H、08H、10H、20H、40H、80H中的“1”不断地从右向左移动。由此可见,如果将数据01H存放在累加器A中,即使用“MOV A,#01H”指令,接着将A中的数据传递给P1,然后再想办法让A中的数据01H中的“1”从右向左移动即可,其应用实例如下:

   
  1. MOV
  2. direct,A                           ;MOV
  3. P1,A
复制代码


    通过查看逻辑运算指令集,发现“RLC A”移位运算指令刚好满足要求。其功能是将累加器A的内容全部向左移动1位,当移位8次之后,最高位D7移到标志位CY,而CY原来的内容则移到累加器最低位D0中,其数据结构为1 0000 0000,即CY=1所有的LED全部熄灭,这就是实现“流水”灯的基本思路,详见程序清单1.2。

程序清单 1.2  LED流水灯程序范例(2)

  1. MAIN:MOV  A,#01H
  2. Loop: MOV  P1,A
  3.       RLC  A                                
  4. ;带进位累加器A循环左移
  5.       ;执行延时程序Delay
  6.       AJMP Loop                             
  7. ;跳转到Loop处,循环执行程序
复制代码


接着开始编写延时程序,那么一条指令的执行时间是多少呢?循环延时程序详见程序清单 6.13。

程序清单 1.3  延时程序范例(1)

  1. MOV  R7,#0FFH                        ;1个机器周期
  2. Delay2:DJNZ R7,Delay2                       ;2个机器周期(*)
复制代码



在执行指令之前R7先减1,然后判断R7是否为0。如果R7≠0,则R7继续做减1操作。与此同时因为延时参数寄存器R7保存的数据为255(0FFH),由于执行1条指令(标有“*”号的指令)为2个机器周期,所以这2个机器周期会重复执行255次。程序实际所耗的准确机器周期为:1+2×255=511个机器周期,延时时间为511×1.1µs =562.1µs。很显然由于人眼的视觉暂存效应,以至于最终看到的效果是LED全部被点亮,因此必须再延长扫描时间,那么最好的办法是使用DJNZ指令再增加一个延时循环,详见程序清单 1.4。

程序清单 1.4  延时程序范例(2)

Delay: MOV   R6,#0FFH                       ;1个机器周期
Delay1: MOV   R7,#0FFH                       ;1个机器周期
Delay2: DJNZ  R7,Delay2                      ;2个机器周期
        DJNZ  R6,Delay1                      ;2个机器周期


延时时间为[1+(1+2×255+2)×255]×1.1µs=143897.6µs=143.8mS,由此可见,如果觉得延时时间不合适,由于R7处于内层循环,因此修改R7的初值对延时的影响太小,那么可以修改R6寄存器的初值。程序清单 1.5为改进后的LED流水灯程序,程序清单 1.6为翻译为机器码后对应的程序。

程序清单 1.5  LED流水灯程序范例(3)

  1. MAIN: MOV   A,#01H
  2. Loop:  MOV   P1,A
  3.        RLC   A
  4. Delay:MOV   R6,#0FFH                         ;延时时间为143.8mS
  5. Delay1:MOV   R7,#0FFH
  6. Delay2 DJNZ  R7,Delay2
  7.        DJNZ  R6,Delay1
  8.        AJMP  Loop
  9.        ;
  10.        END
复制代码


程序清单 1.6  LED流水灯程序范例(4)
  

  1. 地址           指令           助记符                   注释
  2. 0000 0000      0111
  3. 0100       MOV   
  4. A,#01H          ;该指令为2字节
  5. 0000 0001      0000 0001
  6. 0000 0010*    1111
  7. 0101      
  8. MOV   P1,A            ;该指令为2字节
  9. 0000 0011      1001 0000
  10. 0000 0100      0011
  11. 0011       RLC   A               ;该指令为1字节
  12. 0000 0101      0111
  13. 1110       MOV   R6,#0FFH        ;该指令为2字节
  14. 0000 0110      1111 1111
  15. 0000 0111*    0111
  16. 1111       MOV   R7,#0FFH        ;该指令为2字节
  17. 0000 1000      1111 1111
  18. 0000 1001*   1101
  19. 1111       DJNZ  R7,0009H         
  20. ;该指令为2字节,跳转到0009H
  21. 0000 1010      1111
  22. 1110                                                         
  23. 0000 1011      1101
  24. 1110       DJNZ  R6,0007H         ;该指令为2字节,跳转到0007H
  25. 0000 1100      1111
  26. 1010                                                         
  27. 0000 1101      0000
  28. 0001       AJMP  0002H            ;该指令为2字节
  29. 0000 1110      0000 0010
复制代码


待程序输入正确无误之后,只要将A3实验区的运行开关K11拨到RUN档运行,即可看到LED流水灯效果。
此帖出自单片机论坛

最新回复

名人 大人物不亲自写博太正常,呵呵 不过一个很好的团队完成的文章,也算是集大成者了, 学习一下 :D  详情 回复 发表于 2010-3-10 09:13
点赞 关注
 

回复
举报

2955

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
周立功博客写的很好.....
此帖出自单片机论坛
 
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 

回复

2万

帖子

74

TA的资源

管理员

板凳
 
看来 很多事情都是从一点点积累起来的,周工也不例外
此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

720

帖子

0

TA的资源

纯净的硅(中级)

4
 
从小事锻炼才能养成一个好的思考习惯
此帖出自单片机论坛
 
 
 

回复

330

帖子

907

TA的资源

一粒金砂(中级)

5
 
呵呵 习惯很重要
此帖出自单片机论坛
 
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

6
 
汇编看不太懂
此帖出自单片机论坛
 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

7
 
习惯最重要,一个好的习惯顶的过看万卷书!
此帖出自单片机论坛
 
 
 

回复

6366

帖子

4928

TA的资源

版主

8
 
呵呵,其实周立功写的博客这些,是他手下的一个团队在写。他本人是不写的
此帖出自单片机论坛
 
 
 

回复

802

帖子

24

TA的资源

五彩晶圆(中级)

9
 

回复 8楼 tiankai001 的帖子

名人 大人物不亲自写博太正常,呵呵
不过一个很好的团队完成的文章,也算是集大成者了,
学习一下 :D
此帖出自单片机论坛
 
个人签名生活在激情中 ... 希望 哈哈

https://home.eeworld.com.cn/?80086
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表