本文收集整理关于十六进制数转换成ascii码的相关议题,使用内容导航快速到达。
内容导航:
Q1:一个十六进制数转换成ASCII码的单片机程序
HASC:MOVA,R0;从R0中取一个16进制(二进制)数(0-F)
ANLA,#0FH;屏蔽掉高4位
PUSHACC;4位二进制数入栈
CLRC;清进(借)位位
SUBBA,#0AH
POPACC
JCLOOP
ADDA,#07H
LOOP:ADDA,#30H
MOVR2,A
RET
实验结果:R0中的十六进制数(比如A),转换为ASCII码(41H)送入R2中。刚才回答了,没有了吗?
Q2:如何用汇编语言把十六进制数1A5F转换成ascii码并显示在屏幕上
刚好我写了一个,调试都通过可以执行的,。
.386、.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
szCaption db convert num to srting,0
szResult db 6 dup(0)
.code
_Translate proc para1:DWORD,para2:DWORD ;定义子函数,para1变量用来放传入的数组,para2用于放编程ASIC后的字符数组 LOCAL _iNum;定义零时变量,用于放被除数
LOCAL _iTemp;定义零时变量,用于存放除数
LOCAL _szTemp[265]:BYTE
mov eax,para1;;获取参数para1的值eax寄存器
mov _iNum,eax;将eax中的值放入零时变量_iNum
mov _iTemp,10H
lea ebx,_szTemp
xor ecx,ecx
.while _iNum;当被除数不为0时,就一直循环
xor edx,edx
mov eax,_iNum ;将被除数放入eax寄存器中
div _iTemp ;寄存器eax中的值除以_iTemp,商放入eax中,余数放入dl中
mov _iNum,eax
.if dl>9H ;当余数大于9时,就转化为相对应的英文字母的ASIC的值
add dl,37H
.else
add dl,30H
.endif
mov byte ptr [ebx],dl;把变化后的值放入ebx寄存器中
inc ebx
inc ecx
.endw
mov eax,para2 ;将参数para2的地址传给eax寄存器,再讲ecx中的值倒序存入eax寄存器中
mov byte ptr [eax+ecx],0
lea ebx,_szTemp
.repeat
mov dl,byte ptr [ebx]
mov byte ptr [eax+ecx-1],dl
inc ebx
.untilcxz ;一直循环,直到cx的值=0,每次循环后ecx的值-1、
ret
_Translate endp
start:
mov eax,1A5FH ;修改这里的数,就能把任意16进制的数转化为ASIC码了
invoke _Translate,eax,offset szResult
invoke MessageBox,NULL,offset szResult,offset szCaption,MB_OK
invoke ExitProcess,0
end start
Q3:51单片机 十六进制数与ASCII码间的转换求详解
这程序的功能就是把一字节十六进制数的低4位转换为一个ASCII码。例如0x0E转换为E、0x08转换为8。
我估计你就是对内码不太熟悉吧。
你翻一下ASCII码的内码表,再对照这程序看看,应该就能明白了。
很好懂的。
Q4:怎么用单片机编写一段程序将若干十六进制数转换为ASCII码?
不知你要的是C语言的还是汇编的,都给你吧
C语言的:
#include
typedef unsigned char uchar;
#define NUMBER10、
uchar BufferIn[NUMBER]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x1a,0x1b};//16进制数存放区
uchar BufferOut[2*NUMBER]; //ASCII码存放区
////////////////////////////////////////////////////////////////
//功能:将多字节16进制数转换为ASCII字符
//入口:x:待转换16进制数,x>=0且x<=F
//出口:返回转换完成后的ASCII码字符数据,返回0为失败
////////////////////////////////////////////////////////////////
uchar GetASCII(uchar x)
{
if(x>0x0f)
{
return 0;
} if(x>9)
{
return (A+x-10);
}
return (0+x);
}
////////////////////////////////////////////////////////////////
//主程序
////////////////////////////////////////////////////////////////
void main()
{
uchar i;
for(i=0;i
BufferOut[i*2] = GetASCII(BufferIn[i]/0x10);
BufferOut[i*2+1] = GetASCII(BufferIn[i]%0x10);
}
while(1);
}
汇编的:
;说明:LOOP1循环为预设10个16进制数内容的初始化程序,作为示例
ORG0000H
LJMPSTART
ORG0100H
START:MOVR2,#10;预置10个16进制数
MOVR0,#20H;16进制数存放起始地址
MOVA,#12H
LOOP1:MOV@R0,A
ADDA,#13H
INCR0
DJNZR2,LOOP1;循环10次送10个数
;以上至START为初始化内存,预送10个字节的数据
MOVR0,#20H;16进制数存放起始地址
MOVR1,#30H;ASCII数存放起始地址
MOVR2,#10;转换10个字节
LCALLHEXTOASC;调用转换子程序
JMP$
;=======================================================
;HEXTOASC:将多字节16进制数转换为ASCII字符子程序
;入口:(R0)=16进制数存放起始地址指针
;(R2)=字节数
;出口:(R1)=转换完成后的ASC字符存放起始地址指针
;算法说明:0~9:(ASCII码为30H~39H)+90H后调整后无变化,结果
;为9xH,再加40H为0DxH,调整操作+60H后正好为3xH;
;A~F:(ASCII为41H~46H),+90H后为9xH,调整操作+06H后
;为01H~06H,再加40H调整后不变,正好为41H~46H;
;=======================================================
HEXTOASC:
MOVA,@R0
SWAPA
ANLA,#0FH;处理高4位
ADDA,#90H
DAA
ADDCA,#40H
DAA
MOV@R1,A;保存高4位
INCR1、MOVA,@R0
ANLA,#0FH;处理低4位
ADDA,#90H
DAA
ADDCA,#40H
DAA
MOV@R1,A;保存低4位
INCR1;下一个16进制数
INCR0
DJNZR2,HEXTOASC
RET
END