单片机/MCUwilliam hill官网
直播中

高扬

5年用户 7经验值
擅长:光电显示
私信 关注
[问答]

求汇编大神帮我看下这段程序哪有错误?仿真后数码管显示0000?

本人汇编语言萌新,有好多不懂的地方,下面是程序,求大神解答
                 OE               BIT          P2.7     ;ADC0808的OE端
                  EOC             BIT          P2.6     ;ADC0808的EOC端
                  ST               BIT          P2.5    ;ADC0808的START和ALE端
                  CS4             BIT          P2.3
                  CS3             BIT          P2.2
                  CS2             BIT         P2.1
                  CS1             BIT          P2.0
                  LED_0          DATA          30H      ;显示缓冲区
                  LED_1          DATA          31H
                  LED_2          DATA          32H
                  LED_3          DATA          33H
                  ADC             DATA          34H     ;存放转换后的数据
                  ORG             0000H
                  AJMP            START
                  ORG             0030H
;--------------初始化------------------------------------------
START:         MOV             SP,#60                 ;设置堆栈
                  MOV             LED_0,#00H              ;清空显示缓冲区
                  MOV            LED_1,#00H
                  MOV            LED_2,#00H
                  MOV            LED_3,#00H
                  MOV            DPTR,#TABLE                  ;送字形码表首地址
;---------------ADC0808转换--------------------------------
AD_CONV:    CLR               ST
                  SETB           ST
                  CLR             ST                                  ;启动转换
                  JNB             EOC,$                             ;等待转换结束
                  SETB           OE                                  ;允许输出
                  MOV            ADC,P1                            ;暂存转换结果
                  CLR             OE                                  ;关闭输出
;---------------数据处理---------------------------------------
ADC_RD:       MOV        A,ADC                          ;将AD转换结果转换成BCD码
                  MOV            B,#0C4H                      ;乘以19.6mv(5V/255)
                  MUL            AB                               ;AB相乘结果存在A
                  MOV           R7,A                            ;把A结果存在R7
                  MOV            R6,B                            ;B中数据存在R6
TUNBCD:       CLR      A                                 ;清空A
                  CLR              C                                ;清空C
                  MOV             R3,A                            ;清空R3
                  MOV             R4,A                            ;清空R4
                  MOV             R5,A                            ;清空R5
                  MOV             R2,#10H                      ;把10H赋给R2
T_BCD:         MOV        A,R7                            ;把R7中结果赋给A
                  RLC              A                                ;将A循环左移
                  MOV             R7,A                            ;将循环左移后的结果存在R7
                  MOV             A,R6                            ;把R6数据赋给A
                  RLC              A                                ;将A循环左移
                  MOV             R6,A                            ;将循环左移结果给R6
                  MOV             A,R5                            ;把R5数据赋给A
                  ADDC           A,R5                            ;把A和R5中数据相加
                  DA               A                                ;将计算结果改为十进制
                  MOV                   R5,A                      ;把A中数据赋给R5
                  MOV                   A,R4                      ;把R4中数据赋给A
                  ADDC                 A,R4                      ;把R4和A中数据相加
                  DA                     A                          ;把结果转换为十进制
                  MOV                   R4,A                      ;把转换后的结果赋给R4
                  MOV                   A,R3                      ;把R3中数据赋给A
                  ADDC                 A,R3                      ;把A和R3中数据相加
                  MOV                   R3,A                      ;把相加结果存在R3
                  DJNZ                  R2,T_BCD               ;R2-1若不为零则跳到T_BCD
                  MOV                   A,R5                      ;把R5数据移到A
                  SWAP                 A                          ;将A高四位和低四位互换
                  ANL                    A,#0FH                  ;把A和0FH相与
                  MOV                   LED_0,A                 ;把相与结果存在LED_0
                  MOV                   A,R4                      ;把R4结果存在A
                  ANL                    A,#0FH                  ;把A和0FH相与
                  MOV                   LED_1,A                 ;把相与后的结果存在LED_1
                  MOV                   A,R4                      ;把R4结果存在A
                  SWAP                 A                          ;把A高四位和低四位互换
                  ANL                    A,#0FH                  ;把A和0FH相与
                  MOV                   LED_2,A                 ;把相与后的结果赋给LED_2
                  MOV                   A,R3                      ;把R3数据赋给A
                  ANL                    A,#0FH                  ;把A和0FH相与
                  MOV                   LED_3,A                 ;把相与后的结果存在LED_3
                  LCALL                 DISP                      ;调用DISP函数
                  AJMP                  AD_CONV               ;跳到AD_CONV执行
DISP:           MOV                   A,LED_0         ;把LED_0的数据存在A
                  CLR                    CS4                       ;清空CS4
                  CLR                    CS3                       ;清空CS3
                  CLR                    CS2                       ;清空CS2
                  CLR                    CS1                       ;清空CS1
                  MOVC                 A,@A+DPTR           ;查表
                  SETB                   CS4                       ;把CS4置1
                  MOV                   P0,A                      ;把A的数据存在P0
                  LCALL                 DELAY                   ;调用DELAY函数
                  CLR                    CS4                       ;把CS4清零
                  MOV                   A,LED_1                 ;把LED_1赋给A
                  MOVC                 A,@A+DPTR           ;查表
                   SETB                 CS3                       ;把CS3置1
                   MOV                  P0,A                      ;把A的数据赋给P0
                   LCALL                DELAY                   ;调用DELAY函数
                   CLR                   CS3                       ;清零CS3
                   MOV                  A,LED_2                 ;把LED_2的数据赋给A
                   MOVC                A,@A+DPTR           ;查表
                   SETB                 CS2                       ;把CS2置1
                   MOV                  P0,A                      ;把A中数据给P0
                   LCALL                DELAY                   ;调用DELAY函数
                   CLR                   CS2                       ;清空CS2
                   MOV                  A,LED_3                 ;把LED_3中数据给A
                   MOVC                A,@A+DPTR           ;查表
                   SETB                 CS1                       ;把CS1置1
                   MOV                  P0,A                      ;把A中数据给P0
                   CLR                   P0.7                      ;第一位显示小数点
                   LCALL                DELAY                   ;调用DELAY函数
                   CLR                     CS1            ;清空CS1
                   RET
DELAY:        MOV                 R7,#3                     ;把3赋给R7
DELA:             MOV            R6,#115                    ;把115赋给R6
                   DJNZ                R6,$                         ;R6-1若不为0则跳到$
                   DJNZ                R7,DELA                   ;R7-1若不为0则跳到DELA
                   RET
TABLE:          DB       0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
                   DB       80H,90H,88H,83H,0C6H,0A1H,86H,8EH,6FH
                   END

  • QQ图片20190923172352.png
已退回1积分

回帖(4)

李玉兰

2019-9-23 17:45:47
测试过硬件有问题吗?
3 举报
  • 高扬: 硬件没问题,C语言程序运行正常,但是汇编语言不行
  • 王栋春 回复 高扬: 你是手动转译的还是自动转译的
  • 高扬 回复 王栋春: C语言和汇编语言程序还有这个威廉希尔官方网站 图是在一本书上摘抄的,但是这本书很多程序确实有错误,威廉希尔官方网站 图我还不确定有没有错........我以为C程序运行正常就代表威廉希尔官方网站 没问题了呢。。(我初学单片机)

人中狼

2019-9-23 23:44:55
程序还没看,但是威廉希尔官方网站 真的确定没有问题吗,段选的NPN三极管的发射极接电源,那么三极管如何能够导通
1 举报
  • 高扬: 这个我确实也觉得不太对劲,但是C语言程序运行正常我也就没太在意

人中狼

2019-9-24 10:41:22
程序思路应该没问题,可以先屏蔽AD转换部分,单独调试数码管显示,设置固定的数值,看显示是否正确。
另外威廉希尔官方网站 中ADC的数据口与P1口是反接的,就是DA1接到了P17,DA8接到了P10,所以或者修改威廉希尔官方网站 ,或者在读入ADC数据后,做一个数据位的调换处理
1 举报

阿信509

2019-9-26 21:23:51
都是先用最简单的程序开始调试
举报

更多回帖

发帖
×
20
完善资料,
赚取积分