试用单片机编写一段程序将若干十六进制数转换为ASCII码

2024-12-14 17:47:48
推荐回答(1个)
回答1:

不知你要的是C语言的还是汇编的,都给你吧

C语言的:
#include

typedef unsigned char uchar;

#define NUMBER 10

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进制数内容的初始化程序,作为示例
ORG 0000H
LJMP START
ORG 0100H
START: MOV R2, #10 ;预置10个16进制数
MOV R0, #20H ;16进制数存放起始地址
MOV A, #12H
LOOP1: MOV @R0, A
ADD A, #13H
INC R0
DJNZ R2,LOOP1 ;循环10次送10个数
;以上至START为初始化内存,预送10个字节的数据

MOV R0, #20H ;16进制数存放起始地址
MOV R1, #30H ;ASCII数存放起始地址
MOV R2, #10 ;转换10个字节
LCALL HEXTOASC ;调用转换子程序
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:
MOV A, @R0
SWAP A
ANL A, #0FH ;处理高4位
ADD A, #90H
DA A
ADDC A, #40H
DA A
MOV @R1, A ;保存高4位
INC R1
MOV A, @R0
ANL A, #0FH ;处理低4位
ADD A, #90H
DA A
ADDC A, #40H
DA A
MOV @R1, A ;保存低4位
INC R1 ;下一个16进制数
INC R0
DJNZ R2, HEXTOASC
RET

END