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

作者&投稿:威复 (若有异议请与网页底部的电邮联系)
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中了


向您请教,总是写不好自己的名字,希望能够帮忙设计一个。 臧立峰 ,十 ...
★ 签名对于我们大家来说并不陌生。将自己的名字写得工整、美观和别致,可以说是大部分人的普遍心理和书写标准。只要你留意,生活中你会处处感到有签名的存在,几乎每天都可以见到与自己的切身利益相联系的签名。在鉴定法律行为和商业活动的真实性和有效性上,签名有着权威性的作用。�在高科技...

...弹出自定义的对话框 最好能帮忙写一下代码 非常感谢
Private Sub XXXX_Click()'此处为你主餐单上的录入房源按钮的名称 XXXXX.Show‘此处为你需要显示的房源录入那一个窗体 XXXXX.Show vbModal ’若只需显示后来的窗体将主窗体变灰,两者选其一 End Sub

紧急求救:编写一个英语对话(最好4人的,长达3~5分钟的,这几天要的)英语...
不对不对,我有个朋友,我刚认识她时,我不知道她不吃肉。一开始我想哪有人不吃肉的,那么好好吃。但是现在随着我们彼此深入了解,才发现每个人的习惯是不一样的。D: Oh my deat friends, there are lots of people and they have all different charactors.Sometime we can know more about them...

C语言编写一个电话簿管理系统!自己写了点,全是错,求大神帮忙改改,最好...
1. 四个点不相互重合 2. 四个点组成的四边形有一个角为直角 3. 其中有一个角为直角 \/ int t,i;int s01, s12, s23, s30;point_t points[4] = {0};scanf("%d", &t);while(t --){ for (i=0;i<4;i++){ scanf("%d %d", &points[i].x, &points[i].y);} if (the...

【雪剑学霸好帅气】写一首藏头诗!!!可否帮忙??谢谢!!
下载一个专门制作藏头诗的软件

易语言安装包怎么写有源码发个 最好帮忙写个
写出一个完整的安装包是复杂的,包括:你在易语言上编写一个安装包\/卸载包界面 它里边已经有写解压命令 生成安装信息到注册表 完成后生成卸载程序 对常规配置进行编写后写入到带模板exe,(这些配置有:添加欲压缩的文件\/文件夹,版权信息,同意条款界面,安装密码,以及安装之后要执行的程序\/文件配置,生成...

c语言程序编写 有一个已排好序的数组,由键盘又输入一个数,要求按原来排...
include<stdio.h> int main(){ int a[40]={1,0},i,j,n,x;printf("请输入数组元素的个数:");scanf("%d",&n);printf("请输入排好序的一串数字:\\n");for(i=0;i<n;i++)scanf("%d",&a);printf("请输入要插入的数:");scanf("%d",&x);if(a[0]<a[1])\/\/该数组按升序...

本人自学c语言,现编写一软件运行时候出错了,请大神帮帮忙给看看什么原因...
printf("string a is%s\\nstring b is %s\\n",*p1,*p2);错了 应该是printf("string a is%s\\nstring b is %s\\n",p1,p2);p1=a[0];p2=b[0];也错了,尚未分配空间,就不能给其赋值;可改为 p1=a;p2=b;

请帮忙编写股票选股公式,要求是:三日内涨停过一次的股票,今日开盘价在...
t1:=c>=ref(c,1)*1.095 and c>=h;count(t1,3) and o<=ref(c,1)*0.98 and o>=ref(c,1)*0.96;本公式大智慧和通达信通用!

编写程序,最好是VB,帮帮忙呀,谢谢啦
Private Sub Command1_Click()If Text1.Text = "" Then Text1.Text = Mid(Text3.Text, 1) * Mid(Text4.Text, 1) * Mid(Text5.Text, 1) \/ Mid(Text2.Text, 1)ElseIf Text2.Text = "" Then Text2.Text = Mid(Text3.Text, 1) * Mid(Text4.Text, 1) * Mid(Text5.Text, ...

田阳县15552724901: 求写一个51单片机C语言程序,不复杂的,在线求助!!!感谢您八辈祖宗!!内有详细说明 -
王冯威凡: 程序简单,吃完饭饭看有时间没#include code unsigned char temp[] = {0xC0, 0xF9, 0xA4 , 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; unsigned int num; unsigned char table[4]; void main() { TMOD = 0X01; TH0 = 0XFC; TL0 = 0X18; EA = 1; TR0 = ...

田阳县15552724901: 有没有人会写一个基于51单片机的程序啊 -
王冯威凡: 你好,很高兴回答你的问题.根据你的描述,你的问题对于学单片机或嵌入式的人来说,算是一个很基础的问题.我这边提供一个程序的思路,具体程序我就不贴了:1、普通直流电机的调速(我相信你应该是用普通有刷直流电机)原理就是给其...

田阳县15552724901: 帮忙用C语言写一段51单片机的程序,晶振12M. -
王冯威凡: #include <reg52.h>/* 本程序功能,输出方波,频率1-25ms 单片机@12MHz /12T*/ sbit Pulse=P1^1; //---方波 sbit Add=P3^2; //---频率加 sbit Dec=P3^3; //---频率减 sbit Start = P1^3; //---开关键 sbit Display_Ten_Bit = P2^0; sbit Display_Bit_Bit...

田阳县15552724901: 请大神们帮我编个简单的AT89C51单片机的c语言程序 -
王冯威凡: #include "reg51.h" void main(void) {P1=P1 | 0X40;//P1.6=1P1=P1 & 0X7F;//P1.7=0P0=P0 | 0X07;//P0.0=1,P0.1=1,P0.2=1while(1){if((P1 & 0X40)==0)//P1.6=0{P0=P0 & 0XF8;//P0.0=0,P0.1=0,P0.2=0}if((P1 & 0X80)>0)//P1.7=1{PCON=PCON | 2;//睡眠}} }

田阳县15552724901: 帮忙编写一个51单片机的程序 -
王冯威凡: 注明:程序应该仿真通过了,只是你说的是低电平动作,那样你从高电平到低电平的瞬间,马上再打到高电平,不然很快1S过去,又会检测到低电平.ORG 0000H SJMP MAIN ORG 000BH SJMP T0_PRO ORG 001BH SJMP T1_PRO MAIN: ...

田阳县15552724901: 求写一段简单的51单片机C语言代码 -
王冯威凡: 单片机检测高电平.1、可以用外部中断,外接激光传感器最好用普通光耦隔离一下,顺便改成低电平触发单片机中断.然后用位移指令移动跑马灯,然后计数值加1. 2、可以用循环检测,也建议用光耦隔离先,在MAIN里面不断检测P00,发现变化后,再次检测以便确认,确认后同样位移一下跑马灯,然后计数加1.

田阳县15552724901: 帮忙写个51单片机的c程序!两相四线混合式步进电机,正反转功能能实现,但是细分的部分需要求助! -
王冯威凡: #include void delay(){int x,y; for(x=0;x<40;x++) for(y=0;y<10;y++);}main(){while(1) {P...

田阳县15552724901: 用汇编语言编写一个51单片机的程序 -
王冯威凡: 首先搞清LED管是高电平导通还是低电平导通. 如果是低电平导通,P1赋0x00时,发光管全亮,0xff时,全灭. 具体程序: #define uint unsigned int #define uchar unsigned char void delay(uint time_out) {uint i,j;for(i=0;i<time_out;i++){for(j=0;...

田阳县15552724901: 51单片机程序编写 -
王冯威凡: 第一要解决测速的问题,这个可以利用霍尔元件和磁铁来实现,磁铁固定在电机上,电机每转一圈霍尔元件就能检测一个信号,利用单片机的计数器进行技计算.并把计数的值赋给一个变量NUM,然后利用定时设定一分钟的时间来判断NUM的值是否大于3000或4000,如果成立就执行相应的报警.至于温度可以用18B20因为温度在120度之内,18B20就可以.原理虽然简单但是敲代码还是一件非常枯燥的事情还是自己来完成吧,希望对你有帮助!

田阳县15552724901: 求高手帮忙编一个51单片机的程序,1: P1.0=1,P1.1=0时P1.2=1,P1.3=0;P1.0=0,P1.1=1时P1.2=0,P1.3=1 -
王冯威凡: 想你这样简单的逻辑关系.可以采用 与 或 门就能搭出来了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网