【WCH】CH32F203软件I2C驱动SSD1306 OLED

2023-10-21 02:59

本文主要是介绍【WCH】CH32F203软件I2C驱动SSD1306 OLED,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【WCH】CH32F203软件I2C驱动SSD1306 OLED


  • 📌相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》
  • 📺驱动显示效果:
    在这里插入图片描述
  • 🌿OLED屏幕:i2c ssd1306 oled
  • 🔖驱动单片机型号:CH32F203
  • ✨由于CH32F203主频为96MHz,测试了144MHz下也可以驱动显示。如果是从屏幕厂商提供的程序,需要修改相应的延时时间来匹配通讯时序。
    在这里插入图片描述

📑引脚定义

 I2C1_SCL(PB8)I2C1_SDA(PB9).

📑OLED驱动程序

  • 🌿oled.c
#include "oled.h"
#include "oledfont.h"static u8 OLED_GRAM[144][8];void OLED_ColorTurn(u8 i)//反显函数
{if(i == 0){OLED_WR_Byte(0xA6, OLED_CMD); //正常显示}if(i == 1){OLED_WR_Byte(0xA7, OLED_CMD); //反色显示}
}//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{if(i == 0){OLED_WR_Byte(0xC8, OLED_CMD); //正常显示OLED_WR_Byte(0xA1, OLED_CMD);}if(i == 1){OLED_WR_Byte(0xC0, OLED_CMD); //反转显示OLED_WR_Byte(0xA0, OLED_CMD);}
}//延时
static void IIC_delay(void)
{u8 t = 3*10;while(t--);
}//起始信号
static void I2C_Start(void)
{OLED_SDA_Set();OLED_SCL_Set();IIC_delay();OLED_SDA_Clr();IIC_delay();OLED_SCL_Clr();IIC_delay();
}//结束信号
static void I2C_Stop(void)
{OLED_SDA_Clr();OLED_SCL_Set();IIC_delay();OLED_SDA_Set();
}//等待信号响应
static void I2C_WaitAck(void) //测数据信号的电平
{OLED_SDA_Set();IIC_delay();OLED_SCL_Set();IIC_delay();OLED_SCL_Clr();IIC_delay();
}//写入一个字节
static void Send_Byte(u8 dat)
{u8 i;for(i = 0; i < 8; i++){if(dat & 0x80) //将dat的8位从最高位依次写入{OLED_SDA_Set();}else{OLED_SDA_Clr();}IIC_delay();OLED_SCL_Set();IIC_delay();OLED_SCL_Clr();//将时钟信号设置为低电平dat <<= 1;}
}//发送一个字节
//mode:数据/命令标志 0,表示命令;1,表示数据;
static void OLED_WR_Byte(u8 dat, u8 mode)
{I2C_Start();Send_Byte(0x78);I2C_WaitAck();if(mode){Send_Byte(0x40);}else{Send_Byte(0x00);}I2C_WaitAck();Send_Byte(dat);I2C_WaitAck();I2C_Stop();
}//开启OLED显示
void OLED_DisPlay_On(void)
{OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵使能OLED_WR_Byte(0x14, OLED_CMD); //开启电荷泵OLED_WR_Byte(0xAF, OLED_CMD); //点亮屏幕
}//关闭OLED显示
void OLED_DisPlay_Off(void)
{OLED_WR_Byte(0x8D, OLED_CMD); //电荷泵使能OLED_WR_Byte(0x10, OLED_CMD); //关闭电荷泵OLED_WR_Byte(0xAE, OLED_CMD); //关闭屏幕
}//更新显存到OLED
void OLED_Refresh(void)
{u8 i, n;for(i = 0; i < 8; i++){OLED_WR_Byte(0xb0 + i, OLED_CMD); //设置行起始地址OLED_WR_Byte(0x00, OLED_CMD);  //设置低列起始地址OLED_WR_Byte(0x10, OLED_CMD);  //设置高列起始地址I2C_Start();Send_Byte(0x78);I2C_WaitAck();Send_Byte(0x40);I2C_WaitAck();for(n = 0; n < 128; n++){Send_Byte(OLED_GRAM[n][i]);I2C_WaitAck();}I2C_Stop();}
}
//清屏函数
void OLED_Clear(void)
{u8 i, n;for(i = 0; i < 8; i++){for(n = 0; n < 128; n++){OLED_GRAM[n][i] = 0; //清除所有数据}}OLED_Refresh();//更新显示
}//画点
//x:0~127
//y:0~63
//t:1 填充 0,清空
void OLED_DrawPoint(u8 x, u8 y, u8 t)
{u8 i, m, n;i = y / 8;m = y % 8;n = 1 << m;if(t){OLED_GRAM[x][i] |= n;}else{OLED_GRAM[x][i] = ~OLED_GRAM[x][i];OLED_GRAM[x][i] |= n;OLED_GRAM[x][i] = ~OLED_GRAM[x][i];}
}//画线
//x1,y1:起点坐标
//x2,y2:结束坐标
void OLED_DrawLine(u8 x1, u8 y1, u8 x2, u8 y2, u8 mode)
{u16 t;int xerr = 0, yerr = 0, delta_x, delta_y, distance;int incx, incy, uRow, uCol;delta_x = x2 - x1; //计算坐标增量delta_y = y2 - y1;uRow = x1; //画线起点坐标uCol = y1;if(delta_x > 0)incx = 1; //设置单步方向else if(delta_x == 0)incx = 0; //垂直线else{incx = -1;delta_x = -delta_x;}if(delta_y > 0)incy = 1;else if(delta_y == 0)incy = 0; //水平线else{incy = -1;delta_y = -delta_x;}if(delta_x > delta_y)distance = delta_x; //选取基本增量坐标轴else distance = delta_y;for(t = 0; t < distance + 1; t++){OLED_DrawPoint(uRow, uCol, mode); //画点xerr += delta_x;yerr += delta_y;if(xerr > distance){xerr -= distance;uRow += incx;}if(yerr > distance){yerr -= distance;uCol += incy;}}
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x, u8 y, u8 r)
{int a, b, num;a = 0;b = r;while(2 * b * b >= r * r){OLED_DrawPoint(x + a, y - b, 1);OLED_DrawPoint(x - a, y - b, 1);OLED_DrawPoint(x - a, y + b, 1);OLED_DrawPoint(x + a, y + b, 1);OLED_DrawPoint(x + b, y + a, 1);OLED_DrawPoint(x + b, y - a, 1);OLED_DrawPoint(x - b, y - a, 1);OLED_DrawPoint(x - b, y + a, 1);a++;num = (a * a + b * b) - r * r; //计算画的点离圆心的距离if(num > 0){b--;a--;}}
}//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 size1, u8 mode)
{u8 i, m, temp, size2, chr1;u8 x0 = x, y0 = y;if(size1 == 8)size2 = 6;else size2 = (size1 / 8 + ((size1 % 8) ? 1 : 0)) * (size1 / 2); //得到字体一个字符对应点阵集所占的字节数chr1 = chr - ' '; //计算偏移后的值for(i = 0; i < size2; i++){if(size1 == 8){temp = asc2_0806[chr1][i];   //调用0806字体}else if(size1 == 12){temp = asc2_1206[chr1][i];   //调用1206字体}else if(size1 == 16){temp = asc2_1608[chr1][i];   //调用1608字体}else if(size1 == 24){temp = asc2_2412[chr1][i];   //调用2412字体}else return;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((size1 != 8) && ((x - x0) == size1 / 2)){x = x0;y0 = y0 + 8;}y = y0;}
}//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x, u8 y, u8* chr, u8 size1, u8 mode)
{while((*chr >= ' ') && (*chr <= '~')) //判断是不是非法字符!{OLED_ShowChar(x, y, *chr, size1, mode);if(size1 == 8)x += 6;else x += size1 / 2;chr++;}
}//m^n
static u32 OLED_Pow(u8 m, u8 n)
{u32 result = 1;while(n--){result *= m;}return result;
}//显示数字
//x,y :起点坐标
//num :要显示的数字
//len :数字的位数
//size:字体大小
//mode:0,反色显示;1,正常显示
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size1, u8 mode)
{u8 t, temp, m = 0;if(size1 == 8)m = 2;for(t = 0; t < len; t++){temp = (num / OLED_Pow(10, len - t - 1)) % 10;if(temp == 0){OLED_ShowChar(x + (size1 / 2 + m)*t, y, '0', size1, mode);}else{OLED_ShowChar(x + (size1 / 2 + m)*t, y, temp + '0', size1, mode);}}
}//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x, u8 y, u8 num, u8 size1, u8 mode)
{u8 m, temp;u8 x0 = x, y0 = y;u16 i, size3 = (size1 / 8 + ((size1 % 8) ? 1 : 0)) * size1; //得到字体一个字符对应点阵集所占的字节数for(i = 0; i < size3; i++){if(size1 == 16){temp = Hzk1[num][i];   //调用16*16字体}else if(size1 == 24){temp = Hzk2[num][i];   //调用24*24字体}else if(size1 == 32){temp = Hzk3[num][i];   //调用32*32字体}else if(size1 == 64){temp = Hzk4[num][i];   //调用64*64字体}else return;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((x - x0) == size1){x = x0;y0 = y0 + 8;}y = y0;}
}
//默认左移
//num 显示汉字的个数
//space 每一遍显示的间隔
//mode:0,反色显示;1,正常显示
void OLED_ScrollDisplay(u8 num, u8 space, u8 mode)
{u8 i, n, t = 0, m = 0, r;while(1){if(m == 0){OLED_ShowChinese(128, 0, t, 16, mode); //写入一个汉字保存在OLED_GRAM[][]数组中t++;}if(t == num){for(r = 0; r < 16 * space; r++) //显示间隔{for(i = 1; i < 144; i++){for(n = 0; n < 8; n++){OLED_GRAM[i - 1][n] = OLED_GRAM[i][n];}}OLED_Refresh();}t = 0;}m++;if(m == 16){m = 0;}for(i = 1; i < 144; i++) //实现左移{for(n = 0; n < 8; n++){OLED_GRAM[i - 1][n] = OLED_GRAM[i][n];}}OLED_Refresh();}
}//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x, u8 y, u8 sizex, u8 sizey, u8 BMP[], u8 mode)
{u16 j = 0;u8 i, n, temp, m;u8 x0 = x, y0 = y;sizey = sizey / 8 + ((sizey % 8) ? 1 : 0);for(n = 0; n < sizey; n++){for(i = 0; i < sizex; i++){temp = BMP[j];j++;for(m = 0; m < 8; m++){if(temp & 0x01)OLED_DrawPoint(x, y, mode);else OLED_DrawPoint(x, y, !mode);temp >>= 1;y++;}x++;if((x - x0) == sizex){x = x0;y0 = y0 + 8;}y = y0;}}
}
//OLED的初始化
void OLED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);	 //使能A端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC, GPIO_Pin_12);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_SetBits(GPIOD, GPIO_Pin_2);OLED_RES_Clr();Delay_Ms(200);OLED_RES_Set();OLED_WR_Byte(0xAE, OLED_CMD); //--turn off oled panelOLED_WR_Byte(0x00, OLED_CMD); //---set low column addressOLED_WR_Byte(0x10, OLED_CMD); //---set high column addressOLED_WR_Byte(0x40, OLED_CMD); //--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81, OLED_CMD); //--set contrast control registerOLED_WR_Byte(0xCF, OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1, OLED_CMD); //--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8, OLED_CMD); //Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6, OLED_CMD); //--set normal displayOLED_WR_Byte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f, OLED_CMD); //--1/64 dutyOLED_WR_Byte(0xD3, OLED_CMD); //-set display offset	Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00, OLED_CMD); //-not offsetOLED_WR_Byte(0xd5, OLED_CMD); //--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0x80, OLED_CMD); //--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9, OLED_CMD); //--set pre-charge periodOLED_WR_Byte(0xF1, OLED_CMD); //Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA, OLED_CMD); //--set com pins hardware configurationOLED_WR_Byte(0x12, OLED_CMD);OLED_WR_Byte(0xDB, OLED_CMD); //--set vcomhOLED_WR_Byte(0x40, OLED_CMD); //Set VCOM Deselect LevelOLED_WR_Byte(0x20, OLED_CMD); //-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02, OLED_CMD); //OLED_WR_Byte(0x8D, OLED_CMD); //--set Charge Pump enable/disableOLED_WR_Byte(0x14, OLED_CMD); //--set(0x10) disableOLED_WR_Byte(0xA4, OLED_CMD); // Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6, OLED_CMD); // Disable Inverse Display On (0xa6/a7)OLED_Clear();OLED_WR_Byte(0xAF, OLED_CMD);
}
  • 🌿oled.h
#ifndef __OLED_H
#define __OLED_H #include "debug.h"
#include "stdlib.h"//-----------------OLED端口定义---------------- #define OLED_SCL_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SCL
#define OLED_SCL_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)#define OLED_SDA_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SDA
#define OLED_SDA_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)#define OLED_RES_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_2)//RES
#define OLED_RES_Set() GPIO_SetBits(GPIOA,GPIO_Pin_2)#define OLED_CMD  0	//写命令
#define OLED_DATA 1	//写数据void OLED_ClearPoint(u8 x,u8 y);
void OLED_ColorTurn(u8 i);
void OLED_DisplayTurn(u8 i);
static void I2C_Start(void);
static void I2C_Stop(void);
static void I2C_WaitAck(void);
static void Send_Byte(u8 dat);
static void OLED_WR_Byte(u8 dat,u8 mode);
void OLED_DisPlay_On(void);
void OLED_DisPlay_Off(void);
void OLED_Refresh(void);
void OLED_Clear(void);
void OLED_DrawPoint(u8 x,u8 y,u8 t);
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode);
void OLED_DrawCircle(u8 x,u8 y,u8 r);
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode);
void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode);
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode);
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode);
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode);
void OLED_ScrollDisplay(u8 num,u8 space,u8 mode);
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode);
void OLED_Init(void);#endif

📝main主程序代码

/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2021/08/08
* Description        : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************//**@NoteI2C1_SCL(PB8)\I2C1_SDA(PB9).Hardware connection:PB8--sclPB9--sda*/#include "debug.h"
//#include <stdio.h>
#include "oled.h"
#include "bmp.h"/********************************************************************** @fn      main** @brief   Main program.** @return  none*/
int main(void)
{u8 t = ' ';Delay_Init();//延时函数初始化USART_Printf_Init(115200);printf("SystemClk:%d\r\n", SystemCoreClock);OLED_Init();printf("Init \r\n");OLED_ColorTurn(0);//0正常显示,1 反色显示OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示OLED_DrawPoint(15, 15, 1);OLED_Refresh();while(1){OLED_ShowPicture(0, 0, 128, 64, BMP1, 1);OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowChinese(0, 0, 0, 16, 1); //中OLED_ShowChinese(18, 0, 1, 16, 1); //景OLED_ShowChinese(36, 0, 2, 16, 1); //园OLED_ShowChinese(54, 0, 3, 16, 1); //电OLED_ShowChinese(72, 0, 4, 16, 1); //子OLED_ShowChinese(90, 0, 5, 16, 1); //技OLED_ShowChinese(108, 0, 6, 16, 1); //术OLED_ShowString(8, 16, "ZHONGJINGYUAN", 16, 1);OLED_ShowString(20, 32, "2014/05/01", 16, 1);OLED_ShowString(0, 48, "ASCII:", 16, 1);OLED_ShowString(63, 48, "CODE:", 16, 1);OLED_ShowChar(48, 48, t, 16, 1); //显示ASCII字符t++;if(t > '~')t = ' ';OLED_ShowNum(103, 48, t, 3, 16, 1);OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowChinese(0, 0, 0, 16, 1); //16*16 中OLED_ShowChinese(16, 0, 0, 24, 1); //24*24 中OLED_ShowChinese(24, 20, 0, 32, 1); //32*32 中OLED_ShowChinese(64, 0, 0, 64, 1); //64*64 中OLED_Refresh();Delay_Ms(500);OLED_Clear();OLED_ShowString(0, 0, "ABC", 8, 1); //6*8 “ABC”OLED_ShowString(0, 8, "ABC", 12, 1); //6*12 “ABC”OLED_ShowString(0, 20, "ABC", 16, 1); //8*16 “ABC”OLED_ShowString(0, 36, "ABC", 24, 1); //12*24 “ABC”OLED_Refresh();OLED_Clear();Delay_Ms(500);OLED_ScrollDisplay(11, 3, 1);//向左滚动显示}
}

📚程序源码


链接: https://pan.baidu.com/s/1j7Csl_Dzi9qwCT67wFPgCA
提取码: 5eh6

这篇关于【WCH】CH32F203软件I2C驱动SSD1306 OLED的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/251480

相关文章

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

excel翻译软件有哪些?如何高效提翻译?

你是否曾在面对满屏的英文Excel表格时感到头疼?项目报告、数据分析、财务报表... 当这些重要的信息被语言壁垒阻挡时,效率和理解度都会大打折扣。别担心,只需3分钟,我将带你轻松解锁excel翻译成中文的秘籍。 无论是职场新人还是老手,这一技巧都将是你的得力助手,让你在信息的海洋中畅游无阻。 方法一:使用同声传译王软件 同声传译王是一款专业的翻译软件,它支持多种语言翻译,可以excel

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬