C程序理解 字节转十进制字符串格式 51单片机I2C与E2PROM
#include<reg52.h>
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);
extern void I2CStart();
extern void I2CStop();
extern unsigned char I2CReadNAK();
extern bit I2CWrite(unsigned char dat);
unsigned char E2ReadByte(unsigned char addr);
void E2WriteByte(unsigned char addr,unsigned char dat);
void main()
{
unsigned char dat;
unsigned char str[10];
InitLcd1602();
dat = E2ReadByte(0x02); //读取E2PROM上指定地址中的一个字节
str[0] = (dat/100)+'0'; //***转换为十进制字符串格式(?如何转换的)
str[1] = (dat/10%10)+'0';
str[2] = (dat%10)+'0';
str[3] = '\0';
LcdShowStr(0,0,str); //显示在液晶上
dat++; //将其值加1
E2WriteByte(0x02,dat); //再写回到原地址中
while(1);
}
//读取E2PROM中的一个字节,addr为字节地址
unsigned char E2ReadByte(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CWrite(0x50<<1);
I2CWrite(addr);
I2CStart();
I2CWrite((0x50<<1)|0x01);
dat = I2CReadNAK;
I2CStop();
return dat;
}
//向E2PROM中写入一个字节,addr为字节地址
void E2WriteByte(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CWrite(0x50<<1); //寻址器件,后续为写操作
I2CWrite(addr); //写入存储地址
I2CWrite(dat); //写入一个字节数据
I2CStop();
}
首先说一下,这不是转为字符串了,是转为数组中的一个一个字符,然后显示的时候,从str[0] 开始显示,连续显示的话,就觉得是个整体的字符串显示。字符是用单引号,比如'a',这是个字符;字符串是双引号,比如"a",这是个字符串。
下面我试试添加注释讨论下。
unsigned char dat; //定义了一个无符号字符变量,用于保存从E2PROM里读出的数据。
unsigned char str[10]; //字符数组str
InitLcd1602();
dat = E2ReadByte(0x02); //读取结果,是个16进制数据,比如0x98,十进制是152
str[0] = (dat/100)+'0'; //用152除以100,取百位数1。转为字符就是‘1’,在ASCII码里是49,而'0'的ASCII码是
48,所以直接用1+‘0’,就能将数字1转为字符‘1’,这个是C语言标准和ASCII码表定义 编译器按照ASCII字符码值就直接给转换了。
str[1] = (dat/10%10)+'0'; //同理,这个是为了将十位数转为字符;先152/10得到15,再取余,得到5,然后转字符
关于除法、取余,这是C语言的知识,想必小编了然于胸
str[2] = (dat%10)+'0'; //个位数转字符
str[3] = '\0'; //添加结束字符,表明后面没内容。这样,在显示的时候,碰到这个结束字符就停止继续读取数组
dat = E2ReadByte(0x02); //读取E2PROM上指定地址中的一个字节
//dat是一个十六进制数
str[0] = (dat/100)+'0'; //***转换为十进制字符串格式(?如何转换的)
//(dat/100)是取出dat百位的数值,1个字节最多表示十进制数255,所以最多只有百位数;
//虽然dat是十六进制数,但是C语言会强制转换的,与一个十进制数做运算,会强制转换的;
//取出百位的数值之后,只是一个整形数值,并不是一个字符,所以你需要转成字符。'0'在ASCII码中表示0这个字符,百位数为相对于字符‘0‘的偏移,就是得到百位数值在ASCII码表中的字符
str[1] = (dat/10%10)+'0';
//同理取出十位的数后转成字符
str[2] = (dat%10)+'0';
//同理取出个位的数后转成字符
str[3] = '\0';
//结束终止符
好不容易输入完,回帖后竟然是这么个格式,尴尬。
解释的很好,好像ASCII码引用有误,‘1’在ASCII码里是31,‘I’在ASCII码里才是49。
哦,对,记错了。谢谢提醒。