STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)

  • 一、SSD1306和SSD1315
  • 二、电路原理图(SPI接法)
  • 三、STM32_SPI
  • 四、STM32_DMA
  • 五、代码
    • OLED.c
    • OLED.h
    • OLED_Library.h
    • Delay.h
  • 六、调用方法
    • 例:main.c
  • 七、该库函数的优缺点
    • 优点
    • 缺点

一、SSD1306和SSD1315

分辨率都是128*64,电压都在3.3V最佳,这两者可互相替代,但价格上SSD1315会比SSD1306便宜,毕竟用的人少。

二、电路原理图(SPI接法)

为了提高屏幕的刷新速度(帧率),SPI接法远远优于IIC接法。
电路图如下:

其中:

  1. 电源为3.3V显示效果最佳。
  2. 电阻电容封装建议大于等于0402

这里OLED的四条SPI信号线,直接对接在STM32对应的SPI接口上。

本龙使用的芯片是最廉价的STM32F103C6T6A,接到了其SPI1接口上。

其中:

  1. 这四条SPI信号线建议越短越好,并尽量避免过多的绕线,即从OLED屏幕引脚到STM32芯片的距离尽量要短,以减小周围信号对SPI信号线的干扰,避免屏幕显示异常。
  2. SPI的四条信号线建议间距为7~10mil,并排一起走。
  3. SPI的四条信号线与其他信号的距离建议≥20mil。

三、STM32_SPI

作者@Swiler的文章《STM32之SPI详细解析》讲的很好,可以参考一下。

四、STM32_DMA

作者@Z小旋的文章《【STM32】 DMA原理,步骤超细详解,一文看懂DMA》讲的很好,可以参考一下。

五、代码

OLED.c

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "OLED_Library.h"// OLED屏幕ISP接口初始化
void OLED_IO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化PA5(SCL),PA7(SDA)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化PA4(RST),PA6(DC)GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_7); // PA5 and PA7上拉SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;           //设置SPI单线只发送SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   // SPI 发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                          //串行同步时钟的空闲状态为低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                        //第1个跳变沿数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                           // NSS主机片选信号(CS)由软件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //预分频 16// SPI 速度设置函数(调整传输速度快慢 只有4个分频可选)// SPI_BaudRatePrescaler_2 2 分频 (SPI 36M@sys 72M)// SPI_BaudRatePrescaler_8 8 分频 (SPI 9M@sys 72M)// SPI_BaudRatePrescaler_16 16 分频 (SPI 4.5M@sys 72M)// SPI_BaudRatePrescaler_256 256 分频 (SPI 281.25K@sys 72M)SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 高位开始 低位为LSBSPI_InitStructure.SPI_CRCPolynomial = 7;           // CRC 值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);                //根据指定的参数初始化外设 SPIx 寄存器SPI1->CR2 = 1 << 1;                                //允许DMA往缓冲区内发送SPI_Cmd(SPI1, ENABLE); //使能 SPI 外设
};uint8_t OLED_SRAM[8][128]; //图像储存在SRAM里void OLED_DMA_Init(void)
{DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能 DMA 时钟DMA_DeInit(DMA1_Channel3);DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI1->DR;              // DMA 外设 ADC 基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)OLED_SRAM;                  // DMA 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      //从储存器读取发送到外设DMA_InitStructure.DMA_BufferSize = 1024;                                // DMA 通道的 DMA 缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 //内存地址递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 8 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 8 位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                         //工作在循环传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;                   // DMA 通道 x 拥有中优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            //非内存到内存传输DMA_Init(DMA1_Channel3, &DMA_InitStructure);                            //根据指定的参数初始化// DMA_Cmd(DMA1_Channel3, DISABLE); //不使能DMA1 CH3所指示的通道DMA_Cmd(DMA1_Channel3, ENABLE); //使能DMA1 CH3所指示的通道
}void OLED_SendCmd(u8 TxData) //发送命令
{OLED_DC_CMD(); //命令模式while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的 SPI标志位设置与否:发送缓存空标志位{for (u8 retry = 0; retry < 200; retry++);return;}Delay_ms(100);SPI_I2S_SendData(SPI1, TxData); //通过外设 SPIx 发送一个数据OLED_DC_DAT(); //数据模式
}// OLED初始化函数
void OLED_Init(void)
{OLED_IO_Init(); //端口初始化Delay_s(1); //延时1秒稳定端口状态OLED_RST_OFF(); // OLED复位Delay_ms(10);   //复位延时OLED_RST_ON();  //结束复位OLED_SendCmd(0xae); //关闭显示OLED_SendCmd(0xd5); //设置时钟分频因子,震荡频率OLED_SendCmd(0x80); //[3:0],分频因子;[7:4],震荡频率OLED_SendCmd(0x81); //设置对比度OLED_SendCmd(0x7f); // 128OLED_SendCmd(0x8d); //设置电荷泵开关OLED_SendCmd(0x14); //开OLED_SendCmd(0x20); //设置模式OLED_SendCmd(0x00); //设置为水平地址模式OLED_SendCmd(0x21); //设置列地址的起始和结束的位置OLED_SendCmd(0x00); // 0OLED_SendCmd(0x7f); // 127OLED_SendCmd(0x22); //设置页地址的起始和结束的位置OLED_SendCmd(0x00); // 0OLED_SendCmd(0x07); // 7OLED_SendCmd(0xc8); // 0xc9上下反置 0xc8正常OLED_SendCmd(0xa1); // 0xa0左右反置 0xa1正常OLED_SendCmd(0xa4); //全局显示开启;0xa4正常,0xa5无视命令点亮全屏OLED_SendCmd(0xa6); //设置显示方式;bit0:1,反相显示;0,正常显示OLED_SendCmd(0xaf); //开启显示OLED_SendCmd(0x56);OLED_DMA_Init(); // DMA初始化
}//指定位置显示单字符,X+Y+单字符
void OLED_Write(u8 x, u8 y, u8 *ascii)
{u8 i = 0, c = *ascii;for (i = 0; i < 6; i++)OLED_SRAM[y][x + i] = YIN_F6X8[(c - 32) * 6 + 1 + i];
}//清屏--全灭
void OLED_Clear(void)
{for (u8 y = 0; y < 7; y++)for (u8 x = 0; x < 126; x += 6)OLED_ZFC(x, y, " ");
}char OLED_zfc[] = {0}; //字符转化为字符串储存于此数组//显示多个字符,x+y+字符串
void OLED_ZFC(u8 x, u8 y, u8 *chr)
{u8 j = 0;while (chr[j] != '\0'){u8 c = chr[j];for (u8 i = 0; i < 6; i++)OLED_SRAM[y][x + i] = YIN_F6X8[(c - 32) * 6 + 1 + i];x += 6;if (x > 120)//自动换行{x = 0;y++;}j++;}
}

OLED.h

#ifndef __OLED_H
#define __OLED_H#include "stm32f10x.h"#pragma diag_suppress 167, 940 //消除格式警告
extern char OLED_zfc[]; //字符转化为字符串储存于此数组#define OLED_SCL_CLR() GPIO_ResetBits(GPIOA, GPIO_Pin_5) //时钟
#define OLED_SCL_SET() GPIO_SetBits(GPIOA, GPIO_Pin_5)#define OLED_SDA_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_7) // MOSI主设备输出
#define OLED_SDA_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_7)#define OLED_RST_OFF() GPIO_ResetBits(GPIOA, GPIO_Pin_4) //接低电平复位
#define OLED_RST_ON() GPIO_SetBits(GPIOA, GPIO_Pin_4)#define OLED_DC_CMD() GPIO_ResetBits(GPIOA, GPIO_Pin_6) //模式
#define OLED_DC_DAT() GPIO_SetBits(GPIOA, GPIO_Pin_6)void OLED_IO_Init(void);                   // GPIO和SPI初始化
void OLED_Write(u8 lie, u8 ye, u8 *ascii); //写入ASCII文字
void OLED_SendCmd(u8 TxData);              //发送命令void OLED_Clear(void);
void OLED_ZFC(u8 x, u8 y, u8 *chr);void OLED_Init(void);     // OLED初始化
void OLED_DMA_Init(void); // DMA初始化#endif

OLED_Library.h

#ifndef __OLED_LIBRARY_H
#define __OLED_LIBRARY_Hconst u8 YIN_F6X8[] ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // !0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $0x00, 0x62, 0x64, 0x08, 0x13, 0x23, // %0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // &0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // -0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // .0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 10x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 40x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 60x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 70x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 90x00, 0x00, 0x36, 0x36, 0x00, 0x00, // :0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // <0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // =0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // >0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // '0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z0x14, 0x14, 0x14, 0x14, 0x14, 0x14  // horiz lines
};#endif

其中:

  1. 因为STM32F103C6T6A的FLASH比较小,放不了多少中文,所以在驱动里没有放置中文的函数封装,有兴趣可以自己编写,后面有空我可能会在这里加上,原理是一样的。
  2. 因为屏幕小,不够显示的,所以我使用的是6*8大小的字符,节省空间,也减小字符库的缓存。

Delay.h

使用系统时钟SysTick的延时函数

六、调用方法

例:main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"int main(void)
{Delay_Init();//延时初始化OLED_Init();//OLED_SPI初始化OLED_ZFC(0, 0, "DRAGON");//在OLED屏幕的X轴为0,Y轴为0,显示字符串“DRAGON”OLED_ZFC(21, 3, "Hello 2022,I Love You!!!!!!!!!");//在OLED屏幕的X轴为21,Y轴为3,显示字符串“Hello 2022,I Love You!!!!!!!!!”,不够显示自动换行OLED_ZFC(4, 6, "2022");//在OLED屏幕的X轴为4,Y轴为6,显示字符串“2022”
}

效果如下

PS:

  1. 旁白有蓝色指示灯,光影效果别介意。
  2. 膜还没撕,有点糊,“I LOVE”那里有一个辅助撕膜的小突出,不是显示异常。

七、该库函数的优缺点

优点

  1. 跑的是DMA,不占用CPU,速度极快,本龙认为的STM32的极限刷新速度。
  2. 纯字符,不添加中文显示,极大优化代码大小。
  3. 显示字符大小为6*8,一个屏幕可以显示168个字符,且自动换行,平时显示参数极度够用。

缺点

  1. 刷新速度过快,导致字符跳动过快,眼睛和大脑还未读取信息就跳动了,所以需要在下次刷新屏幕前加一定的延时。
  2. 暂未添加中文显示,毕竟加了中文,很多FLASH比较小的STM32F103系列芯片装不了多少中文字符。

STM32F103系列_OLED屏幕(SSD1306、SSD1315驱动)SPI驱动【DMA】(高刷)相关推荐

  1. 总线驱动--SPI驱动

    总线驱动–SPI驱动 文章目录 总线驱动--SPI驱动 SPI主机驱动 1.spi_master 申请与释放 2.spi_master 的注册与注销 SPI设备驱动 SPI 设备和驱动匹配过程 I.M ...

  2. DJYOS驱动开发系列三:基于DJYOS的SPI驱动编写指导手册

    1.贡献者列表 深圳市秦简计算机系统有限公司DJYOS驱动开发团队. 2.概述 DJYOS的DjyBus总线模型为IIC.SPI之类的器件提供统一的访问接口,SPIBUS模块是DjyBus模块的一个子 ...

  3. [转载]Linux驱动-SPI驱动 之二:SPI通用接口层

    通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...

  4. 2:STM32CubeMX配置STM32F103C8T6驱动-SPI驱动

    STM32CubeMX下载地址: 下载界面 1:时钟 CS 2:模块 3:代码配置 u8 SPI_WriteByte(u8 Byte) {u8 rxdata = 1;HAL_GPIO_WritePin ...

  5. 4412 SPI驱动

    1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...

  6. 联盛德 HLK-W806 (八): 4线SPI驱动SSD1306/SSD1315 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  7. STM32—4线SPI驱动SSD1306 OLED

    文章目录 一.OLED简介 二.驱动SSD1306所需知识 1.引脚介绍 2.通信时序 3.显存GRAM 4.字库 5.SSD1306基本命令 三.代码讲解 1.相关引脚配置 2.模拟SPI通信 3. ...

  8. NanoPi NEO Air使用十一:编写SPI驱动点亮TFT屏幕,ST7789V

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  9. 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

    [全志T113-S3_100ask]15-1 内核5.4驱动spi屏幕--ILI9341 背景 (一)spi设备树 1.修改设备树 2.完善设备树 (二)使能内核 (三)兼容性修改 (四)测试 背景 ...

最新文章

  1. poj 1200 Crazy Search
  2. element ui怎么调图标的大小_大明:网页字体大小怎么调?教你方法一键搞定
  3. 设计模式:解释器模式(Interpreter)
  4. 设计mysql存储过程,MySQL的存储过程设计的例子
  5. logrotate 切割 nginx php mysql 日志
  6. Python爬取豆瓣网中即将上映的电影数据清单
  7. 服务器安装动易组件,动易SiteWeaver6.8安装方法
  8. 秩和比RSR法算法C语言,秩和比法(用秩和比法计算权重时怎样编秩?)
  9. MAC中配置SDK环境变量
  10. xp系统桌面图标出现阴影
  11. protal认证的稳定性测试脚本
  12. JavaWeb企业实战项目(一):环境搭建-用户注册-邮件发送
  13. Unity 回合制战斗系统(初级篇)
  14. latex怎么看论文字数_LaTeX | 为学术论文排版而生【公式篇】
  15. VMware VMotion迁移与原理
  16. 单片机基础(五):定时/计数器的工作原理及工作方式
  17. 浅谈游戏开发中逻辑与表现的分离
  18. mysql 调用方差函数_MYSQL基本常用函数
  19. 宅急送 项目第四天 取派员和区域管理
  20. 搭建S60手机端Python软件运行,开发,发布平台

热门文章

  1. 制作ppt模板,并把已存在ppt移植到新模板
  2. 03 为什么 React 16 要更改组件的生命周期?(下)
  3. 观点 | 区块链兼有信息互联网和价值互联网的功能
  4. 计算机like函数的用法,like的用法有几种?分别是什么,what's like 什么意思
  5. 基于 Matlab/simulink实现锂电池建模与仿真
  6. 为什么能把公司做成功的CEO,都很像唐僧?
  7. ubuntu22.10使用显卡驱动nvidia-driver-525-testd报错
  8. Realplay和mplayer的安装!
  9. 突发公共卫生事件智慧城市数据利用框架构建研究
  10. Windows中安装 MySQL8.0.30 数据库