在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

news2025/1/5 8:40:38

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

  • 参考文章
  • 源码下载地址
  • 一、SDL2的创建、初始化、退出
  • 二、系统基本Tick、彩屏刷新、按键事件
  • 三、彩屏获取与设置颜色
  • 四、彩屏填充颜色及清屏
  • 五、彩屏显示中文和英文字符串
  • 六、彩屏显示数字
  • 七、彩屏初始化
  • 八、主函数测试
  • 九、测试效果

参考文章

  • 在CodeBlocks下搭建SDL2开发工程
  • 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)



源码下载地址

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示


一、SDL2的创建、初始化、退出


typedef struct
{
    SDL_Window   * MainWindow;  /* 窗口 */
    SDL_Renderer * MainRender;  /* 渲染器 */
    SDL_Texture  * MainTexture; /* 纹理 */
    u8             ExitWindow;  /* 退出窗口 */
}AppGlobal_TypeDef, * AppGlobal_TypeDef_t;


static AppGlobal_TypeDef AppSystem = {0};
AppGlobal_TypeDef * pAppSystem = &AppSystem;


 /* 初始化SDL */
static u8 ubInit_SDL2(void)
{
    /* 初始化SDL */
    if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0)
    {
        SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());
        return 1;
    }

    /* 创建窗口 */
    AppSystem.MainWindow = SDL_CreateWindow("Virtual TFT SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);
    if (AppSystem.MainWindow == NULL)
    {
        SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());
        return 2;
    }

    /* 创建渲染器 */
    AppSystem.MainRender = SDL_CreateRenderer(AppSystem.MainWindow, -1, SDL_RENDERER_ACCELERATED);
    if (AppSystem.MainRender == NULL)
    {
        SDL_Log("SDL Create Renderer Fail......%s", SDL_GetError());
        return 3;
    }

    /* 创建纹理 */
    AppSystem.MainTexture = SDL_CreateTexture(AppSystem.MainRender, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, TFT_LCD_PHY_XWIDTH, TFT_LCD_PHY_YHEIGHT);
    if (AppSystem.MainTexture == NULL)
    {
        SDL_Log("SDL Create Texture Fail......%s", SDL_GetError());
        return 4;
    }

    /* 设置纹理模式 */
    SDL_SetTextureBlendMode(AppSystem.MainTexture, SDL_BLENDMODE_BLEND);
    memset(TFT_LCD_DIS_MEMORY, 0x99, TFT_LCD_PHY_XWIDTH * TFT_LCD_PHY_YHEIGHT * sizeof(u32));

    SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));
    SDL_RenderClear(AppSystem.MainRender);

    SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);
    SDL_RenderPresent(AppSystem.MainRender);

    return 0;
}


/* 退出SDL */
static void vQuit_SDL2(void)
{
    SDL_Log("Complier Date: %s  %s %d\r\n", __DATE__, __TIME__, ulSuperTimer_GetTick());

    /* 销毁纹理 */
    if (AppSystem.MainTexture != NULL) SDL_DestroyTexture(AppSystem.MainTexture);

    /* 销毁渲染器 */
    if (AppSystem.MainRender != NULL)  SDL_DestroyRenderer(AppSystem.MainRender);

    /* 销毁窗口 */
    if (AppSystem.MainWindow != NULL) SDL_DestroyWindow(AppSystem.MainWindow);

    /* 退出SDL */
    SDL_Quit();
}



二、系统基本Tick、彩屏刷新、按键事件


/* 系统基本Tick */
static void vSystem_BasicTick(void)
{
    static Uint64 oldTick = 0;
    Uint64 curTick = SDL_GetTicks64();
    if (oldTick == curTick) return;

    vSuperTimer_IncTick((u16)(curTick - oldTick));
    oldTick = curTick;
}


/* 屏幕刷新+按键事件处理 */
static void vRefresh_KeyEvent_Handler(void)
{
    static Uint64 oldTick = 0;
    Uint64 curTick  = SDL_GetTicks64();
    SDL_Event event = {0};


    if ((curTick - oldTick) >= 20)
    {
        SDL_UpdateTexture(AppSystem.MainTexture, NULL, TFT_LCD_DIS_MEMORY, TFT_LCD_PHY_XWIDTH * sizeof(u32));
        SDL_RenderClear(AppSystem.MainRender);
        SDL_RenderCopy(AppSystem.MainRender, AppSystem.MainTexture, NULL, NULL);
        SDL_RenderPresent(AppSystem.MainRender);
        oldTick = curTick;
    }

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT: AppSystem.ExitWindow = EXIT_WINDOW_TYPE_QUIT; break;

            case SDL_KEYDOWN:
            {
                switch (event.key.keysym.sym)
                {
                    case SDLK_UP:    SDL_Log("SDLK_UP......\r\n");    break;
                    case SDLK_DOWN:  SDL_Log("SDLK_DOWN......\r\n");  break;
                    case SDLK_LEFT:  SDL_Log("SDLK_LEFT......\r\n");  break;
                    case SDLK_RIGHT: SDL_Log("SDLK_RIGHT......\r\n"); break;
                    default: break;
                }
            }
            break;

            default: break;
        }
    }
}



三、彩屏获取与设置颜色


/* 设置颜色 */
void vTFT_LCD_SetColor(u32 x, u32 y, ColorType color)
{
    /* 越界 */
    if (x > (AppDevTFT.xWidth  - 1)) return;
    if (y > (AppDevTFT.yHeight - 1)) return;
    AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
}


/* 获取颜色 */
ColorType xTFT_LCD_GetColor(u32 x, u32 y)
{
    /* 越界 */
    if (x > (AppDevTFT.xWidth  - 1)) return 0;
    if (y > (AppDevTFT.yHeight - 1)) return 0;
    return RGB_DEV(AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x]);
}



四、彩屏填充颜色及清屏


/* 填充矩形(单色) */
void vTFT_LCD_FillRect_SinColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType color)
{
    u32 x = 0, y = 0;

    /* 越界 */
    if (x1 > (AppDevTFT.xWidth  - 1)) return;
    if (y1 > (AppDevTFT.yHeight - 1)) return;

    /* 最大范围 */
    if (x2 > (AppDevTFT.xWidth  - 1)) x2 = (AppDevTFT.xWidth - 1);
    if (y2 > (AppDevTFT.yHeight - 1)) y2 = (AppDevTFT.yHeight - 1);

    /* 填充颜色 */
    for (x = x1; x <= x2; x++)
    {
        for (y = y1; y <= y2; ++y)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
        }
    }
}

/* 填充矩形(多色) */
void vTFT_LCD_FillRect_MultColor(u32 x1, u32 y1, u32 x2, u32 y2, ColorType * pColor)
{
    u32 x = 0, y = 0, ex = 0, ey = 0;

    /* 越界 */
    if (x1 > (AppDevTFT.xWidth  - 1)) return;
    if (y1 > (AppDevTFT.yHeight - 1)) return;

    /* 最大范围 */
    ex = (x2 > (AppDevTFT.xWidth  - 1)) ? (AppDevTFT.xWidth  - 1) : x2;
    ey = (y2 > (AppDevTFT.yHeight - 1)) ? (AppDevTFT.yHeight - 1) : y2;
    for (y = y1; y <= ey; y++)
    {
        for (x = x1; x <= ex; ++x)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(*pColor);
        }

        pColor += (x2 - ex);
    }
}


/* 清屏幕 */
void vTFT_LCD_ClearScreen(ColorType color)
{
    u32 x = 0, y = 0;

    for (x = 0; x <= (AppDevTFT.xWidth - 1); x++)
    {
        for (y = 0; y <= (AppDevTFT.yHeight - 1); ++y)
        {
            AppDevTFT.pDisMem[AppDevTFT.xWidth * y + x] = 0xFF000000 | DEV_RGB(color);
        }
    }
}



五、彩屏显示中文和英文字符串


/* 获取字符数据源地址 */
static void vGet_CharSrc(u8 chr, u8 charSize, u8 ** pSrc)
{
    switch (charSize)
    {
        case ASCII_FONT_TYPE_1206 : *pSrc = (u8 *)(&ASCII_FONT_1206[chr - ' ']); break;
        case ASCII_FONT_TYPE_1608 : *pSrc = (u8 *)(&ASCII_FONT_1608[chr - ' ']); break;
        case ASCII_FONT_TYPE_2412 : *pSrc = (u8 *)(&ASCII_FONT_2412[chr - ' ']); break;
        default: *pSrc = NULL; break;
    }
}



/* 显示字符 */
static void vTFT_LCD_DisplayChar(u32 x, u32 y, u8 chr, u8 charSize, ColorType backColor, ColorType foreColor)
{
    ColorType color = foreColor;
    u8 charByte = 0, k = 0, i = 0;
    u8 dat = 0, * pSrcDat = NULL;
    u32 y0 = y;


    //获取字符数据源地址
    vGet_CharSrc(chr, charSize, &pSrcDat);
    if (pSrcDat == NULL) return;

    // 字符点阵占用字节数
    charByte = ((charSize >> 3) + ((charSize & 0x07) ? 1 : 0)) * (charSize >> 1);

    // 遍历字符点阵数据
    for(k = 0; k < charByte; ++k)
    {
        dat = pSrcDat[k];
        for(i = 0; i < 8; ++i)
        {
            // 显示有效范围
            if ((x < AppDevTFT.xWidth) && (y < AppDevTFT.yHeight))
            {
                //低位在前
                if ((dat >> i) & 0x01) color = foreColor;
                else                   color = backColor;

                vTFT_LCD_SetColor(x, y, color);
            }

            y++;// 纵坐标自加
            if (XABS2(y , y0) >= charSize)//纵坐标偏移量等于字符点阵高度
            {
                y = y0;
                x++;
                break;
            }
        }
    }
}

/* 显示字符串 */
void vTFT_LCD_DisplayString(u32 x, u32 y, u8 * pStr, u8 strSize, ColorType backColor, ColorType foreColor)
{
    //显示ASCII常规字符
    while ((*pStr >= ' ') && (*pStr <= '~'))
    {
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + (strSize >> 1)) >= AppDevTFT.xWidth)
        {
            y += strSize;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + strSize) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        vTFT_LCD_DisplayChar(x, y, *pStr, strSize, backColor, foreColor);
        x += (strSize >> 1);
        pStr++;
    }
}





/* 显示中文字符 */
static void vTFT_LCD_Display_ChineseChar(u32 x, u32 y, u32 xWidth, u32 yHeight, const u8 * pData, ColorType backColor, ColorType foreColor)
{
    ColorType color = foreColor;
    u16 k = 0, j = 0, n = 0, i = 0;
    u32 y0 = y, yMax = 0;
    u8 dat = 0;


    yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0); //高度
    y0   = y; //原始纵坐标

    for(k = 0; k < xWidth; k++)
    {
        for(j = 0; j < yMax; j++)
        {
            dat = pData[n++];
            for(i = 0; i < 8; i++)
            {
                if ((y < AppDevTFT.yHeight) && (x < AppDevTFT.xWidth))
                {
                    //低位在前
                    if ((dat >> i) & 0x01) color = foreColor;
                    else                   color = backColor;

                    vTFT_LCD_SetColor(x, y, color);
                }

                y++;//纵坐标处理
                if (XABS2(y , y0) >= yHeight)
                {
                    y = y0;
                    x++;//横坐标处理
                    break;
                }
            }
        }
    }
}

/* 显示中文字符串 */
void vTFT_LCD_Display_ChineseString(u32 x, u32 y, u32 xWidth, u32 yHeight, u8 * pData, u16 num, ColorType backColor, ColorType foreColor)
{
    u16 i = 0;
    u8 charByte = 0;
    u8 * pMem = pData;


    /* 异常 */
    if ((!num) || (pData == NULL)) return;

    // 字符点阵占用字节数
    charByte = ((yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0)) * xWidth;

	for (i = 0; i < num; ++i)
	{
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + xWidth) > AppDevTFT.xWidth)
        {
            y += yHeight;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + yHeight) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        pMem = pData + (charByte * i);
        vTFT_LCD_Display_ChineseChar(x, y, xWidth, yHeight, pMem, backColor, foreColor);
        x += xWidth;
	}
}





六、彩屏显示数字


static u8 ubGet_EveryBit_Digit(u8 * pDat, u32 num)
{
    u8 i = 0;
    while (1)
    {
        pDat[i++] = num % 10;
        num = num / 10;
        if (!num)
        {
            break;
        }
    }

    u8 temp = 0;
    for (num = 0; num < (i >> 1); ++num)
    {

        temp = pDat[num];
        pDat[num] = pDat[i - num - 1];
        pDat[i - num - 1] = temp;
    }
    return i;
}

/* 显示数字 */
void vTFT_LCD_DisplayNumber(u32 x, u32 y, u32 num, u8 charSize, ColorType backColor, ColorType foreColor)
{
    u8 mem[20] = {0};
    u8 chr = 0, i = 0, len = ubGet_EveryBit_Digit(mem, num);

    for (i = 0; i < len; ++i)
    {
        /* 剩余的横纵小于字体宽度 换行显示 */
        if ((x + (charSize >> 1)) >= AppDevTFT.xWidth)
        {
            y += charSize;
            x  = 0;
        }

        /* 剩余纵轴小于字体高度 */
        // if ((y + charSize) >= AppDevTFT.yHeight)
        if (y >= AppDevTFT.yHeight)
        {
            return;
        }

        chr = mem[i] + 0x30;
        vTFT_LCD_DisplayChar(x, y, chr, charSize, backColor, foreColor);
        x += (charSize >> 1);
    }
}




七、彩屏初始化


/* 初始化TFT */
void vTFT_Init(void)
{
    AppDevTFT.xWidth  = TFT_LCD_PHY_XWIDTH;
    AppDevTFT.yHeight = TFT_LCD_PHY_YHEIGHT;
    AppDevTFT.pDisMem = TFT_LCD_DIS_MEMORY;
    AppDevTFT.BackColor = 0xDCDCDC;
    AppDevTFT.ForeColor = 0xFFFFFF;
    vTFT_LCD_ClearScreen(AppDevTFT.BackColor);

    vTFT_LCD_DisplayString(10,  10, (const u8 *)"Compiler: ", ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(90,  10, (const u8 *)__DATE__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(178, 10, (const u8 *)"  ",         ASCII_FONT_TYPE_1608, 0, 0x00FF00);
    vTFT_LCD_DisplayString(194, 10, (const u8 *)__TIME__,     ASCII_FONT_TYPE_1608, 0, 0x00FF00);


    vTFT_LCD_DisplayString(10, 50,  (const u8 *)"xDemo TFT1...123ABC~!@#$%^&*()-=", ASCII_FONT_TYPE_1206, 0, 0xFFFF00);
    vTFT_LCD_DisplayString(10, 70,  (const u8 *)"xDemo TFT2...123ABC", ASCII_FONT_TYPE_1608, 0xFFFFFF, 0x0000FF);
    vTFT_LCD_DisplayString(10, 100, (const u8 *)"xDemo TFT3...123ABC", ASCII_FONT_TYPE_2412, 0, 0xF59A23);

    vTFT_LCD_Display_ChineseString(10, 140, 18, 18, (u8 *)&ChineseDemo[1], 9, 0, 0xFF0000);


    vTFT_LCD_DisplayNumber(10, 200, 985, ASCII_FONT_TYPE_2412, 0xDCDCDC, 0xFF0000);
}




八、主函数测试


int main( int argc, char * argv[] )
{
    if (ubInit_SDL2())
    {
        SDL_Log("Init SDL Fail......%s\r\n", SDL_GetError());
        vQuit_SDL2();
        return -1;
    }

    vTFT_Init();
    xSuperTimer_Init();
    AppSystem.ExitWindow = EXIT_WINDOW_TYPE_RUN;


    ubSuperTimer_Start(xDemo, 1000);
    while (AppSystem.ExitWindow)
    {
        vRefresh_KeyEvent_Handler();
        vSystem_BasicTick();
        vSuperTimer_RunHandler();
    }


    vQuit_SDL2();
    return 0;
}



九、测试效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESLint+Prettier的配置

ESLintPrettier的配置 安装插件 ​​​​​​ 在settings.json中写下配置 {// tab自动转换标签"emmet.triggerExpansionOnTab": true,"workbench.colorTheme": "Default Dark","editor.tabSize": 2,"editor.fontSize": …

Springboot使用RabbitMQ实现关闭超时订单的一个简单示例

1.maven中引入rabbitmq的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中进行rabbitmq相关配置&#xff1a; # rabbit…

复杂对象的创建与组装 - 建造者模式(Builder Pattern)

建造者模式&#xff08;Builder Pattern&#xff09; 建造者模式&#xff08;Builder Pattern&#xff09;建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式结构图代码 talk is cheap&#xff0c; show you my code总结 建造者模式&#xff08;Builder Patter…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上&#xff0c;编译运行WordCount程序。完成实验操作后&#xff0c;读者会掌握简单的程序编写&#xff0c;如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统&#xff1b;安装mpich-3…

springboot533图书管理系统(论文+源码)_kaic

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;图书信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【服务器开发及部署】code-server 显示git graph

在开发一些linux上的内容的时候进程需要在开发机和生产部署上花费大量的时间。 为了解决上述问题,我们今天介绍一款在服务上开发的思路 git + code server + 宝塔 其中需要处理一些问题,此处都有交代 步骤 安装宝塔安装code-server配置插件配置浏览器处理的问题 git版本过低,…

【游戏设计原理】41 - 游戏的核心

1. 如何理解&#xff1f; 这条原理主要在讲述“游戏核心”这一概念的重要性及其在游戏开发中的作用。游戏的核心是指决定游戏整体玩法和体验的核心元素&#xff0c;它通常是游戏的主要机制、目标或动作方式。理解这一原理时&#xff0c;我们可以从以下几个层面来考虑&#xff…

win11 vs2022 opencv 4.10 camshift示例程序运行

记录win11 vs2022 opencv 4.10下 camshift等示例程序的单步debug启动方式&#xff0c;方便了解源码。 debug版本编译通过&#xff0c;但运行时报出大量日志信息(部分dll加载FAILED后会自动找兼容dll)。但也能继续运行&#xff0c;效果如下 release版本可以直接运行&#xff0…

数据结构漫游记:初识栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

人工智能知识分享第五天-正则化.损失函数案例

正则化 欠拟合与过拟合 过拟合&#xff1a;一个假设 在训练数据上能够获得比其他假设更好的拟合&#xff0c; 但是在测试数据集上却不能很好地拟合数据 (体现在准确率下降)&#xff0c;此时认为这个假设出现了过拟合的现象。(模型过于复杂) 欠拟合&#xff1a;一个假设 在训…

CSS2笔记

一、CSS基础 1.CSS简介 2.CSS的编写位置 2.1 行内样式 2.2 内部样式 2.3 外部样式 3.样式表的优先级 4.CSS语法规范 5.CSS代码风格 二、CSS选择器 1.CSS基本选择器 通配选择器元素选择器类选择器id选择器 1.1 通配选择器 1.2 元素选择器 1.3 类选择器 1.4 ID选择器 1.5 基…

如何在 Ubuntu 22.04 上优化 Apache 以应对高流量网站教程

简介 在本教程中&#xff0c;我们将学习如何优化 Apache 以应对高流量网站。 当运行高流量网站时&#xff0c;确保你的 Apache Web 服务器得到优化对于有效处理负载至关重要。在本指南中&#xff0c;我们将介绍配置 Apache 以提高性能和可扩展性的基本技巧。 为高流量网站优…

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面&#xff0c;在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面&#xff0c;在该界面我们可以选择不同的系统操作系统来下载对应版…

Spring boot + Hibernate + MySQL实现用户管理示例

安装MySQL Windows 11 Mysql 安装及常用命令_windows11 mysql-CSDN博客 整体目录 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLS…

大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!

大模型Weekly 03&#xff5c;OpenAI o3发布&#xff1b;DeepSeek-V3上线即开源&#xff01;DeepSeek-V3上线即开源&#xff1b;OpenAI 发布高级推理模型 o3https://mp.weixin.qq.com/s/9qU_zzIv9ibFdJZ5cTocOw?token47960959&langzh_CN 「青稞大模型Weekly」&#xff0c;持…

电路学习之前言

1.作为一名嵌入式开发者&#xff0c;去学习电路是必经之路。如果是一名嵌入式软件开发者&#xff0c;可能对电路和硬件的开发要求是能看懂电路图即可&#xff0c;但是&#xff0c;学习电路可以进一步提高看电路图的能力&#xff0c;可以提升自己的整体实力水平。而且&#xff0…

Java反射详解(二)

上一篇博客&#xff1a;Java反射详解&#xff08;一&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.c…

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

逆境清醒文章总目录表

逆境清醒文章总目录表 零、时光宝盒&#x1f33b; &#xff08;https://blog.csdn.net/weixin_69553582 逆境清醒&#xff09; 《你的答案》歌曲原唱&#xff1a;阿冗&#xff0c;填 词&#xff1a;林晨阳、刘涛&#xff0c;谱曲&#xff1a;刘涛 也许世界就这样&#xff0c…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口&#xff08;Digital Display Serial Interface&#xff09; SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备&#xff0c;下面是接口…