51单片机255倒计时器汇编程序调试遇到问题

255倒计时器的需求是,有s28(单刀开关),s29(按钮)两个控制构件,要求是s28低电位时,进入预设模式,有滑动电阻器输入电压,利用adc0808模数转换,得到数字量,然后在8位数码管最左3位动态显示出来,s28高电位时,8位数码管上最左边3位显示预设值,最右边3位显示实时倒计时值,按下s29(1下开始,2下暂停)开始倒计时,每一秒-1,减到0,则使蜂鸣器响30秒,然后8位数码管最右边重新显示预设值,等待下一次倒计时。

自己写的时候,遇到问题如下:①动态数码管仿真显示异常,s28接高电位可以显示左右各3位,但是拨动到低电位只能显示一位(正常是显示左三位),利用的是同一个显示子程序(寄存器值不同)。②s28只能从高电位切换回低电位(由低到高只显示一位),且只有第一次有效,后面无论怎么拨动都只显示一位,如①问题。③使用寄存器间接寻址,mov A,@R0,指向bcd码缓存区时,指向异常,比如60H内有#01H,但是读取的时候,a取到了0,inc r0,依次向后也是如此。接线图以及汇编程序如下:

img

        IOCON EQU 8003H
        PORTA EQU 8000H
        PORTB EQU 8001H
        IN0   EQU 9000H               
        BUF   EQU 60H  ;ad转换读入缓存
        EOC   BIT P1.0
        BIZ   BIT P1.1
        S28   BIT P1.2
        S29   BIT P3.2
        
        ORG 0000H
        LJMP START
        ORG 0200H
               
        ORG 0003H
        JNB S28,out
        CPL  TR0
        out:
        RETI
        
        ORG 000BH
        INC R4 ;+1,重装值
        MOV TH0,#4EH
        MOV TL0,#20H
        CJNE R4,#20,leave
        MOV R4,#00H
        JNB F0,jishu
        CLR BIZ
        INC R5
        CJNE R5,#30,leave
        SETB BIZ
        MOV A,R3 ;无法 MOV R2,R3
        MOV R2,A
        LCALL CON
        CLR TR0
        AJMP leave
        jishu:
        MOV A,R2
        DEC A
        MOV R2,A
        MOV B,#100 ;开始计算
        DIV AB
        MOV 63H,A        ;63H 预设百位
        MOV A,B
        MOV B,#10
        DIV AB
        MOV 64H,A        ;64H 预设十位        
        MOV 65H,B        ;65H 预设个位
        CJNE R2,#00H,leave
        SETB F0
        leave:
        RETI
        
        CON:
        MOV 63H,60H
        MOV 64H,61H
        MOV 65H,62H
        RET
               
        SHOW:
        MOV R7,#80H        ;从第一位开始
        MOV R0,#60H        ;缓存首地址
        next:
        LCALL DELAY
        MOV A,@R0         ;送段码
        MOV DPTR,#TAB
        MOVC A,@A+DPTR
        MOV DPTR,#PORTA
        MOVX @DPTR,A
        INC R0        ;下一段
        MOV A,R7        ;送位码
        CPL A
        INC DPTR        ;指向portb
        MOVX @DPTR,A
        CPL A
        RR A        ;下一位        
        MOV R7,A
        CJNE R7,#10H,gou
        MOV R7,#04H
        gou:
        DJNZ R6,next
        RET
        
        TAB: DB 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
               
        DELAY:
        MOV R1,#0FFH
        DJNZ R1,$
        RET
        
        START:
        MOV P0,#0FFH        ;准双向口读,先写1
        MOV P1,#0FFH
        MOV P3,#0FFH
        MOV DPTR,#IOCON        ;指向8255命令口
        MOV A,#80H        ;PA、PB、PC设为基本输出模式
        MOVX @DPTR,A
        MOV TMOD,#01H ;初始化T0定时器,11.1HZ频率下,设为20000即可
        MOV TH0,#4EH
        MOV TL0,#20H
        SETB EA
        SETB ET0
        SETB EX0
        SETB IT0        ;下降沿触发
        pan:
        JB S28, DJS ;是0,则进入设置计数值
        MOV DPTR,#9000H        ;指向A/D的0通道
        SETB EOC
        MOVX @DPTR,A        ;启动A/D转换
        JNB EOC                     ;没转换好则等待
        MOVX A,@DPTR        ;读A/D转换值
        MOV A,#107        ;测试用
        MOV R2,A         ;用于倒计时
        MOV R3,A         ;用于恢复计数值
        MOV R4,#00H         ;用于计秒
        MOV R5,#00H         ;用于计蜂鸣器
        MOV B,#100;开始计算
        DIV AB
        MOV 60H,A        ;60H 预设百位
        MOV 63H,A
        MOV A,B
        MOV B,#10
        DIV AB
        MOV 61H,A        ;61H 预设十位
        MOV 64H,A
        MOV 62H,B        ;62H 预设个位
        MOV 65H,B
        MOV R6,#03H ;显示位数
        LCALL SHOW
        AJMP PAN
        djs:
        MOV R6,#06H ;显示位数
        LCALL SHOW
        AJMP PAN
        END

http://www.51hei.com/bbs/forum.php?mod=attachment&aid=Mjg3MzE2fDhiYTE1MzkxfDE2Mzk3OTY5ODR8OTc5NTUxfDIxNTY2OA%3D%3D
为了便于各位调试,源码及protues8.9工程文件链接一并附上了,十分感谢。