caoguixing 发表于 2014-7-14 15:37:07

51单片机显示0到9

            ORG         0000H
START:   MOV      DPTR,#TABLE
            MOV      A, #00H
S2:              MOVC      A,@A+DPTR
              CJNE       A,#00H,S1
             LJMP      START
S1:         MOV       P1,A
               INC       A
              CALL      DELAY
             LJMP   S2
TABLE: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H        ,00H

DELAY:MOV   R7,250
   L1:MOV   R6,200
   L2:MOV   R5,20
          DJNZ    R5,$
          DJNZ    R6,L2
          DJNZ    R7,L1
          RET   
          END
本人想显示数码管0-9十个数字,但是上面那段程序运行时只显示0,而且一直停在0,调试时发现每次跳转时就不能跳到S2,而是跳到MOVA,#00H这一行,百思不得其解,所以请求大家,这个是为什么.

Jong0019 发表于 2014-7-14 21:18:19

本帖最后由 Jong0019 于 2014-8-5 07:54 编辑

0000000000000

沉思的牛 发表于 2014-7-14 22:59:16

本帖最后由 沉思的牛 于 2014-7-14 23:02 编辑

我不是很懂51的汇编;
帮你看了一下,存在一些问题
从START开始:
MOV       DPTR, #TABLE   //取TABLE首地址
MOV       A, #00H               //累加器清零
MOVC   A, @A+DPTR      //取DPTR=DPTR=0C0H
CJNE       A, #00H,S1          //不等于,跳转到S1
S1:
MOV      P1,A                   //把数据传送到P1锁存器,你的段选端口,但是我没看见你的位选
INC         A                        //A++    A=0C1H
CALL      DELAY                  //调用延时
LJMP   S2                         //跳回S2
当你再次跳转到S2时, 你想取段选数据;
你的段选数据就不对了, DPTR =DPTR超过你的TABLE

沉思的牛 发表于 2014-7-14 23:05:00

望楼主下次发代码用代码编辑器:handshake

hope121212 发表于 2014-7-15 11:00:41

关键是对于MOVC      A,@A+DPTR这条语句的理解,这条语句在执行前,累加器A中存的是偏移地址,执行后存的是查到的字型码。要想实现显示0到9的目的,需要偏移地址加1,而你的问题是:把字型码加1了,再次查表就查不到0到9的字型码了。

ydst365 发表于 2014-7-15 13:04:23

:lol::lol::lol::shy::shy::shy:
页: [1]
查看完整版本: 51单片机显示0到9