当前位置: 首页 > article >正文

U8G2在PC端模拟(C语言版本)

前提:
电脑已经准备好mingw编译器环境,已经加入环境变量.
测试方法: window下打开cmd,输入gcc -v 会有信息打印.

u8g2

u8g2官方支持sdl2接口,已经做好了适配. 所以只需要在使用的开发环境配置好SDL2路径即可.

sdl2和u8g2的适配主要在两个文件内,分别是u8x8_d_sdl_128x64.c, u8x8_sdl_key.c.主要看第一个文件.
下面主要是u8x8_d_sdl_128x64.c的部分内容.

int u8g_sdl_multiple = 3;  static void u8g_sdl_init(int width, int height)
{// 省略部分内容u8g_sdl_color[0] = SDL_MapRGB( u8g_sdl_screen->format, 0, 0, 0 );u8g_sdl_color[1] = SDL_MapRGB( u8g_sdl_screen->format, 255, 255, 0);u8g_sdl_color[2] = SDL_MapRGB( u8g_sdl_screen->format, 100, 100, 100 );u8g_sdl_color[3] = SDL_MapRGB( u8g_sdl_screen->format, 255, 255, 255 );u8g_sdl_color[4] = SDL_MapRGB( u8g_sdl_screen->format, 0, 0, 0 );// 省略部分内容}

经过实际测试 u8g_sdl_color[0]为背景色,u8g_sdl_color[3]为前景色.其他暂时没发现作用.

SDL2

在这里插入图片描述
下载SDL2压缩包,解压后把内部的x86_64-w64-mingw32直接粘贴到mingw文件夹内,注意mingw文件夹内也有一个x86_64-w64-mingw32文件夹,但是粘贴时不会覆盖任何文件。

下载U8G2源码,然后把CSRC文件夹拖入到新的工程,创建main.c,输入如下内容.
例子是参考:u8g2电脑模拟器里面的

#include "csrc/u8g2.h"
#include <stdio.h>u8g2_t u8g2;int main(void)
{int x, y;int k;int i;u8g2_SetupBuffer_SDL_128x64_4(&u8g2, &u8g2_cb_r0);u8x8_InitDisplay(u8g2_GetU8x8(&u8g2));u8x8_SetPowerSave(u8g2_GetU8x8(&u8g2), 0);u8g2_SetFont(&u8g2, u8g2_font_helvB18_tn);x = 50;y = 30;for (;;){u8g2_FirstPage(&u8g2);i = 0;do{u8g2_SetFontDirection(&u8g2, 0);u8g2_DrawStr(&u8g2, x, y, "123");u8g2_SetFontDirection(&u8g2, 1);u8g2_DrawStr(&u8g2, x, y, "123");u8g2_SetFontDirection(&u8g2, 2);u8g2_DrawStr(&u8g2, x, y, "123");u8g2_SetFontDirection(&u8g2, 3);u8g2_DrawStr(&u8g2, x, y, "123");if (i == 1){u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y0, 1, 0);u8g2_DrawHVLine(&u8g2, u8g2.user_x0, u8g2.user_y1 - 1, 1, 0);u8g2_DrawHVLine(&u8g2, u8g2.user_x1 - 1, u8g2.user_y1 - 1, 1, 0);u8g2_DrawHVLine(&u8g2, u8g2.user_x1 - 1, u8g2.user_y0, 1, 0);}i++;} while (u8g2_NextPage(&u8g2));do{k = u8g_sdl_get_key();} while (k < 0);if (k == 273)y -= 7;if (k == 274)y += 7;if (k == 276)x -= 7;if (k == 275)x += 7;if (k == 'e')y -= 1;if (k == 'x')y += 1;if (k == 's')x -= 1;if (k == 'd')x += 1;if (k == 'q')break;}return 0;
}

然后我用的是vscode + mingw.

c_cpp_properties.json

c_cpp_properties.json文件如下所示

{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\x86_64-w64-mingw32\\include\\**"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"windowsSdkVersion": "10.0.19041.0","compilerPath": "C:/x86_64-8.1.0-release-posix-seh-rt_v6-rev0/mingw64/bin/g++.exe","cStandard": "c99","cppStandard": "c++11","intelliSenseMode": "windows-gcc-x64"}],"version": 4
}

要把配置中的"C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\x86_64-w64-mingw32\\include\\**"替换为你自己的路径.该文件夹如下所示.
在这里插入图片描述

launch.json

文件内容如下所示

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "C/C++: gcc.exe 生成活动文件","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true,"MIMode": "gdb","miDebuggerPath": "C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\bin\\gdb.exe","logging": {"engineLogging": true,"trace": true,"traceResponse": true,},"setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "Force breakpoint sync","text": "set breakpoint pending on",  // 允许挂起断点"ignoreFailures": false}],"preLaunchTask": "C/C++: gcc.exe 生成活动文件",}]
}

同样的把上述关于路径相关的都替换为自己的路径.

task.json

{"tasks": [{"type": "cppbuild","label": "C/C++: gcc.exe 生成活动文件","command": "C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\bin\\gcc.exe","args": ["-fdiagnostics-color=always","-g","${fileDirname}\\*.c","${fileDirname}\\csrc\\*.c","-IC:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\include\\SDL2","-L",  // 在库文件的搜索路径列表中添加dir目录,"C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\x86_64-w64-mingw32\\bin","-lSDL2","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {// "cwd": "C:\\x86_64-8.1.0-release-posix-seh-rt_v6-rev0\\mingw64\\bin""cwd": "${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "调试器生成的任务。"}],"version": "2.0.0"
}

同样的把上述关于路径相关的都替换为自己的路径.

上面的配置文件和参考中的makefile编译参数基本一致.

配置后效果如下所示

在这里插入图片描述

相关文章:

U8G2在PC端模拟(C语言版本)

前提&#xff1a; 电脑已经准备好mingw编译器环境&#xff0c;已经加入环境变量. 测试方法&#xff1a; window下打开cmd,输入gcc -v 会有信息打印. u8g2 u8g2官方支持sdl2接口&#xff0c;已经做好了适配. 所以只需要在使用的开发环境配置好SDL2路径即可. sdl2和u8g2的适配…...

【计算机视觉】CV实战项目 - 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection

深入解析基于HOGSVM的行人检测系统&#xff1a;从理论到实践 技术核心&#xff1a;HOGSVM检测框架HOG特征原理SVM分类器 项目架构与数据准备INRIA Person数据集目录结构 实战指南&#xff1a;从零构建检测系统环境配置完整训练流程检测应用 关键技术问题与解决方案1. 难例挖掘不…...

如何借助全球动态IP实现多平台账号的批量注册?

无论是社交网络、在线购物平台还是专业应用软件&#xff0c;账号的创建和使用都是必不可少的。然而&#xff0c;在面对不同平台各自的注册限制和策略时&#xff0c;如何高效、安全且合法地进行账号批量注册成为了亟待解决的问题。本文将探讨全球动态IP在这一过程中的作用及其如…...

PR第二课--混剪

1.音乐打点 1.1 手动打点 按钮(如图),或者,快捷键M(如果在已有打点处,再次按M键会进入对标记点的设置界面,如下下图) 1.2 插件打点 一段音乐中,有明显的鼓点时,可以使用打点插件,快捷打点;如果鼓点不明显的话,最好还是手动打点,用插件打点会打出大量的标记点,…...

网页不同渲染方式的应对与反爬机制的处理——python爬虫

文章目录 写在前面爬虫习惯web 网页渲染方式服务器渲染客户端渲染 反爬机制使用session对象使用cookie让请求头信息更丰富使用代理和随机延迟 写在前面 本文是对前两篇文章所介绍的内容的补充&#xff0c;在了解前两篇文章——《爬虫入门与requests库的使用》和《BeautifulSou…...

高级电影感户外街拍人像摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 高级电影感户外街拍人像摄影后期 Lr 调色&#xff0c;是运用 Adobe Lightroom 软件&#xff0c;对户外街拍的人像照片进行后期处理&#xff0c;以塑造出具有电影质感的独特视觉效果。此调色过程借助 Lr 丰富的工具与功能&#xff0c;从色彩、光影、对比度等多维度着手…...

JAVA设计模式——(三)桥接模式

JAVA设计模式——&#xff08;三&#xff09;桥接模式&#xff08;Bridge Pattern&#xff09; 介绍理解实现武器抽象类武器实现类涂装颜色的行为接口具体颜色的行为实现让行为影响武器修改武器抽象类修改实现类 测试 适用性 介绍 将抽象和实现解耦&#xff0c;使两者可以独立…...

类加载器与jvm的内存

1. 类加载器与内存的关系 类加载器的字节码放在方法区&#xff08;元空间&#xff09;中&#xff0c;同时类加载器加载类后类的信息&#xff08;成员变量、成员方法及修饰符等&#xff09;存放在方法区中。类的信息所占内存的回收要同时满足两个条件&#xff1a;类的实例被回收…...

docker 配置代理

说明&#xff1a;该方法仅对 docker 程序本身拉取镜像的时候有效&#xff0c;对命令行无效。 docker 配置代理有 2 中方法 1.Daemon configuration 直接在 /etc/docker/daemon.json 文件中配置 {"proxies": {"http-proxy": "http://proxy.example.…...

【硬核干货】JetBrains AI Assistant 干货笔记

快进来抄作业&#xff0c;小编呕心沥血整理的 JetBrains AI Assistant 超干货笔记&#xff01; 原文链接&#xff1a;【硬核干货】JetBrains AI Assistant 干货笔记 关于晓数神州 晓数神州坚持以“客户为中心”的宗旨&#xff0c;为客户提供专业的解决方案和技术服务&#xff…...

Linux部署ragflow,从安装docker开始~

安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹&#xff0c;存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了&#xff0c;接…...

施磊老师基于muduo网络库的集群聊天服务器(七)

文章目录 数据表字符集问题支持中文和英文**为什么使用 utf8mb4&#xff1f;** 推荐 查看整个表, 再单独修改 客户端群组功能创建群组添加群组群组聊天接收在线群组消息接收离线群组消息补充服务器事件处理器补充服务器查询群组列表问题解决测试 目前报错总结目前为止最恶心的错…...

多态以及多态底层的实现原理

本章目标 1.多态的概念 2.多态的定义实现 3.虚函数 4.多态的原理 1.多态的概念 多态作为面对三大特性之一,它所指代的和它的名字一样,多种形态.但是这个多种形态更多的指代是函数的多种形态. 多态分为静态多态和动态多态. 静态多态在前面已经学习过了,就是函数重载以及模板,…...

使用Go语言实现轻量级消息队列

文章目录 一、引言1.1 消息队列的重要性1.2 为什么选择Go语言1.3 本文实现的轻量级消息队列特点 二、核心设计2.1 消息队列的基本概念2.1.1 消息类型定义2.1.2 消息结构设计 2.2 架构设计2.2.1 基于Go channel的实现方案2.2.2 单例模式的应用2.2.3 并发安全设计 2.3 消息发布与…...

Vue3后代组件多祖先通讯设计方案

在 Vue3 中&#xff0c;当需要设计一个被多个祖先组件使用的后代组件的通讯方式时&#xff0c;可以采用以下方案&#xff08;根据场景优先级排序&#xff09;&#xff1a; 方案一&#xff1a;依赖注入&#xff08;Provide/Inject&#xff09; 响应式上下文 推荐场景&#xff…...

路由与OSPF学习

【路由是跨网段通讯的必要条件】 路由指的是在网络中&#xff0c;数据包从源主机传输到目的主机的路径选择过程。 路由通常涉及以下几个关键元素&#xff1a; 1.路由器&#xff1a;是一种网络设备&#xff0c;负责将数据包从一个网络传输到另一个网络。路由器根据路由表来决定…...

CUDA编程之Grid、Block、Thread线程模型

一、线程模型:Grid、Block、Thread概念 ‌1. 层级定义‌ ‌Thread(线程)‌ CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间‌。 ‌Block(线程块)‌ 由多个线程组成(通常为32的倍数),是逻辑上的并…...

postgres 导出导入(基于数据库,模式,表)

在 PostgreSQL 中&#xff0c;导出和导入数据库、模式&#xff08;schema&#xff09;或表的数据可以使用多种工具和方法。以下是常用的命令和步骤&#xff0c;分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…...

小学数学出题器:自动化作业生成

小学数学出题器是专为教师、家长设计的自动化作业生成工具&#xff0c;通过预设参数快速生成符合教学要求的练习题&#xff0c;大幅降低备课与辅导压力。‌跨平台兼容‌&#xff1a;支持 Windows 系统免安装运行&#xff08;解压即用&#xff09;。‌免费无广告‌&#xff1a;永…...

systemctl 命令详解与常见问题解决

在 Linux 系统中&#xff0c;service 命令和 chkconfig 命令一直用于管理服务&#xff0c;但随着 systemd 的引入&#xff0c;systemctl 命令逐渐成为主流。systemctl 命令不仅功能强大&#xff0c;而且使用简单。本文将详细介绍 systemctl 命令的作用以及常见问题的解决方法。…...

12.桥接模式:思考与解读

原文地址:桥接模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在软件设计中&#xff0c;尤其是在处理复杂系统时&#xff0c;你是否遇到过这样的情况&#xff1a;你的系统中有多个功能模块&#xff0c;而这些功能模块需要与不同的平台…...

卷积神经网络迁移学习:原理与实践指南

引言 在深度学习领域&#xff0c;卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而&#xff0c;从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案&#xff0c;它能够将预训练模型的知识…...

Centos虚拟机远程连接缓慢

文章目录 Centos虚拟机远程连接缓慢1. 问题&#xff1a;SSH远程连接卡顿现象2. 原因&#xff1a;SSH服务端DNS检测机制3. 解决方案&#xff1a;禁用DNS检测与性能调优3.1 核心修复步骤3.2 辅助优化措施 4. 扩展认识&#xff1a;SSH协议的核心机制4.1 SSH工作原理4.2 关键配置文…...

Spark与Hadoop之间的联系和对比

&#xff08;一&#xff09;Spark概述 Apache Spark 是一个快速、通用、可扩展的大数据处理分析引擎。它最初由加州大学伯克利分校 AMPLab 开发&#xff0c;后成为 Apache 软件基金会的顶级项目。Spark 以其内存计算的特性而闻名&#xff0c;能够在内存中对数据进行快速处理&am…...

C++学习笔记(三十九)——STL之删除算法

STL 算法分类&#xff1a; 类别常见算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器内容删除remove、remove_if、unique等删除元素归约for…...

C++——Lambda表达式

在C中&#xff0c;Lambda表达式是一种匿名函数对象&#xff0c;它允许你在代码中直接定义一个函数&#xff0c;而不需要提前声明一个单独的函数。Lambda表达式是从C11标准开始引入的&#xff0c;它极大地增强了C语言的灵活性和表达能力&#xff0c;尤其在处理函数对象、回调函数…...

基于线性LDA算法对鸢尾花数据集进行分类

基于线性LDA算法对鸢尾花数据集进行分类 1、效果 2、流程 1、加载数据集 2、划分训练集、测试集 3、创建模型 4、训练模型 5、使用LDA算法 6、画图3、示例代码 # 基于线性LDA算法对鸢尾花数据集进行分类# 基于线性LDA算法对鸢尾花数据集进行分类 import numpy as np import …...

【Deepseek基础篇】--v3基本架构

目录 MOE参数 1.基本架构 1.1. Multi-Head Latent Attention多头潜在注意力 1.2.无辅助损失负载均衡的 DeepSeekMoE 2.多标记预测 2.1. MTP 模块 论文地址&#xff1a;https://arxiv.org/pdf/2412.19437 DeepSeek-V3 是一款采用 Mixture-of-Experts&#xff08;MoE&…...

从爬楼梯到算法世界:动态规划与斐波那契的奇妙邂逅

从爬楼梯到算法世界&#xff1a;动态规划与斐波那契的奇妙邂逅 在算法学习的旅程中&#xff0c;总有一些经典问题让人印象深刻。“爬楼梯问题”就是其中之一&#xff0c;看似简单的题目&#xff0c;却蕴藏了动态规划与斐波那契数列的深刻联系。今天&#xff0c;我就以这个问题…...

centos7使用yum快速安装最新版本Jenkins-2.462.3

Jenkins支持多种安装方式&#xff1a;yum安装、war包安装、Docker安装等。 官方下载地址&#xff1a;https://www.jenkins.io/zh/download 本次实验使用yum方式安装Jenkins LTS长期支持版&#xff0c;版本为 2.462.3。 一、Jenkins基础环境的安装与配置 1.1&#xff1a;基本…...