你好,可否帮忙编写一个51单片机的汇编程序。将一个双字节的16进制数转换为十进制,转换后的数只保留万千

供稿:hz-xin.com     日期:2025-01-13
51单片机中如何将2字节16位数转换为BCD码,汇编程序最好

(17) 标号: HB2功能:双字节十六进制整数转换成双字节BCD码整数

入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节

HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET

这个程序是正确的。
程序循环了16次。
把 M_byte,L_byte,左移了16次,最高位,依次移进了Cy;
用 ADDC 指令,把 RW1,RW2,左移了16次,并把Cy,加入到了最低位。
ADDC 指令后面,是十进制调整指令,所以,RW1,RW2 中的内容就是BCD码。

已知:R2 R3 R4 中是 BCD 码,其中R2中是万位,R3中是千、百位,R4中是十、个位。
结果:R2 R3 中是 BCD 码,其中R2中是万、千位,R3中是百位、十位。
子程序如下:

MOV A, R4 ;R4原有十、个位数
SWAP A
ANL A, #0FH ;截取十
MOV B, A ;保存一下
;
MOV A, R3 ;R3原有千、百位
SWAP A
MOV R3, A ;变成百、千位
ANL A, #0F0H ;截取百位
ADD A, B ;加上十位
XCH A, R3 ;R3中就是百位、十位
;
ANL A, #0FH ;截取千位
MOV B, A ;保存一下
MOV A, R3 ;原有万位
SWAP A
ADD A, B ;加上千位
MOV R2, A ;R2中就是万位、千位
RET

(17) 标号: HB2功能:双字节十六进制整数转换成双字节BCD码整数

入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节

HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET

调用这个你再加一下:
MOV A,R3
SWAP A
MOV R3,A; 把万位十进制数移到r3的高4位

MOV A,R4
ANL A,#0F0H
SWAP A
ORL A,R3
MOV R3,A ;把千位放到r3的低四位

MOV A,R4
ANL A,#00FH
SWAP A
MOV R4,A ;把百位移到R4的高4为

MOV A,R5
ANL A,#0F0H
SWAP A
ORL A,R4
MOV R4,A;把十位放到底4位,

这样就把结果保留在了r3,r4中了

求教一个51单片机程序。。(LCD电子时钟)
这一次老师要求做一个基于LCD显示的电子时钟。完全不知所云,所以希望能请教一下高手关于LCD时钟的事情。做一个LCD时钟需要些什么东西啊,具体步骤是怎么做的呢?现在手上有一块单片机... 这一次老师要求做一个基于LCD显示的电子时钟。完全不知所云,所以希望能请教一下高手关于LCD时钟的事情。做一个LCD时钟需要些...

求编程大佬帮忙编个循环指令程序 51系列单片机
ORG1000HADD1:MOVR2,#00HMOVR3,#00HMOVR0,#30HMOVR1,#nLOOP:MOVA,R3ADDA,@R0MOVR3,AMOVR3,AJNCNEXT;;把ADDC 换成了 判断 cy的值INCR2NEXT:INCR0DJNZR1,LOOPEND

如何编写89SDc51单片机控制电阻丝加热和制冷片制冷的程序?最好是PIDg...
编写89SDc51单片机控制电阻丝加热和制冷片制冷的程序,可采用PIDg算法或C语言实现。下面提供一个简化版的程序结构和关键步骤,供参考。初始化PID结构 c void PIDInit (struct PID *pp) { memset ( pp,0,sizeof(struct PID));} PID计算 c unsigned int PIDCalc( struct PID *pp, unsigned int ...

有没有51单片机高手啊,用C语言编一个程序
include<reg51.h> define uchar unsigned char;uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; \/\/0到f uchar number,dat=0,dat1=16,cnt=0;void t0isr() interrupt 1 { TH0=(65536-5000)\/256;TL0=(65536-...

如何编写一段程序,单片机是51系列的,要求编写8个LED灯有三种以上的闪烁...
MOV A,#11100111B MOV P1,A ACALL YANSHI MOV A,#11011011B MOV P1,A ACALL YANSHI MOV A,#10111101B MOV P1,A ACALL YANSHI MOV A,#01111110B MOV P1,A ACALL YANSHI DJNZ R4,D5 ACALL YANSHI MOV R0,#3 LOOP: MOV A,#01010101B MOV P1,A ACALL YANSHI MOV A,#10101010B ...

用C语言如何开51单片机的计数器,最好编个实例程序
include <reg51.h> define uchar unsigend uchar define uint unsigned int unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};\/\/数码管段码 void main(){ uint k;TMOD=0X50;\/\/...

用keil uvision4编一个51系列单片机流水灯,任务:流水灯要全亮,向左流 ...
include "reg51.h"define uchar unsigned char ucahr T[]={0xFF,0xFE,0xFC,0xF7,0xF0,0xE0,0xC0,0x80,0x00,0xFF};void delay05s(void){ unsigned char i,j,k;for(i=5;i>0;i--)for(j=200;j>0;j--)for(k=248;k>0;k--);} void liudong(){ ucahr i;for(i=0;i<8;...

Keil5如何创建一个新的51单片机项目
先双击打开keil软件 然后点击软件界面的菜单栏的Project,然后点击New uVision project 选择文件夹,然后输入项目名,然后保存,再然后选择MCU型号,一般对于51单片机,选择Atmel的8051就可以了,然后保存,如图,这时就已经基本创建好了,然后下一步 然后创建C文件,输入文件名,然后保存 然后把刚才的c文件...

求高手 用51单片机输出产生方波的程序
include"reg52.h"sbit PWM=P1^0;\/\/定义输出脚 void main(){ TMOD=0x01; \/\/定时器0工作方式1 TH0=(65536-10000)\/256; \/\/12M晶振10MS计时常数 TL0=(65536-10000)%256;EA=1; \/\/开总中断 ET0=1; \/\/开定时器0中断 TR0=1; \/\/启动定时器0 while(1);} \/\/中断函数,启动后每10MS...

51单片机汇编语言编写一个跑马灯的程序,初学者做实验用,具体要求如下...
程序1:ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SP,#5FH LOOP:MOV A,P2 MOV B,A MOV P0,A MOV P1,#0FFH LOOP1:LCALL DELAY MOV C,P1.7 MOV A,P0 RLC A MOV P0,A MOV A,P1 RLC A MOV P1,A MOV A,P2 CJNE A,B,LOOP SJMP LOOP1 DELAY:MOV R2,#60 DELAY1:MOV R3,#...