char a = 0x65; 用putchar打印出“65”

袁保康 2013-05-16 11:01:42

char a = 0x65; 用putchar打印出“65”

条件有限,只能用putchar怎么做呢?大侠支招!


如果putchar(a)出来的是e。

还有如果要进行转换,麻烦不要使用库函数,目前不能使用库函数。谢谢。
...全文
775 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
袁保康 2013-05-30
  • 打赏
  • 举报
回复
引用 2 楼 zjq9931 的回复:
printf至少是可以用的吧? printf("%x", a); 就可以了。 如果这个都不能用。就只能计算了。

#include<stdio.h>
int main()
{
	char a=0x65;
	char cTmp;

	putchar(a);
	//方法一printf
	printf("\n%x\n", a);

	//方法二,计算
	cTmp=a>>4;//右移4位,把高位放到低位
	if(cTmp<10)//如果是小于10的数
	{
		cTmp+='0';//以0-9输出
	}
	else
	{
		cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
	}
	putchar(cTmp);
	cTmp=a&0x0f;
	if(cTmp<10)
	{
		cTmp+='0';
	}
	else
	{
		cTmp+='A'-10;
	}
	putchar(cTmp);

	return 0;
}
当时暂时不做了,就没有继续验证,今天又遇到了,想到了这个帖子,试了一下,就是你的最有效,没有乱码,我也整理了一下:
int puthex(volatile char a)
{
    volatile char cTmp;
 
    //putchar(a);
    //方法一printf
    //printf("\n%x\n", a);
 
    //方法二,计算
    cTmp=a>>4;//右移4位,把高位放到低位
    if(cTmp<10)//如果是小于10的数
    {
        cTmp+='0';//以0-9输出
    }
    else
    {
        cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
    }
    putc(cTmp);
    cTmp=a&0x0f;
    if(cTmp<10)
    {
        cTmp+='0';
    }
    else
    {
        cTmp+='A'-10;
    }
    putc(cTmp);
 
    return 0;
}
袁保康 2013-05-16
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
[quote=引用 3 楼 kangear 的回复:] [quote=引用 2 楼 zjq9931 的回复:] printf至少是可以用的吧? printf("%x", a); 就可以了。 如果这个都不能用。就只能计算了。

#include<stdio.h>
int main()
{
	char a=0x65;
	char cTmp;

	putchar(a);
	//方法一printf
	printf("\n%x\n", a);

	//方法二,计算
	cTmp=a>>4;//右移4位,把高位放到低位
	if(cTmp<10)//如果是小于10的数
	{
		cTmp+='0';//以0-9输出
	}
	else
	{
		cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
	}
	putchar(cTmp);
	cTmp=a&0x0f;
	if(cTmp<10)
	{
		cTmp+='0';
	}
	else
	{
		cTmp+='A'-10;
	}
	putchar(cTmp);

	return 0;
}
谢谢呀,不过1楼的要简单一点了。[/quote] 1楼的可是有BUG的哈。 如果是别的编码可能会有问题的。 [/quote] 是吗?我仔细试试,多谢提醒啊。
  • 打赏
  • 举报
回复
引用 3 楼 kangear 的回复:
[quote=引用 2 楼 zjq9931 的回复:] printf至少是可以用的吧? printf("%x", a); 就可以了。 如果这个都不能用。就只能计算了。

#include<stdio.h>
int main()
{
	char a=0x65;
	char cTmp;

	putchar(a);
	//方法一printf
	printf("\n%x\n", a);

	//方法二,计算
	cTmp=a>>4;//右移4位,把高位放到低位
	if(cTmp<10)//如果是小于10的数
	{
		cTmp+='0';//以0-9输出
	}
	else
	{
		cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
	}
	putchar(cTmp);
	cTmp=a&0x0f;
	if(cTmp<10)
	{
		cTmp+='0';
	}
	else
	{
		cTmp+='A'-10;
	}
	putchar(cTmp);

	return 0;
}
谢谢呀,不过1楼的要简单一点了。[/quote] 1楼的可是有BUG的哈。 如果是别的编码可能会有问题的。
袁保康 2013-05-16
  • 打赏
  • 举报
回复
引用 2 楼 zjq9931 的回复:
printf至少是可以用的吧? printf("%x", a); 就可以了。 如果这个都不能用。就只能计算了。

#include<stdio.h>
int main()
{
	char a=0x65;
	char cTmp;

	putchar(a);
	//方法一printf
	printf("\n%x\n", a);

	//方法二,计算
	cTmp=a>>4;//右移4位,把高位放到低位
	if(cTmp<10)//如果是小于10的数
	{
		cTmp+='0';//以0-9输出
	}
	else
	{
		cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
	}
	putchar(cTmp);
	cTmp=a&0x0f;
	if(cTmp<10)
	{
		cTmp+='0';
	}
	else
	{
		cTmp+='A'-10;
	}
	putchar(cTmp);

	return 0;
}
谢谢呀,不过1楼的要简单一点了。
  • 打赏
  • 举报
回复
printf至少是可以用的吧? printf("%x", a); 就可以了。 如果这个都不能用。就只能计算了。

#include<stdio.h>
int main()
{
	char a=0x65;
	char cTmp;

	putchar(a);
	//方法一printf
	printf("\n%x\n", a);

	//方法二,计算
	cTmp=a>>4;//右移4位,把高位放到低位
	if(cTmp<10)//如果是小于10的数
	{
		cTmp+='0';//以0-9输出
	}
	else
	{
		cTmp+='A'-10;  //大于等于10的就是ABCDEF了。
	}
	putchar(cTmp);
	cTmp=a&0x0f;
	if(cTmp<10)
	{
		cTmp+='0';
	}
	else
	{
		cTmp+='A'-10;
	}
	putchar(cTmp);

	return 0;
}
starytx 2013-05-16
  • 打赏
  • 举报
回复
    char a = 0x65;
    putchar(a/16 + '0');
    putchar(a%16 + '0');
#include //器件库 #include //延时函数库 #include //标准I/O函数库 #include //标准函数库 unsigned char m0,m1,m2; unsigned char s,s1; // 单片机定时器0溢中断服务程序段 // 产生伺服电机动作所需要的脉宽 interrupt [TIM0_OVF] void timer0_ovf_isr(void) { TCNT0=0xBA; if(s出中断服务程序段 // 产生0.5ms的开始脉宽和5ms以上的间隔脉宽 interrupt [TIM1_OVF] void timer1_ovf_isr(void) { #asm("wdr"); //喂狗 TCNT1H=0xff; TCNT1L=0x59; s1++; if(s170) { TCCR1B=0x00;TCCR0=0x01;s1=0;TCNT0=0xBA;} } } void main(void) { unsigned char i,j,count=0; unsigned char c[3]; unsigned int k; // 设置A口为输状态,并且初始值为低电平 PORTA=0x00; DDRA=0xFF; // 设置B、C、D、E口为高阻输入状态,在该程序中不使用 PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; PORTE=0x00; DDRE=0x00; //设置定时器0的时钟来源为系统晶体 //设置计数周期为8000KHZ,清空计数寄存器 TCCR0=0x00; TCNT0=0x00; OCR0=0x00; //设置定时器1的时钟来源为系统晶体 //设置计数周期为1000KHZ,清空计数寄存器 TCCR1A=0x00; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; //使能定时器 TIMSK=0x82; // 串口模数据:8个数据位,1个停止位,无奇偶效验 // 串口使能:发送、接收 // 串口模式:异步 // 串口速率:9600 UCSRA=0x02; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x34; //设置模拟比较器 ACSR=0x80; //使能看门狗,设置喂狗周期为 时钟/2048 WDTCR=0x1F; WDTCR=0x0F; // 打开总中断 #asm("sei") delay_ms(500); putchar(0x0d); putchar(0x0a); putsf("***********************************\r"); putsf("* 3路舵机驱动小程序 *\r"); putsf("* 顺德职业技术学院 机电工程系 *\r"); putsf("* 罗建章 *\r"); putsf("***********************************\r"); while (1) { count=0; putsf("输入舵机编号(1~3):"); putchar(0x0d); n1:i=getchar(); if((i
程序名称: 飞思卡尔智能车舵机调试工具 v1.1 程序作者: LinX 时 间: 2009-03-07 联系方式: Q Q : 408111919 Email: linhaiwz@163.com" & vbCrLf & vbCrLf & _ 〖 本程序为方便舵机调试而编写,错误在所难免,如有建议欢迎和我联系! 〗 角度转换为高电平时间 角度 -45 0 45 (anger/度) 高电平时间 1000 1500 2000 (t/us) 计算公式为:T = 1000 + (anger + 45) * (1000 / 90) 该程序可以通过串口与单片机进行通讯,实时改变舵机的角度。 通讯协议为:0xfe 0xMM 0xNN (其中0xfe为包头,0xMM为PWMDTYx高8位,0xN为PWMDTYx低8位) 在串口中断中分三次接收,在第二次接收时保存数据到temp0中,在第三次接收到数据时将PWMDTY01= ((unsigned int)temp0 <<8) | RxData 就可以完成PWM改变输了。 下位机程序如下: #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12xs128" unsigned char RX=0,temp0; void uart_putchar(unsigned char ch) { if (ch == '\n') { while(!(SCI0SR1&0x80)) ; SCI0DRL= 0x0d; return; } while(!(SCI0SR1&0x80)) ; SCI0DRL=ch; } static void PWM_Init(void) { //SB,B for ch2367 //SA,A for ch0145 PWMCTL_CON01=1; //0和1联合成16位PWM; PWMCAE_CAE1=0; //选择输模式为左对齐输模式 PWMCNT01 = 0; //计数器清零; PWMPOL_PPOL1=1; //先输高电平,计数到DTY时,反转电平 PWMPRCLK = 0X40; //clockA不分频,clockA=busclock=16MHz;CLK B 16分频:1Mhz PWMSCLA = 8; //对clock SA 进行2*8=16分频;pwm clock=clockA/16=1MHz; PWMCLK_PCLK1 = 1; //选择clock SA做时钟源 PWMPER01 = 20000; //周期20ms; 50Hz;(可以使用的范围:50-200hz) PWMDTY01 = 1500; //高电平时间为1.5ms; PWME_PWME1 = 1; } void setbusclock(void) //PLL setting { CLKSEL=0X00; //disengage PLL to system PLLCTL_PLLON=1; //turn on PLL SYNR=1; REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz; _asm(nop); //BUS CLOCK=16M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system; } static void SCI_Init(void) //SCI { SCI0CR1=0x00; SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1a SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL) //busclk 16MHz, 9600bps,SCI0BDL=0x68 } interrupt 20 void SCI_Rx_IRS(void) //中断接收 { unsigned char RxData; DisableInterrupts; if (SCI0SR1&0x20) { RxData = SCI0DRL; switch(RX) { case 0: if (RxData==0xfe) RX=1; break; case 1: temp0 = RxData; RX=2; break; case 2: PWMDTY01= ((unsigned int)temp0 <<8) | RxData; PORTB=~PORTB; RX=0; break; } uart_putchar(RxData); } EnableInterrupts; } void main(void) { EnableInterrupts; setbusclock(); SCI_Init(); PWM_Init(); DDRB=0xff; for(;;) { } }
ATMEGA8 18路沙盘控制程序 void uart_init(void) //串口0初始化 {UCSR0B=0x00; //disable while setting baud rate UCSR0A=0B00000000; //Bit1为1则倍速发送 U2X=0 UCSR0C=0x06; //B00000110 //奇偶模式无,八位数据位,一位停止位 UBRR0L=71; //B00011001波特率:4800 Bps UBRR0H=0x00; //误差率:0.156% UCSR0B=0x98; recstate = recStart; } void putchar(unsigned char c) //串口0发送字符 { while(!(UCSR0A&(1<< UDRE0))); //while(!(UCSR0A&32;)); 在此如何理解? UDR0=c; } void putstr(unsigned char *s) //串口0发送字符串 { while(*s) { putchar(*s); s++; } } #pragma interrupt_handler Uartms_Rx_Interrupt:iv_USART0_RX /*-------------------------------------------------- 功能:短信接收中断服务 入口:无 口:无 --------------------------------------------------*/ void Uartms_Rx_Interrupt(void) { unsigned char rxdat; static crctemp,conter = 0; rxdat=UDR0; switch(recstate) { case recStart: if(rxdat == 0xaa) { recstate = recLong; crctemp = 0; } break; case recLong: COMMURcv.inflong = rxdat; recstate = recCMD; break; case recCMD: COMMURcv.infCMD = rxdat; recstate = recData; break; case recData: if(rxdat == 0xaa) { COMMURcv.recOK = TRUE; recstate = recStart; } recstate = recStart; break; default : break; } } bool sendchar(unsigned char sendchar) { unsigned char temp; temp = sendchar>>4; if(temp<10) { UartmsSnd.buff[0] = temp+'0'; } else { UartmsSnd.buff[0] = temp+'A'-10; } temp = sendchar&0x0f; if(temp<10) { UartmsSnd.buff[1] = temp+'0'; } else { UartmsSnd.buff[1] = temp+'A'-10; } UartmsSnd.buff[2] = ' '; UartmsSnd.buff[3] = 0; putstr(UartmsSnd.buff); return TRUE; } bool sendchar_enter(unsigned char sendchar) { unsigned char temp; unsigned char uart_buf[16]; temp = sendchar/0x10; if(temp<10) { uart_buf[0] = temp+'0'; } else { uart_buf[0] = temp+'A'-10; } temp = sendchar%0x10; if(temp<10) { uart_buf[1] = temp+'0'; } else { uart_buf[1] = temp+'A'-10; } uart_buf[2] = '\n'; uart_buf[3] = '\r'; uart_buf[4] = 0; putstr(uart_buf); return TRUE; }

69,472

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧