热卖开发板:
  • 51单片机开发板
  • USB开发板
  • AVR单片机开发板
  • 【小雨的成长】简单东西复杂玩之流水灯



      功能要求:1令P2的8个LED每隔一秒左移一次
                       2 令定时器1在方式1下工作,每隔10000us中断一次,中断一百次也就是一秒 了。。

      对。。我们用,定时中断法玩流水灯!!
                 初学者可不要小看 了他。。(呵呵,我也是调试了好久才弄出来的!)

      通过这个弄让大家更加明白中断的工作过程。。

       

      下面我贴出我写的汇编程序
                    ORG 0000H
                    SJMP START
                   ORG 000BH
                   LJMP DS0
                   ORG 0030H
      START:  SETB EA                ;初始化IE,TMOD,SP,TCON
                    SETB ET0
                   MOV TMOD,#01H
                   MOV TH0,#0D8H
                  MOV TL0,#0F0H
                  CLR TF0
                  MOV SP,#30H
                  MOV R0,#100
                  SETB TR0
                 MOV A,#0FEH
                 MOV P2,A               ;传输到P2口     ①
                SJMP $                    ;等待中断

      DS0:  PUSH ACC              ;这里是重点。
                MOV TH0,#0D8H    ;因为是以方式一说以要重新装载TH0,TL0
                MOV TL0,#0F0H
                DJNZ R0,LOOP      ;看下面注释1
                MOV A,P2              ;看下面注释2
                RL A
                MOV P2,A              ;②
                MOV R0,#100

      LOOP:   POP ACC
                   RETI
        
                 END  

      下面说说我写这个程序的时候体会。。也算是用定时器中断的时候要注意的地方吧!!
      注释1:DJNZ R0,LOOP这条指令是判断是否延时1S,当时我写的时候被以前的思想影响了。将LOOP做了①的标号,这是错误的,应为在跳到中断的时候,会将PC压栈,这样的话直接跳到①的话,PC会出错。要返回就要用RETI。

      注释2:如果你开始没有将ACC压栈的话,这里可以不要。。大家可以试试将A压栈了而不要注释2这条指令,会发现当P2.0口跳到P2.1口后,就在也不会跳了。。因为,A被压栈了。。以后的程序将会始终将FEH左移。所以不会跳了。
         这里新手要注意!!

      大家会发现当RETI返回后,都是返回到SJMP $。所以在中断程序中要②这条指令。。

    声明:CEPARK已尽力确保内容的准确性,但因业务发展和技术服务的需要,有关内容可能会根据实际情况随时更新或者修改,恕不另行通知,不便之处敬请谅解!
      商城推荐
      社区指南
    CEPARK电子园-电子工程师自己的网络家园!
      迷你博客,轻松完成日志发布,管理相册;展示个性自我
      兴趣小组,热点话题,加入您感兴趣的话题讨论小组,一起交流吧
      最新资讯,热门话题与好友一起分享信息,他评论感兴趣的话题
      实名认证,真实交友,还可以轻松快捷的了解好友动态
      邀请您身边的好友,朋友,同事一起加入欢乐圈