搜索
bottom↓
回复: 1

新手请教:汇编实现三字节16进制数转换为10进制ASCII码程序

[复制链接]

出0入0汤圆

发表于 2012-9-6 09:20:59 | 显示全部楼层 |阅读模式
本帖最后由 bg9gas 于 2012-9-6 09:28 编辑

如题。
就是想把PLL的2AH 2BH 2CH 的三个值显示到1602LCD上,刚开始学习汇编,PLL驱动是别人帮我写的,自己加的1602驱动,只会把PLL 的值以16进制显示到LCD上。那位大侠有程序的话给小弟一份,谢谢!
附原代码
;设置参考时钟 单位 khz
                        MB1151_FOSC                EQU                12800  ; EQU 赋值指令
;**********************                       

;设置通讯口
                        MB1511_DATA                BIT        P3.5            ; BIT 位地址定义伪指令
                        MB1511_CLOCK        BIT        P3.6
                        MB1511_LE                BIT        P3.7

;89C51引脚定义
        LCD_RS       BIT P1.0
        LCD_RW       BIT P1.1
        LCD_E        BIT P1.2
        LCD_DATA     EQU P0
                       


;内部变量设置
                        ;参数N
                        MB1151_N_H                DATA        25H                ; 指定内存        可位寻址内存
                        MB1151_N_L                DATA        26H
                        ;参数A
                        MB1151_A                DATA        27H
                        ;参数R
                        MB1151_R_H                DATA        30H
                        MB1151_R_L                DATA        31H
                        ;参数M
                        MB1151_M                DATA        24H
                       
                        ;VCO压控振荡器的频率 单位 KHZ
                        MB1151_FVCO_H        DATA        2AH
                        MB1151_FVCO_M        DATA        2BH
                        MB1151_FVCO_L        DATA        2CH
                        ;步进频率 单位KHZ
                        MB1151_FSTEPPER        DATA        32H
                       
                        ;临时变量
                        BUFF_1                DATA        3AH
                        BUFF_2                DATA        3BH
                        BUFF_3                DATA        3CH
;H转换ASCII 临时变量缓冲
                        BUFF_4          DATA    4AH
                        BUFF_5          DATA    4BH

                               
                ;        MB1151_FOSC_H        DATA        2DH
                ;        MB1151_FOSC_L        DATA        2EH

                        ORG 0000H                      ;主程序开始
                        AJMP STAR                                       
                        ORG 0003H                                           ;外中断0
                        RETI
                        ORG 000BH                                           ;定时器0
                        RETI
                        ORG 0013H                                           ;外中断1
                        RETI
                        ORG 001BH                                           ;定时器1
                        RETI
                        ORG 0023H                                           ;串口
                        RETI
                        ORG 002BH
                        RETI
                       
                        ORG 0030H
STAR:               
            CLR        EA
                        MOV        SP,#50H
                       
                        LCALL         MB1511_INITIAL  ;初始化MB1511
                        ACALL   LCD_INITIAL
;改变频率并显示

                        ACALL   DISP
                    SJMP $

;LCD 显示子程序        入口条件A
DISP:                 
                  LCALL CLS
                          CLR A
                  MOV A,#10000000B
                  LCALL WRITE_COM
                          MOV A,#41H
                  LCALL WRITE_DATA
;16进制数转10进制再转为ASCII码 发送AB到lcd。
                  MOV  A,MB1151_FVCO_H
                          ACALL  HASC
                          MOV  A,BUFF_4
                  LCALL WRITE_DATA
                          MOV  A,BUFF_5
                          ACALL WRITE_DATA

                          MOV  A,MB1151_FVCO_M
                          ACALL  HASC
                          MOV  A,BUFF_4
                  LCALL WRITE_DATA
                          MOV  A,BUFF_5
                          ACALL WRITE_DATA

                          MOV  A,MB1151_FVCO_L
                          ACALL  HASC
                          MOV  A,BUFF_4
                  LCALL WRITE_DATA
                          MOV  A,BUFF_5
                          ACALL WRITE_DATA


                  RET
;入口条件:待转换的单字节十六进制数在累加器A中。
;出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。
;影响资源:PSW、A、B 堆栈需求: 4字节  
HASC:    MOV B,A
         LCALL HAS1
         XCH A,B
         SWAP A
HAS1:    ANL A,#0FH
         ADD A,#90H
         DA A
         ADDC A,#40H
         DA A
                 MOV BUFF_4,A
                 MOV BUFF_5,B
         RET   


;****** 启动LCM子程序******
LCD_INITIAL:  CLR A
              MOV A,#00111000B
                  LCALL WRITE_COM
                  MOV A,#00001100B
                  LCALL WRITE_COM
                  MOV A,#00000110B
                  LCALL WRITE_COM
                  RET
;******查询忙碌标志信号子程序******
CHECK_BUSY:  PUSH ACC
BUSY_LOOP:         CLR LCD_E
                 SETB LCD_RW
                 CLR LCD_RS
                 SETB LCD_E
                 MOV A, LCD_DATA
                 CLR LCD_E
                 JB ACC.7,BUSY_LOOP
                 POP ACC
                 LCALL DEL
                 RET
;****** 写指令到LCM子程序******
WRITE_COM:             LCALL CHECK_BUSY
                    CLR LCD_E
                    CLR LCD_RS
                    CLR LCD_RW
                    SETB LCD_E
                    MOV LCD_DATA,A
                    CLR LCD_E
                    RET
;****** 写数据到LCM子程序******
WRITE_DATA:         LCALL CHECK_BUSY
                    CLR LCD_E
                    SETB LCD_RS
                    CLR LCD_RW
                    SETB LCD_E
                    MOV  LCD_DATA,A
                    CLR LCD_E
                    RET
;*******清除LCM子程序*******
CLS:        MOV A,#00000001B
            LCALL WRITE_COM
            RET
;****延时子程序****::::2.7ms
DEL:        MOV R6,#5
L1:            MOV R7,#248
            DJNZ R7,$
            DJNZ R6,L1
            RET
;********************               

;初始化MB1511
;初始频率150000khz ===换算147970-21.4=126570 为十六制1ee6a H;01 M;EE L;6A
;步进频率 1khz
;
MB1511_INITIAL:
                        CLR MB1511_CLOCK;
                        CLR MB1511_DATA;
                        CLR MB1511_LE;
                       
                        ;压控振荡器输出频率 khz 为单位
                        MOV MB1151_FVCO_H,#01H
                        MOV MB1151_FVCO_M,#0EEH
                        MOV MB1151_FVCO_L,#6AH
                       
                        ;步进频率 单位 khz
                        ;要确保参考频率是步进频率的整数倍
                        ;最大255 255khz
                        MOV MB1151_FSTEPPER,#1;
                       
                        ;预分配比例 64或128
                        MOV MB1151_M,#128;
                       
                        LCALL SET_FVCO;
                        LCALL SET_STEPPER;
                        RET
                       
                       
;设置压控振荡器频率
;单位 khz
;接口参数
;MB1151_FVCO_H
;MB1151_FVCO_M
;MB1151_FVCO_L
SET_FVCO:
                LCALL mb1511_calculate_n_a;计算频率数据
                LCALL         send_pd_data;将频率数据写入芯片
                RET
       
;改变步进频率
;接口参数
;MB1151_FSTEPPER
;单位 khz
SET_STEPPER:
                 LCALL mb1511_calculate_r;计算步进频率
                 LCALL         send_prd_data;写入步进频率
                 LCALL SET_FVCO ;改变步进后重新计算并写入频率
                 RET
                       
               
;发送分频器数据到MB1151 A N
send_pd_data:
                        MOV BUFF_1,MB1151_N_H
                        MOV BUFF_2,MB1151_N_L
                        MOV R3,#5
                       
SP1:                CLR C       
                        MOV A,BUFF_2
                        RLC A
                        MOV BUFF_2,A
                        MOV A,BUFF_1
                        RLC A
                        MOV BUFF_1,A
                        DJNZ R3,SP1;
                       
                        MOV R3,#6
                        MOV R0,#0
                        MOV R1,MB1151_A
                       
SP2:                CLR C       
                        MOV A,R1
                        RLC A
                        MOV R1,A
                        MOV A,R0
                        RLC A
                        MOV R0,A
                        DJNZ R3,SP2;
                       
                        ;ORL R1,#0010000B;CONTROL BIT
                        MOV A,BUFF_2
                        ORL A,R0  ;SW 64
                        MOV BUFF_2,A
                        MOV BUFF_3,R1  ;SW 64
                       
                        MOV R1,#19;要发送数据的长度 单位是位
                        MOV R0,#BUFF_1;要发送数据的地址
                        LCALL         send_mb1511_data;
                        RET
                       
;发送参考分频器数据到MB1151        R
send_prd_data:
                        MOV BUFF_1,MB1151_R_H
                        MOV BUFF_2,MB1151_R_L
                        MOV A,MB1151_M
                        CJNE A,#64,SPD1
                        ORL BUFF_1,#01000000B ;SW 64
                        SJMP SPD2
SPD1:                ANL BUFF_1,#10111111B ;SW 128
SPD2:               
                        CLR C
                        MOV A,BUFF_2;左移一位
                        RLC A
                        MOV BUFF_2,A
                        MOV A,BUFF_1
                        RLC A
                        MOV BUFF_1,A;加入控制位
                        ORL BUFF_2,#00000001B;CONTROL BIT
                       
                        MOV R1,#16;要发送数据的长度 单位是位
                        MOV R0,#BUFF_1;要发送数据的地址
                        LCALL         send_mb1511_data;
                        RET
                       
;*******************************
;计算参考参考振荡器预分频比例 R
;根据参考振荡器频率和步进频率来计算
;参数
;R3 参考频率高
;R4 参考频率低
;R7 步进频率
;
mb1511_calculate_r:
;R = Fosc / FSTEPPER
                        MOV R2,#0;
                        MOV R3,#HIGH MB1151_FOSC
                        MOV R4,#LOW MB1151_FOSC
                       
                        MOV R7,MB1151_FSTEPPER;
                                ;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
                        LCALL NDIV31;
                       
                        MOV MB1151_R_H,R3;
                        MOV MB1151_R_L,R4;
                        RET
;计算可编程分频器 N 和吸收脉冲分配器 A
;根据与分频比例 M
;参考参考振荡器预分频比例 R
;压控振荡器输出频率 Fvco
;计算出 N 和 A
mb1511_calculate_n_a:
                       
;X = Fvco/(fosc/R)
                        MOV R2,MB1151_FVCO_H;
                        MOV R3,MB1151_FVCO_M;
                        MOV R4,MB1151_FVCO_L;
                        MOV R5,#0;
                        MOV R7,MB1151_FSTEPPER;FSTEPPER = (fosc/R)
                        MOV R6,#0;
                                ;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
                        LCALL NDIV31;
                       
                        MOV BUFF_1,R2
                        MOV BUFF_2,R3
                        MOV BUFF_3,R4
                         
;************************
;N = X / M
                        MOV R7,MB1151_M;
                                ;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
                        LCALL NDIV31;
;************************
;M * N
                        MOV MB1151_N_H,R3;
                        MOV MB1151_N_L,R4;
                        MOV R7,MB1151_M;
                         ;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
                        LCALL NMUL21;
;************************
;A = X - M*N
                        MOV A,R2;
                        MOV R5,A;
                        MOV A,R3;
                        MOV R6,A;
                        MOV A,R4;
                        MOV R7,A;
                       
                        MOV R2,BUFF_1
                        MOV R3,BUFF_2
                        MOV R4,BUFF_3
                        ;三字节无符号数减法程序 (R2R3R4-R5R6R7)=(R2R3R4)
                        LCALL NSUB3;
                        MOV MB1151_A,R4;
                        RET;
                       

;***********************************
;串行发送数据到MB1511
;接口参数
;发送数据的长度 R1 以bit为单位
;发送数据的地址 @R0 向上增长
;使用了 A,B,R1,R0,R5,R6,R4
;***********************************
send_mb1511_data:

                        CLR        MB1511_CLOCK;时钟引脚低
                        CLR        MB1511_LE;锁定引脚低
       
                        MOV A,R1;//因为每次最多发送一字节数据所以将长度分解成 字节+剩下的位数
                        MOV B,#8;
                        DIV AB;
                        MOV R5,A;R5存放字节数
                        MOV R6,B;R6存放剩下的位数
       
                        JZ SMD1;如果要发送的数据少于一字节则跳转到SMD1处
                       
SMD_LOOP1:        MOV A,@R0;//循环发送R5个字节的数据
                        MOV R4,#8;
                        LCALL send_byte;
                        INC R0;
                        DJNZ R5,SMD_LOOP1;
                       
SMD1:                MOV A,R6;//判断是否有剩下的位要发送,没有则跳转
                        JZ SMD2;
                       
                        MOV R4,A;//发送剩下的位
                        MOV A,@R0;
                        LCALL send_byte;
                       
SMD2:                SETB MB1511_LE;//产生锁定上跳变       
                        NOP
                        NOP
                        NOP
                        NOP
                        CLR        MB1511_LE;
                        RET;
;**********************************
;串行发送一字节数据 可以少与一字节
;从高位开始发送
;R4 要发送多少位
;A 要发送的数据
;**********************************
send_byte:
                        CLR C
SB_LOOP1:       
                        RLC A; 右移数据
                        MOV MB1511_DATA,C;
                        NOP
                        NOP
                        NOP
                        NOP
                        SETB MB1511_CLOCK;时钟引脚产生上跳变
                        NOP
                        NOP
                        NOP
                        NOP
                        CLR MB1511_CLOCK;

                        DJNZ R4,SB_LOOP1;判断数据是否发送完成,不完成则跳到SB_LOOP1处发送下一位
                        RET;
                       
                       

;单字节无符号除法程序 (R2R3R4/R7)=(R2)R3R4 余数R7
;入口: R2,R3,R4,R7
;占用资源: ACC,B,F0
;堆栈需求: 3字节
;出口: (R2),R3,R4,R7,OV
NDIV31 :     MOV A,R2
             MOV B,R7
             DIV AB
             PUSH ACC;
             MOV R2,B
             MOV B,#10H
NDV311 :     CLR C
             MOV A,R4
             RLC A
             MOV R4,A
             MOV A,R3
             RLC A
             MOV R3,A
             MOV A,R2
             RLC A
             MOV R2,A
             MOV F0,C
             CLR C
             SUBB A,R7
             JB F0,NDV312
             JC NDV313

NDV312 :     MOV R2,A
             INC R4
NDV313 :     DJNZ B,NDV311
             POP ACC;
             CLR OV
             JZ NDV314
             SETB OV
NDV314 :     XCH A,R2
             MOV R7,A
             RET

;单字节无符号数乘法程序 (R3R4*R7)=(R2R3R4)
;入口: R3,R4,R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R2,R3,R4
NMUL21 :   MOV A,R4
           MOV B,R7
           MUL AB
           MOV R4,A
           MOV A,B
           XCH A,R3
           MOV B,R7
           MUL AB
           ADD A,R3
           MOV R3,A
           CLR A
           ADDC A,B
           MOV R2,A
           CLR OV
           RET


;双字节无符号数减法程序 (R3R4-R6R7)=(R3R4)
;入口: R3,R4,R6,R7
;占用资源: ACC
;堆栈需求: 2字节
;出口: R3,R4
NSUB :   MOV A,R4
         CLR C
         SUBB A,R7
         MOV R4,A
         MOV A,R3
         SUBB A,R6
         MOV R3,A
         RET

;三字节无符号数减法程序 (R2R3R4-R5R6R7)=(R2R3R4)
;入口: R2,R3,R4,R5,R6,R7
;占用资源: ACC
;堆栈需求: 2字节
;出口: R2,R3,R4
NSUB3 :  MOV A,R4
         CLR C
         SUBB A,R7
         MOV R4,A
         MOV A,R3
         SUBB A,R6
         MOV R3,A
         MOV A,R2
         SUBB A,R5
         MOV R2,A
         RET

END

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-9-6 12:39:00 | 显示全部楼层
经朋友指点找到解决办法了;
全是三字节,双字节单字节  ÷× -  百度找算法子程序。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 18:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表