MicroPython测试 ESP32-S3 + 8MB PSRAM + ST7789 屏幕
1.开发板ESP32-S3 WROOM-1-N8R82.屏幕ST7789按下列代码里的GPIO接线import machine import time import framebuf import math import gc # 硬件配置 PIN_SCL 9 PIN_SDA 8 PIN_CS 5 PIN_DC 6 PIN_RST 7 PIN_BL 4 SCREEN_W 240 SCREEN_H 240 # # --- 辅助函数手动实现画圆 (因为 framebuf 不支持) --- def draw_circle_pixel(fb, x0, y0, radius, color): 使用中点画圆算法绘制空心圆 x radius y 0 err 0 while x y: fb.pixel(x0 x, y0 y, color) fb.pixel(x0 y, y0 x, color) fb.pixel(x0 - y, y0 x, color) fb.pixel(x0 - x, y0 y, color) fb.pixel(x0 - x, y0 - y, color) fb.pixel(x0 - y, y0 - x, color) fb.pixel(x0 y, y0 - x, color) fb.pixel(x0 x, y0 - y, color) y 1 err 1 2 * y if 2 * (err - x) 1 0: x - 1 err 1 - 2 * x def fill_circle_pixel(fb, x0, y0, radius, color): 通过绘制水平线填充实心圆 (比逐个像素画快得多) x radius y 0 err 0 # 存储需要绘制的线段 (y, x_start, x_end) # 为了节省内存我们直接在循环里画线不存储 # 上半圆和下半圆一起处理 while x y: # 画四条水平线 (上下对称) # y 行 fb.line(x0 - x, y0 y, x0 x, y0 y, color) fb.line(x0 - x, y0 - y, x0 x, y0 - y, color) # x 行 (当 x ! y 时) if x ! y: fb.line(x0 - y, y0 x, x0 y, y0 x, color) fb.line(x0 - y, y0 - x, x0 y, y0 - x, color) y 1 err 1 2 * y if 2 * (err - x) 1 0: x - 1 err 1 - 2 * x # --- 1. 初始化 SPI 屏幕 (ST7789) --- class ST7789: def __init__(self, spi, cs, dc, rst, w, h): self.spi spi self.cs cs; self.dc dc; self.rst rst self.w w; self.h h for p in [cs, dc, rst]: p.init(machine.Pin.OUT, value1) rst.value(0); time.sleep_ms(10); rst.value(1); time.sleep_ms(120) cmds [ (0x01, []), (0x11, []), (0x36, [0x00]), (0x3A, [0x05]), (0xB2, [0x0C, 0x0C, 0x00, 0x33, 0x33]), (0xB7, [0x35]), (0xBB, [0x19]), (0xC0, [0x2C]), (0xC2, [0x01]), (0xC3, [0x12]), (0xC4, [0x20]), (0xC6, [0x0F]), (0xD0, [0xA4, 0xA1]), (0xE0, [0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0E, 0x12, 0x14, 0x17]), (0xE1, [0xD0, 0x00, 0x02, 0x07, 0x0A, 0x28, 0x31, 0x54, 0x47, 0x0E, 0x1C, 0x17, 0x1B, 0x1E]), (0x21, []), (0x29, []) ] for cmd, data in cmds: self._tx(cmd, False) if data: self._tx(bytes(data), True) if cmd 0x11: time.sleep_ms(120) self.set_window(0, 0, w-1, h-1) def _tx(self, data, is_dataFalse): self.dc(is_data) self.cs(0) if isinstance(data, int): data bytes([data]) self.spi.write(data) self.cs(1) def set_window(self, x0, y0, x1, y1): self._tx(0x2A, False); self._tx(bytes([x08, x00xff, x18, x10xff]), True) self._tx(0x2B, False); self._tx(bytes([y08, y00xff, y18, y10xff]), True) self._tx(0x2C, False) def write(self, buffer): self.dc(1) self.cs(0) self.spi.write(buffer) self.cs(1) # --- 2. 主程序逻辑 --- print(fPSRAM Free: {gc.mem_free() / 1024:.1f} KB) spi machine.SPI(1, baudrate60000000, polarity0, phase0, sckmachine.Pin(PIN_SCL), mosimachine.Pin(PIN_SDA)) lcd ST7789(spi, machine.Pin(PIN_CS), machine.Pin(PIN_DC), machine.Pin(PIN_RST), SCREEN_W, SCREEN_H) machine.Pin(PIN_BL, machine.Pin.OUT).value(1) print(Allocating Framebuffers...) try: buf1 bytearray(SCREEN_W * SCREEN_H * 2) buf2 bytearray(SCREEN_W * SCREEN_H * 2) fb1 framebuf.FrameBuffer(buf1, SCREEN_W, SCREEN_H, framebuf.RGB565) fb2 framebuf.FrameBuffer(buf2, SCREEN_W, SCREEN_H, framebuf.RGB565) print(Success!) except MemoryError: print(Memory Error!) raise frame_count 0 start_time time.ticks_ms() while True: current_time time.ticks_ms() idx frame_count % 2 fb fb1 if idx 0 else fb2 buf buf1 if idx 0 else buf2 # 清屏 fb.fill(0x0000) # 计算动画位置 t current_time / 1000.0 angle_x t * 2 * math.pi angle_y t * 3 * math.pi ball_x int(120 80 * math.sin(angle_x)) ball_y int(120 60 * math.cos(angle_y)) # 使用我们自定义的函数画圆 # 参数: framebuffer, 圆心x, 圆心y, 半径, 颜色 fill_circle_pixel(fb, ball_x, ball_y, 20, 0xF800) # 红色实心 draw_circle_pixel(fb, ball_x, ball_y, 20, 0xFFFF) # 白色边框 # 文字 fb.text(ESP32-S3 PSRAM Demo, 20, 10, 0x07E0) elapsed time.ticks_diff(current_time, start_time) if elapsed 0: fps frame_count * 1000 / elapsed fb.text(fFPS: {fps:.1f}, 20, 30, 0xFFFF) fb.text(fFrame: {frame_count}, 20, 50, 0xFFFF) fb.text(fX:{ball_x} Y:{ball_y}, 20, 70, 0xFFE0) # 发送数据 lcd.set_window(0, 0, SCREEN_W-1, SCREEN_H-1) lcd.write(buf) frame_count 1 # 控制帧率 (~30 FPS) target_frame_time 33 current_frame_time time.ticks_diff(time.ticks_ms(), current_time) sleep_time target_frame_time - current_frame_time if sleep_time 0: time.sleep_ms(sleep_time)运行效果

相关新闻

伏羲天气预报保姆级教程:output.nc中lat/lon坐标系与WGS84标准对齐方法

伏羲天气预报保姆级教程:output.nc中lat/lon坐标系与WGS84标准对齐方法

伏羲天气预报保姆级教程:output.nc中lat/lon坐标系与WGS84标准对齐方法 重要提示:本文基于复旦大学开发的FuXi中期气象大模型,专注于解决天气预报输出数据中的坐标系对齐问题,确保气象数据在不同系统间的兼容性和准确性。 1. 为什…

2026/7/13 16:11:56 阅读更多 →
瑜伽空间设计灵感生成:雯雯的后宫-造相Z-Image-瑜伽女孩背景元素拓展案例

瑜伽空间设计灵感生成:雯雯的后宫-造相Z-Image-瑜伽女孩背景元素拓展案例

瑜伽空间设计灵感生成:雯雯的后宫-造相Z-Image-瑜伽女孩背景元素拓展案例 1. 项目简介与核心价值 雯雯的后宫-造相Z-Image-瑜伽女孩是一个专门用于生成瑜伽主题图片的AI模型服务。这个模型基于Z-Image-Turbo的lora版本,经过专门训练,能够生…

2026/7/10 17:42:11 阅读更多 →
python hive spark hadoop房价预测系统 预测算法 商品房 机器学习房源信息分析可视化

python hive spark hadoop房价预测系统 预测算法 商品房 机器学习房源信息分析可视化

1、项目介绍 58同城房产数据分析与预测项目介绍本项目以58同城房产数据为核心,基于Python语言构建,融合MySQL、Flask 、Echarts等多技术栈,打造集数据采集、分析、预测于一体的综合房产数据平台。通过requests爬虫定向抓取房产信息&#xff0…

2026/7/10 10:58:41 阅读更多 →

最新新闻

TMR-SOMA-RP-v1社区贡献指南:如何参与项目开发与改进

TMR-SOMA-RP-v1社区贡献指南:如何参与项目开发与改进

TMR-SOMA-RP-v1社区贡献指南:如何参与项目开发与改进 【免费下载链接】TMR-SOMA-RP-v1 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/TMR-SOMA-RP-v1 欢迎来到TMR-SOMA-RP-v1社区贡献指南!作为NVIDIA开发的文本到动作检索模型&#xff0…

2026/7/13 21:24:26 阅读更多 →
Unity 2D帧动画进阶:5大核心技巧打造流畅角色动画系统

Unity 2D帧动画进阶:5大核心技巧打造流畅角色动画系统

1. 项目概述:从“会动”到“动得好”在Unity里让一个2D角色动起来,对很多开发者来说,可能只是把一堆Sprite拖进Animation窗口,然后播放。但当你真正投入到一个商业项目,或者希望你的独立游戏拥有媲美大厂的手感时&…

2026/7/13 21:24:26 阅读更多 →
Nanite监控与故障恢复:确保Ruby服务稳定运行的10个关键策略

Nanite监控与故障恢复:确保Ruby服务稳定运行的10个关键策略

Nanite监控与故障恢复:确保Ruby服务稳定运行的10个关键策略 【免费下载链接】nanite self assembling fabric of ruby daemons 项目地址: https://gitcode.com/gh_mirrors/nani/nanite 在构建分布式Ruby应用时,确保服务的高可用性和故障恢复能力至…

2026/7/13 21:18:24 阅读更多 →
Ruby JSON库高级用法:自定义类型序列化与反序列化终极指南

Ruby JSON库高级用法:自定义类型序列化与反序列化终极指南

Ruby JSON库高级用法:自定义类型序列化与反序列化终极指南 【免费下载链接】json JSON implementation for Ruby 项目地址: https://gitcode.com/gh_mirrors/json13/json JSON作为现代Web开发中最常用的数据交换格式,在Ruby开发中扮演着至关重要的…

2026/7/13 21:18:24 阅读更多 →
别再随意切割地层!六层PCB分割核心原理与底层设计

别再随意切割地层!六层PCB分割核心原理与底层设计

在六层 PCB 硬件设计中,地层分割是区分新手工程师与资深布局人员的关键环节。绝大多数项目 EMC 辐射超标、信号采样失真、电源纹波过大、温循后电路板异常干扰,追溯根源都指向地层分割方案不合理。很多设计者仅为避让引脚、腾出布线空间随意开槽分割&…

2026/7/13 21:16:23 阅读更多 →
从入门到精通:GlassActionBar API完全参考手册

从入门到精通:GlassActionBar API完全参考手册

从入门到精通:GlassActionBar API完全参考手册 【免费下载链接】GlassActionBar Android - a library that adds a glass-like effect to the action bar. 项目地址: https://gitcode.com/gh_mirrors/gl/GlassActionBar 想要为你的Android应用添加惊艳的玻璃…

2026/7/13 21:10:22 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻