微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > C程序理解 字节转十进制字符串格式 51单片机I2C与E2PROM

C程序理解 字节转十进制字符串格式 51单片机I2C与E2PROM

时间:10-02 整理:3721RD 点击:
各位大神帮帮忙,,,下面是E2PROM单字节读写操作,主要想问下C语言相关知识,单个字节是如何转十进制字符串格式的(就是main函数里面加问好注释的那里)?例程看不懂,网上搜索了也是一知半解,谁能帮忙解释一下吗,,,小白入门 望指教

#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。

哦,对,记错了。谢谢提醒。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top