关于#流程图#注释#的问题,如何解决?(语言-c语言)

求下面这段代码的注释和流程图,尽可能的详细一些,实在是有些看不懂啊~(„ಡωಡ„)栓Q


#include <REG52.H>
#include <string.h> 
#include "lcd1602.h"
#include "delay.h"
#include "key_m.h"
#include "password.h"
#include "buzzer.h"
#include "RC522.h"
#include "eeprom.h"
#include "stepMoto.h"

#define PW_MODE_INPUT   1//ÊäÈëÃÜÂë¿ªËøÄ£Ê½
#define PW_MODE_REGIST    2//×¢²áÐÂÃÜÂëģʽ
#define IC_REGIST       3//IC×¢²á
#define IC_DELETE       4//ICɾ³ý

unsigned char IC_SN[3][4]={0};//´æ·ÅÓû§µÄIC¿¨ÐòÁкÅ


u8 openDoor=0;
u8 saveEEPROM=0;

void Dis_ICcode(u8* _IC);
u8 Search_IC(u8 *_IC);
void Save_IC(u8 _ID,u8 *_IC);
u8 Find_hole_InLib(void);
void Delelt_ID_inLib(u8 _ID);
unsigned char USRT_key;
void main(void)//Ö÷º¯ÊýÈë¿Ú
{
    u8 mode;
    u8 key;
    u8 i;
    u8 sta;
    u8 err=0;
    delay_Init();
    LCD_Init();
    PW_Init(); //¸´Î»³õʼÃÜÂë
    Beep(200);

Start:
    mode = PW_MODE_INPUT;
    LCD_Clear();
    LCD_GotoXY(0x00,0);
        LCD_Print("RFID PWord. Lock");
    LCD_GotoXY(0x00,1);
    LCD_Print("----------------");
    Motor1_Stop();
    while(1)//Ö÷Ñ­»·
    {
        delay_ms(1);
        key = KeyScan(0);
        if(key==0)
        {
            key = USRT_key;
            USRT_key = 0;
        }
        if(key)
        {
            Beep(200);
            if(key=='*')
            {
                mode = IC_REGIST;//IC¿¨×¢²á
                LCD_GotoXY(0x00,0);
                LCD_Print(" Regist IC code ");                        
            }
            else if(key=='#')
            {
                mode = IC_DELETE;//ICɾ³ý
                LCD_GotoXY(0x00,0);
                LCD_Print(" delete IC code ");                        
                
            }
            else if(mode==PW_MODE_INPUT)//ÊäÈëÃÜÂëģʽ
            {
                 switch (InputPassword(key))
                 {
                     case 0xFF://ÌØÈ¨ÃÜÂëÕýÈ·
                        err = 0;
                        mode=PW_MODE_REGIST;//½øÈë¼Èëģʽ
                        LCD_GotoXY(0x00,0);
                        LCD_Print(" Enter a new PW.");
                        LCD_GotoXY(0x00,1);
                        LCD_Print("----------------");
                        break;
                    case 0x0F://Óû§ÃÜÂë
                        openDoor=1;
                        err = 0;
                                               break;
                    case 0xEE://ÃÜÂë´íÎó                        
                        LCD_GotoXY(0x0,1);
                        LCD_Print(" PassWord error ");                        
                        Beep(200);Beep(200);Beep(200);
                        delay_ms(500);
                        err++;
                        goto Start;

                        break;
                    default:
                        break;
                }

            }
            else if(mode==PW_MODE_REGIST)//¼ÈëÃÜÂëģʽ
            {
                sta=SetPassword(key);
                LCD_GotoXY(0x00,0);
                if(sta)
                {
                    if(sta==0xF1)LCD_Print("Set PW.->[24C02]");
                    if(sta==0xF2)LCD_Print("Set PW.->[Flash]"); 
                    if((sta>>4)==0x0E)LCD_Print("*Set PW. Error* ");
                    Beep(200);
                    Beep(200);                
                    delay_ms(400);
                    mode = PW_MODE_INPUT;//»Øµ½ÊäÈëģʽ                   
                    goto Start;
                }                
            }
        }
        else if((mode==PW_MODE_INPUT)||(mode==IC_REGIST)||(mode==IC_DELETE))
        {        
            if(ReadICcode(buf)==0)
            {
                Dis_ICcode(buf);
                Beep(200);
                delay_ms(400);
                sta=Search_IC(buf);             
                if(mode==PW_MODE_INPUT)
                {          
                    if(sta==0xEE)//ÐÂIC¿¨
                    {
err++;
                        openDoor = 0;
                        LCD_GotoXY(0x0,1);
                        LCD_Print(" IC code error  ");
                        Beep(100);Beep(100);Beep(100);                    
                        delay_ms(1500);
                        goto Start;   
                    }
                    else
                    {
                         openDoor = 1;
                         err = 0;
                    }
                }
                if(mode==IC_REGIST)
                {
                    if(sta==0xEE)//ÐÂIC¿¨
                    {
                        sta = Find_hole_InLib();//ÔÚÊý¾Ý¿âÖÐÕÒµ½Ò»¸ö¿ÕλÖÃ
                        if(sta!=0xEE)
                        {
                            Save_IC(sta,buf); //´æÔÚÕâ¸ö¿ÕλÖÃÉÏ
                            saveEEPROM=1;
                            LCD_GotoXY(0x0,1);
                            LCD_Print("Add IC Code OK  ");                    
                            Beep(500);      
                        }
                        else
                        {
                            LCD_GotoXY(0x0,1);
                            LCD_Print("Library Is Full ");
                            Beep(200);Beep(200);Beep(200);                   
                        }
                    }
                    else
                    {
                        LCD_GotoXY(0x0,1);
                        LCD_Print("IC Already Store");
                        Beep(200);Beep(200);Beep(200);                    
                    }
                    delay_ms(500);
                    goto Start;
                }
                if(mode==IC_DELETE)
 {
                    if(sta==0xEE)//ÐÂIC¿¨
                    {                    
                        LCD_GotoXY(0x0,1);
                        LCD_Print("Delete Code ERR");                    
                        Beep(200);Beep(200);Beep(200);
                    }
                    else
                    {
                        sta=Search_IC(buf);
                        Delelt_ID_inLib(sta);
                        saveEEPROM=1;
                        LCD_GotoXY(0x0,1);
                        LCD_Print("Delete Code OK ");
                        Beep(500);
                        delay_ms(400);                    
                    }
                    delay_ms(500);
                    goto Start;        
                }
            } 
        }
        if(openDoor)
        {
            openDoor=0;
            LCD_GotoXY(0x0,1);
            LCD_Print("Opening the door");
            //Relay=0;
            buzzer = 0;
            Motor1_Go_F(DEG180);
            buzzer = 1;
            //Beep(2000);
            LCD_GotoXY(0x0,1);
            LCD_Print("  Door Is Open  ");            
            delay_ms(1000);
            delay_ms(1000);
            
            //Relay=1;
            LCD_GotoXY(0x0,1);
            LCD_Print("Closing the door");            
            buzzer = 0;
            Motor1_Go_B(DEG180);
            buzzer = 1;
            LCD_GotoXY(0x0,1);
LCD_Print("----------------");            
        }
        else
            Motor1_Stop();
        if(err>=3)
        {
            LCD_GotoXY(0x0,1);
            LCD_Print("***Input Lock***");        
            while(1)
            {
                delay_ms(150);
                buzzer = 0;
                delay_ms(150);
                buzzer = 1;                
            }
        }
        if(saveEEPROM)
        {
            saveEEPROM = 0;
            for(i=0;i<8;i++) 
                buf[i] = code_PW[i];
            for(i=0;i<12;i++)    
                buf[8+i]=IC_SN[i/4][i%4]; 
            EEPROM_WRITE(buf,20);        
        }
        
    }
}
void LCD1602_Hex(u8 _hex)
{
    u8 temp = _hex>>4;
    if(temp>9)LCD_WrDat(temp-10+'A');
    else LCD_WrNUM(temp);
    
    temp = _hex&0x0F;
    if(temp>9)LCD_WrDat(temp-10+'A');
    else LCD_WrNUM(temp);   
}
void Dis_ICcode(u8* _IC)//ÏÔʾ16½øÖÆIC¿¨ºÅ
{
    //"0123456789abcdef"
    //"IC:78 FB A8 01  "
    LCD_GotoXY(0x0,1);
    LCD_Print("IC:             ");
        LCD_GotoXY(0x3,1);
    LCD1602_Hex(_IC[0]);
    LCD_GotoXY(0x6,1);
    LCD1602_Hex(_IC[1]);
    LCD_GotoXY(0x9,1);
    LCD1602_Hex(_IC[2]);
    LCD_GotoXY(0xC,1);
    LCD1602_Hex(_IC[3]);
}
u8 Search_IC(u8 *_IC)//ËÑË÷IC¿¨£¬·µ»ØIDºÅ
{
    u8 i;
    for(i=0;i<3;i++)
    {
        if((_IC[0]==IC_SN[i][0])
         &&(_IC[1]==IC_SN[i][1])
         &&(_IC[2]==IC_SN[i][2])
         &&(_IC[3]==IC_SN[i][3]))
         {
              return i;
         }
    }
    return 0xEE;
}
void Save_IC(u8 _ID,u8 *_IC)
{
    u8 i;
    for(i=0;i<4;i++)
    {
        IC_SN[_ID][i] = _IC[i];
    }
}

u8 Find_hole_InLib(void)//ËÑË÷¿ÕÏÐλÖÃ
{
    u8 IC_hole[4]={0};
    return Search_IC(IC_hole);
}
void Delelt_ID_inLib(u8 _ID)//ɾ³ýIDλÖõĿ¨ºÅ
{
    u8 IC_hole[4]={0};
    Save_IC(_ID,IC_hole) ;
}

#include <REG52.H> // 引用51单片机寄存器定义头文件
#include <string.h> // 引用字符串操作库头文件
#include "lcd1602.h" // 引用LCD1602驱动库头文件
#include "delay.h" // 引用延时库头文件
#include "key_m.h" // 引用矩阵键盘驱动库头文件
#include "password.h" // 引用密码控制库头文件
#include "buzzer.h" // 引用蜂鸣器控制库头文件
#include "RC522.h" // 引用RC522射频模块控制库头文件
#include "eeprom.h" // 引用EEPROM读写库头文件
#include "stepMoto.h" // 引用步进电机控制库头文件
 
#define PW_MODE_INPUT   1 // 定义密码输入模式为1
#define PW_MODE_REGIST    2 // 定义密码设置模式为2
#define IC_REGIST       3 // 定义IC卡添加模式为3
#define IC_DELETE       4 // 定义IC卡删除模式为4
 
unsigned char IC_SN[3][4]={0}; // 定义一个存储用户的IC卡序列号的3x4二维数组
 
u8 openDoor=0; // 定义一个判断门是否打开的标志位
u8 saveEEPROM=0; // 定义一个标志,表示是否需要保存到EPROM
void Dis_ICcode(u8* _IC);
u8 Search_IC(u8 *_IC);
void Save_IC(u8 _ID,u8 *_IC);
u8 Find_hole_InLib(void);
void Delelt_ID_inLib(u8 _ID);
unsigned char USRT_key;

void main(void) // 主函数入口
{
    // 变量声明和初始化
    u8 mode; // 定义模式变量
    u8 key;
    u8 i;
    u8 sta;
    u8 err=0;
    
    // 初始化操作
    delay_Init(); // 延时初始化
    LCD_Init(); // LCD1602初始化
    PW_Init(); // 密码控制初始化
    Beep(200); // 蜂鸣器提示音
    
Start: // 标记,便于跳转回来
    mode = PW_MODE_INPUT; // 初始为密码输入模式
    LCD_Clear(); // 清屏
    LCD_GotoXY(0x00,0);
    LCD_Print("RFID PWord. Lock"); // 第一行显示标题
    LCD_GotoXY(0x00,1);
    LCD_Print("----------------"); // 第二行分隔线
    Motor1_Stop(); // 步进电机停止
    
    // 主循环
    while(1)
    {
        delay_ms(1); // 延时1毫秒
        key = KeyScan(0); // 扫描键盘
        if(key==0) // 没有扫描到按键
        {
            key = USRT_key; // 获取串口接收到的键值
            USRT_key = 0; 
        }
        if(key) // 如果扫描到按键或者串口接收到键值
        {
            Beep(200); // 按键提示音
            if(key=='*') // 如果输入*,则进入IC卡添加模式
            {
                mode = IC_REGIST;
                LCD_GotoXY(0x00,0);
                LCD_Print(" Regist IC code ");                        
            }
            else if(key=='#')  // 如果输入#,则进入IC卡删除模式
            {
                mode = IC_DELETE;
                LCD_GotoXY(0x00,0);
                LCD_Print(" delete IC code ");                        
            }
            else if(mode==PW_MODE_INPUT) // 如果在密码输入模式下
            {
                 switch (InputPassword(key))
                 {
                     case 0xFF: // 如果检测到按下的键是确认键,则切换到密码设置模式
                        err = 0;
                        mode=PW_MODE_REGIST;
                        LCD_GotoXY(0x00,0);
                        LCD_Print(" Enter a new PW.");
                        LCD_GotoXY(0x00,1);
                        LCD_Print("----------------");
                        break;
                    case 0x0F: // 如果检测到按下的键是用户密码,则标志位openDoor为1,代表允许开门
                        openDoor=1;
                        err = 0;
                        break;
                    case 0xEE: // 如果检测到按下的键是错误密码,则提示密码错误并发出警报声,同时记录错误次数
                        LCD_GotoXY(0x0,1);
                        LCD_Print(" PassWord error ");                        
                        Beep(200);Beep(200);Beep(200);
                        delay_ms(500);
                        err++;
                        goto Start; // 跳转到标记Start开始处
                        break;
                    default:
                        break;
                }
 
            }
            else if(mode==PW_MODE_REGIST) // 如果在密码设置模式下
            {
                sta=SetPassword(key); // 调用设置密码函数
                LCD_GotoXY(0x00,0);
                if(sta) // 如果设置密码成功
                {
                    if(sta==0xF1)LCD_Print("Set PW.->[24C02]");
                    if(sta==0xF2)LCD_Print("Set PW.->[Flash]"); 
                    if((sta>>4)==0x0E)LCD_Print("*Set PW. Error* ");
                    Beep(200);
                    Beep(200);                
                    delay_ms(400);
                    mode = PW_MODE_INPUT;                 
                    goto Start;
                }                
            }
        }
        else if((mode==PW_MODE_INPUT)||(mode==IC_REGIST)||(mode==IC_DELETE)) // 如果没有按键输入并且在以下模式下
        {        
            if(ReadICcode(buf)==0) // 判断是否检测到了IC卡
            {
                Dis_ICcode(buf); // 显示IC卡号
                Beep(200);
                delay_ms(400);
                sta=Search_IC(buf); // 检索IC卡是否存在于用户列表中            
                if(mode==PW_MODE_INPUT) // 如果在密码输入模式下
                {          
                    if(sta==0xEE)// 新卡
                    {
                        err++;
                        openDoor = 0;
                        LCD_GotoXY(0x0,1);
                        LCD_Print(" IC code error  ");
                        Beep(100);Beep(100);Beep(100);                    
                        delay_ms(1500);
                        goto Start;   
                    }
                    else // 老卡
                    {
                         openDoor = 1;
                         err = 0;
                    }
                }
                if(mode==IC_REGIST) // 如果在IC卡添加模式下
                {
                    if(sta==0xEE)// 新卡
                    {
                        sta = Find_hole_InLib();
                        if (sta != 0xEE) // 如果状态不为 0xEE(非空位置)
                        {
                            Save_IC(sta, buf); //IC 序列号保存在指定的 ID 号位置
                            saveEEPROM = 1; // 设置保存 EEPROM 标志为 1,表示需要保存数据到 EEPROM
                            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
                            LCD_Print("Add IC Code OK  "); // 显示 "Add IC Code OK" 第二行
                            Beep(500); // 发出长蜂鸣声提示操作成功
                        }
                        else // 如果状态为 0xEE(空位置)
                        {
                            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
                            LCD_Print("Library Is Full "); // 显示 "Library Is Full" 第二行
                            Beep(200); // 发出短蜂鸣声提示库满
                            Beep(200);
                            Beep(200);
                        }
                    }
                    else
                    {
                        LCD_GotoXY(0x0,1);
                        LCD_Print("IC Already Store");
                        Beep(200);Beep(200);Beep(200); // 播放蜂鸣声,表示IC已经存储
                    }
                    delay_ms(500);
                    goto Start; // 跳转到标签Start,继续下一轮循环
                }
            if (mode == IC_DELETE)
            {
                if (sta == 0xEE) // 如果状态为 0xEE(新 IC)
                {
                    LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
                    LCD_Print("Delete Code ERR"); // 显示 "Delete Code ERR" 第二行
                    Beep(200); // 发出短蜂鸣声提示操作错误
                    Beep(200);
                    Beep(200);
                }
                else
                {
                    sta = Search_IC(buf); // 搜索指定的 IC 序列号在库中的位置
                    Delelt_ID_inLib(sta); // 删除指定 ID 号位置的 IC 序列号
                    saveEEPROM = 1; // 设置保存 EEPROM 标志为 1,表示需要保存数据到 EEPROM
                    LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
                    LCD_Print("Delete Code OK "); // 显示 "Delete Code OK" 第二行
                    Beep(500); // 发出长蜂鸣声提示操作成功
                    delay_ms(400); // 延时 400ms
                }
                delay_ms(500); // 延时 500ms
                goto Start; // 跳转到程序入口处
            }
         }
    }
          
    if (openDoor)
    {
            openDoor = 0; // 将开门标志重置为 0
            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
            LCD_Print("Opening the door"); // 显示 "Opening the door" 第二行
            //Relay=0;
            buzzer = 0; // 关闭蜂鸣器
            Motor1_Go_F(DEG180); // 电机正转180度
            buzzer = 1; // 打开蜂鸣器
            //Beep(2000);
            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
            LCD_Print("  Door Is Open  "); // 显示 "  Door Is Open  " 第二行            
            delay_ms(1000); // 延时 1000ms
            delay_ms(1000); // 延时 1000ms

            //Relay=1;
            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
            LCD_Print("Closing the door"); // 显示 "Closing the door" 第二行            
            buzzer = 0; // 关闭蜂鸣器
            Motor1_Go_B(DEG180); // 电机反转180度
            buzzer = 1; // 打开蜂鸣器
            LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
            LCD_Print("----------------"); // 显示 "----------------" 第二行            
    }
    else
            Motor1_Stop(); // 停止电机运动

    if (err >= 3)
    {
        LCD_GotoXY(0x0, 1); // 将光标设置在第二行开头
        LCD_Print("***Input Lock***"); // 显示 "***Input Lock***" 第二行
        while (1)
        {
            delay_ms(150); // 延时 150ms
            buzzer = 0; // 关闭蜂鸣器
            delay_ms(150); // 延时 150ms
            buzzer = 1; // 打开蜂鸣器
        }
    }

    if (saveEEPROM)
    {
        saveEEPROM = 0; // 将保存 EEPROM 标志重置为 0
        for (i = 0; i < 8; i++)
        buf[i] = code_PW[i]; // 将 code_PW 数组中的数据拷贝到 buf 数组的前 8 个元素中
        for (i = 0; i < 12; i++)
        buf[8 + i] = IC_SN[i / 4][i % 4]; //IC_SN 数组中的数据拷贝到 buf 数组的后 12 个元素中
        EEPROM_WRITE(buf, 20); // 将 buf 数组中的数据写入 EEPROM
    }
    }
}
void LCD1602_Hex(u8 _hex)
{
    u8 temp = _hex >> 4; // 取高4位
    if (temp > 9)
    LCD_WrDat(temp - 10 + 'A'); // 如果大于9,显示对应的字母
    else
    LCD_WrNUM(temp); // 否则显示数字

    temp = _hex & 0x0F; // 取低4位
    if (temp > 9)
    LCD_WrDat(temp - 10 + 'A'); // 如果大于9,显示对应的字母
    else
    LCD_WrNUM(temp); // 否则显示数字
}

void Dis_ICcode(u8* _IC)//显示16位十六进制IC号
{
    //"0123456789abcdef"
    //"IC:78 FB A8 01  "
    LCD_GotoXY(0x0,1); // 将光标设置在第二行开头
    LCD_Print("IC:             "); // 显示 "IC:             " 第二行
    LCD_GotoXY(0x3,1); // 将光标设置在第二行第四个字符处
    LCD1602_Hex(_IC[0]); // 显示_IC[0]的十六进制值
    LCD_GotoXY(0x6,1); // 将光标设置在第二行第七个字符处
    LCD1602_Hex(_IC[1]); // 显示_IC[1]的十六进制值
    LCD_GotoXY(0x9,1); // 将光标设置在第二行第十个字符处
    LCD1602_Hex(_IC[2]); // 显示_IC[2]的十六进制值
    LCD_GotoXY(0xC,1); // 将光标设置在第二行第十三个字符处
    LCD1602_Hex(_IC[3]); // 显示_IC[3]的十六进制值
}
u8 Search_IC(u8 *_IC)//查找IC号,返回ID号
{
    u8 i;
    for (i = 0; i < 3; i++)
    {
        if ((_IC[0] == IC_SN[i][0])
        && (_IC[1] == IC_SN[i][1])
        && (_IC[2] == IC_SN[i][2])
        && (_IC[3] == IC_SN[i][3]))
        {
            return i; // 返回ID号
        }
    }
    return 0xEE; // 未找到匹配的IC号,返回0xEE
}

void Save_IC(u8 _ID, u8 *_IC)
{
    u8 i;
    for (i = 0; i < 4; i++)
    {
         IC_SN[_ID][i] = _IC[i]; //_IC的数据保存到IC_SN数组中对应ID号的位置
    }
}

u8 Find_hole_InLib(void)//查找空闲位置
{
    u8 IC_hole[4] = {0}; // 定义一个全零的IC号
    return Search_IC(IC_hole); // 返回查找结果
}

void Delelt_ID_inLib(u8 _ID)//删除ID位置的IC号
{
    u8 IC_hole[4] = {0}; // 定义一个全零的ICSave_IC(_ID, IC_hole); // 将全零的IC号保存到ID位置
}



你好,还有哪里看不懂的么,可以针对性在给你指点一下,楼上的注释清清楚楚了。就是一些状态机的思想,按键那里切状态切来切去的。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这是一个基于单片机的RFID密码锁系统,主要是通过读取RFID模块的数据来进行用户身份验证。以下是代码注释和流程图:

注释:

  1. 定义了一些库文件和常量(如密码输入和注册模式、IC卡注册和删除等)以及存储用户IC卡的数组IC_SN。

  2. main函数进入后初始化程序并进入开始标签Start。

  3. 进入主循环,不断扫描按键输入,如果是数字键,会根据当前模式分别执行相应操作(如输入密码、IC卡注册、IC卡删除等)。如果没有按键输入,则会读取RFID模块的数据并进行身份验证,如果验证通过则开锁。

  4. 如果输入错误次数超过3次,则系统会进入锁死状态。

  5. 如果用户进行了IC卡注册或删除操作,则程序会将IC_SN数组存储的数据写入EEPROM中。

流程图:

程序中的主循环由以下流程组成:

  1. 扫描按键输入:通过KeyScan函数来检测是否按下数字键,并读取键值。

  2. 操作模式判断:根据当前模式(密码输入/注册、IC卡注册、IC卡删除)执行相应操作。

  3. IC卡识别验证:调用ReadICCode函数读取RFID模块数据,并与IC_SN数组进行比较以验证身份。

  4. 根据验证结果开锁或报错:如果验证通过则开锁,否则根据错误次数进行相应提示和处理。

  5. IC卡注册/删除操作:如果用户进行了IC卡注册或删除操作,则更新IC_SN数组中的对应数据并写入EEPROM。

  6. 循环结束时停止步进电机并等待下一次循环开始。

注意:由于缺少代码中的其他函数库文件和变量定义,以上注释和流程图可能不完全准确,仅为给出参考。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7805608
  • 这篇博客你也可以参考下:C语言实现十进制转十六进制--为单片机编写(数据转换,并非单纯显示)
  • 除此之外, 这篇博客: C语言中:一些杂散但值得讨论的问题中的 六、运算中的临时匿名变量 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1、C语言和汇编的区别(汇编完全对应机器操作,C对应逻辑操作)
    (1)C语言叫高级语言,汇编语言叫低级语言。

    (2)低级语言的意思是汇编语言和机器操作相对应,汇编语言只是CPU的机器码的助记符,用汇编语言写程序必须拥有机器的思维。因为不同的CPU设计时指令集差异很大,因此用汇编编程的差异很大。

    (3)高级语言(C语言)它对低级语言进行了封装(C语言的编译器来完成),给程序员提供了一个靠近人类思维的一些语法特征,人类不用过于考虑机器原理,而可以按照自己的逻辑原理来编程。譬如数组、结构体、指针····

    (4)更高级的语言如java、C#等只是进一步强化了C语言提供的人性化的操作语法,在易用性上、安全性上进行了提升。

    2、C语言的一些“小动作”
    (1)高级语言中有一些元素(如运算符等)是机器中没有的

    (2)高级语言在运算中允许我们大跨度的运算。意思就是低级语言中需要好几步才能完成的一个运算,在高级语言中只要一步即可完成。譬如C语言中一个变量i要加1,在C中只需要i++即可,看起来只有一句代码。但实际上翻译到汇编阶段需要3步才能完成:第1步从内存中读取i到寄存器,第2步对寄存器中的i进行加1,第3步将加1后的i写回内存中的i。

    3、使用临时变量来理解强制类型转换
    4、使用临时变量来理解不同数据类型之间的运算

    #include <stdio.h>
    
    int main(void)
    {
    	int b;
    	float a;
    	b = 10;
    	a = b / 3;		// 第一步先算 b/3,第二步将第一步的结果强制类型转换为float生成一个临时变量,第三步将第二步生成的临时变量赋值给a,第四步销毁临时变量。
    	printf("a = %f.\n", a);
    	
    	/*
    	int b;
    	float a, f;
    	b = 10;
    	f = 1.5;
    	a = b / f;
    	printf("a = %f.\n", a);
    	*/
    	
    	
    	/*
    	float a = 12.34;
    	int b = (int)a;			// a被强制类型转换后自己本身竟然没变
    	// (int)a强制类型转换并赋值在底层实际分了4个步骤:第一步先在另外的地方找一个内存构建一个临时变量x(x的类型是int,x的值等于a的整数部分),第二步将float a的值的整数部分赋值给x,第三步将x赋值给b,第四步销毁x。
    	// 最后结果:a还是float而且值保持不变,b是a的整数部分。
    	
    	printf("a = %f, b = %d.\n", a, b);
    	*/
    	
    	return 0;
    }
    
  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^