[讨论] 实验3.跑马灯

rain   2006-7-17 12:19 楼主

这个试验的跑马灯和上个试验的效果是一样的,也是使每个灯轮流点亮。既然效果一样,我们为什么做这么多灯的试验哪?我们做试验,不是开发产品,要求创新,我们做试验主要是学习知识,虽然这个试验和上个试验的,效果一样,但是我们确实使用了不同的方法。

在上节课中让 LED 流水是去逐个控制P1端口的每个位来实现的,那么我们这次的试验是在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此!

  可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是不正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据处理过程中作用十分重要,ACC为8位。他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。

程序如下:

star:             ;开始
  mov acc,#0feh  ;ACC中先装入LED1熄灭的数据(即二进制的 1111 1110)
  mov p1,acc     ;将ACC的数据送P1口
  acall
delay
  mov r0,#7      ;因上句送到 p1口的数据就熄灭了一位,
                 ;所以将数据再移动7次就完成一个8位流水过程     
loop:             ;数据移动循环
  rl a           ;将ACC中的数据左移一位
  mov p1,a       ;把ACC移动过的数据送p1口显示
  acall
delay                ;调用延时
  djnz r0,
loop   ;没有移动够7次继续移动
  ljmp
star      ;移动完7次后跳到开始重来,以达到循环流动效果
delay:            ;延时子程序,就是上节课中的延时子程序
    mov r1,#50
del0:
    mov r2,#100
del1:
    mov r3,#100
    djnz r3,$
    djnz r2,del1
    djnz r1,del0
   ret             ;延时子程序结束,返回到调用处的下一句
end                ;本汇编程序到此结束

  接下来,将上述程序编译,并烧写到前面我们的实验芯片中.

回复评论 (1)

文章内容介绍详细,学习了,不错的资料,学习了。感谢分享。

点赞  2024-10-24 23:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复