简要说明

如题,公司最近更换820*320屏幕,移植stemwin,使用3线spi通讯+16RGB,这屏幕工作流程为:首先通过3线spi发送初始化指令,之后通过16bitRGB发送像素点。
移植过程参考了安富莱、野火、https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html

移植过程

首先对屏幕进行初始化,使用模拟3线SPI方式,因为为9bit方式,首位代表命令。
手册上的通讯时序如下:

但实际上这时序是个坑,实际上的时序如下:

SCL在空闲状态为高电平,然后在第一个上升沿采样,也是就CPOL=1、CPHA=1。
初始化代码如下:最主要就是要把SCL拉高。

void SPI3_GPIO_Config(void)
{       GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd ( SDI_GPIO_CLK|SCL_GPIO_CLK|CS_GPIO_CLK|RES_GPIO_CLK, ENABLE);                                                              GPIO_InitStructure.GPIO_Pin = SDI_PIN;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;  //SDA有上拉电阻GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(SDI_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                        GPIO_InitStructure.GPIO_Pin = SCL_PIN;  GPIO_Init(SCL_GPIO_PORT, &GPIO_InitStructure);                                                             GPIO_InitStructure.GPIO_Pin = CS_PIN;   GPIO_Init(CS_GPIO_PORT, &GPIO_InitStructure);   GPIO_InitStructure.GPIO_Pin = RES_PIN; GPIO_Init(RES_GPIO_PORT, &GPIO_InitStructure);          SET_LSCE_HIGH;SET_LSCK_LOW;SET_LSCK_HIGH;
}

时序部分参考https://www.nxpic.org.cn/module/forum/thread-622198-1-1.html

static void St7701_Write_Byte(unsigned short temp)
{unsigned char i;SET_LSCE_LOW;
//  GPIO_PortClear(GPIO, 4U, 1<<0U);for(i=0;i<9;i++){SET_LSCK_LOW;
//      ST7701_SCL(0);if(temp&0x0100)
//          ST7701_SDA(1);SET_LSDA_HIGH;else
//          ST7701_SDA(0);SET_LSDA_LOW;UDELAY(5);SET_LSCK_HIGH;
//      ST7701_SCL(1);UDELAY(5);temp = temp<<1;}SET_LSCE_HIGH;
//  GPIO_PortSet(GPIO, 4U, 1<<0U);
}static void St7701_WriteCommand(uint8_t c)
{unsigned short temp = 0x00;temp = temp | c;St7701_Write_Byte(temp);UDELAY(100);
}static void St7701_WriteData(uint8_t c)
{unsigned short temp = 0x100;temp = temp | c;St7701_Write_Byte(temp);UDELAY(100);
}#define W_C(x)    St7701_WriteCommand(x)
#define W_D(x)    St7701_WriteData(x)void LCD_SPI_Init(void)
{ uint8_t id1, id2, id3;SPI3_GPIO_Config();SET_LRES_HIGH;mdelay(1);SET_LRES_LOW;mdelay(100);SET_LRES_HIGH;mdelay(200);//id1 = SPI_St7701s_ReadByte(0xDA);//id2 = SPI_St7701s_ReadByte(0xDB);//id3 = SPI_St7701s_ReadByte(0xDC);
#if 1W_C (0x11);mdelay(20); //Delayms 20ms  W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x13);   W_C (0xEF);     W_D (0x08);   W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x10);   W_C (0xC0);    //设置显示行为820 W_D (0xE5);   W_D (0x02);   W_C (0xC1);     //设置VBP=12,VFP=10W_D (0x0C);   W_D (0x0A);   W_C (0xC2);     //反转选择性和帧率控制W_D (0x07);    //7ColumnW_D (0x0F);     //PCLK=512+(0X0F*16)=752W_C (0xC3);     //RGB控制W_D (0x02);     //RGB DE mode--VSYNC信号极性(LOW)--HSYNC信号极性(LOW)--DP = “1” The data is input on the negative edge of DOTCLK--|||||||EP = 0 The data DB23-0 is written when ENABLE = “1”. Disable data write operation when ENABLE = “0”
//HBP--0x10  VBP=0x08(猜测为HFP)W_C (0xCC);     W_D (0x10);   W_C(0xCd);W_D(0x08); W_C (0xB0);     W_D (0x00);   W_D (0x08);   W_D (0x51);   W_D (0x0D);   W_D (0xCE);   W_D (0x06);   W_D (0x00);   W_D (0x08);   W_D (0x08);   W_D (0x1D);   W_D (0x02);   W_D (0xD0);   W_D (0x0F);   W_D (0x6F);   W_D (0x36);   W_D (0x3F);   W_C (0xB1);     W_D (0x00);   W_D (0x10);   W_D (0x4F);   W_D (0x0C);   W_D (0x11);   W_D (0x05);   W_D (0x00);   W_D (0x07);   W_D (0x07);   W_D (0x1F);   W_D (0x05);   W_D (0xD3);   W_D (0x11);   W_D (0x6E);   W_D (0x34);   W_D (0x3F);   W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x11);   W_C (0xB0);     W_D (0x4D);   W_C (0xB1);     W_D (0x1C);   W_C (0xB2);     W_D (0x87);   W_C (0xB3);     W_D (0x80);   W_C (0xB5);     W_D (0x47);   W_C (0xB7);     W_D (0x85);   W_C (0xB8);     W_D (0x21);   W_C (0xB9);     W_D (0x10);   W_C (0xC1);     W_D (0x78);   W_C (0xC2);     W_D (0x78);   W_C (0xD0);     W_D (0x88);   UDELAY(100);    //---------------------------------------            W_C (0xE0);     W_D (0x80);   W_D (0x00);   W_D (0x02);   W_C (0xE1);     W_D (0x04);   W_D (0xA0);   W_D (0x00);   W_D (0x00);   W_D (0x05);   W_D (0xA0);   W_D (0x00);   W_D (0x00);   W_D (0x00);   W_D (0x60);   W_D (0x60);   W_C (0xE2);     W_D (0x30);   W_D (0x30);   W_D (0x60);   W_D (0x60);   W_D (0x3C);   W_D (0xA0);   W_D (0x00);   W_D (0x00);   W_D (0x3D);   W_D (0xA0);   W_D (0x00);   W_D (0x00);   W_D (0x00);   W_C (0xE3);     W_D (0x00);   W_D (0x00);   W_D (0x33);   W_D (0x33);   W_C (0xE4);     W_D (0x44);   W_D (0x44);   W_C (0xE5);     W_D (0x06);   W_D (0x3E);   W_D (0xA0);   W_D (0xA0);   W_D (0x08);   W_D (0x40);   W_D (0xA0);   W_D (0xA0);   W_D (0x0A);   W_D (0x42);   W_D (0xA0);   W_D (0xA0);   W_D (0x0C);   W_D (0x44);   W_D (0xA0);   W_D (0xA0);   W_C (0xE6);     W_D (0x00);   W_D (0x00);   W_D (0x33);   W_D (0x33);   W_C (0xE7);     W_D (0x44);   W_D (0x44);   W_C (0xE8);     W_D (0x07);   W_D (0x3F);   W_D (0xA0);   W_D (0xA0);   W_D (0x09);   W_D (0x41);   W_D (0xA0);   W_D (0xA0);   W_D (0x0B);   W_D (0x43);   W_D (0xA0);   W_D (0xA0);   W_D (0x0D);   W_D (0x45);   W_D (0xA0);   W_D (0xA0);   W_C (0xEB);     W_D (0x00);   W_D (0x01);   W_D (0x4E);   W_D (0x4E);   W_D (0xEE);   W_D (0x44);   W_D (0x00);   W_C (0xED);     W_D (0xFF);   W_D (0xFF);   W_D (0x04);   W_D (0x56);   W_D (0x72);   W_D (0xFF);   W_D (0xFF);   W_D (0xFF);   W_D (0xFF);   W_D (0xFF);   W_D (0xFF);   W_D (0x27);   W_D (0x65);   W_D (0x40);   W_D (0xFF);   W_D (0xFF);   W_C (0xEF);     W_D (0x10);   W_D (0x0D);   W_D (0x04);   W_D (0x08);   W_D (0x3F);   W_D (0x1F);   W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x13);   W_C (0xE8);     W_D (0x00);   W_D (0x0E);   W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x00);   W_C (0x11);     UDELAY(100);   //----------------------------             W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x13);   W_C (0xE8);     W_D (0x00);   W_D (0x0C);   UDELAY(10 );    //-------------------------------            W_C (0xE8);     W_D (0x00);   W_D (0x00);   W_C (0xFF);     W_D (0x77);   W_D (0x01);   W_D (0x00);   W_D (0x00);   W_D (0x00);   W_C(0x36);W_D(0x00); //0x00W_C(0x3A);W_D(0x50);W_C(0x11);/*W_C (0xFF);W_D (0x77);W_D (0x01);W_D (0x00);W_D (0x00);W_D (0x12);W_C (0xD1);W_D (0x81);W_D (0x08);W_D (0x03);W_D (0x20);W_D (0x08);W_D (0x01);W_D (0xA0);W_D (0x01);W_D (0xE0);W_D (0xA0);W_D (0x01);W_D (0xE0);W_D (0x03);W_D (0x20);W_C (0xD2);W_D (0x08);*/UDELAY(100);W_C(0x29);Delay1ms(20);
#else
#endif
}

初始化过程注意SCL空闲电平就成,其他没啥好说的。
之后就是LCD的初始化,一把抄,改一下VBP、HBP、HFP、VFP这几个参数

void LCD_Init(void)
{LTDC_InitTypeDef       LTDC_InitStruct;/* Enable the LTDC Clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);/* Enable the DMA2D Clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);/* Configure the LCD Control pins */LCD_GPIO_Config();/* Configure the FMC Parallel interface : SDRAM is used as Frame Buffer for LCD *//* LTDC Configuration *********************************************************//* Polarity configuration *//* Initialize the horizontal synchronization polarity as active low */LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;/* Initialize the vertical synchronization polarity as active low */LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;/* Initialize the data enable polarity as active low */LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;//LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AH;/* Initialize the pixel clock polarity as input pixel clock */LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;/* Configure R,G,B component values for LCD background color */LTDC_InitStruct.LTDC_BackgroundRedValue = 0;LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;/* 配置 PLLSAI 分频器,它的输出作为像素同步时钟CLK*//* PLLSAI_VCO 输入时钟 = HSE_VALUE/PLL_M = 1 Mhz *//* PLLSAI_VCO 输出时钟 = PLLSAI_VCO输入 * PLLSAI_N = 384 Mhz *//* PLLLCDCLK = PLLSAI_VCO 输出/PLLSAI_R = 384/6  Mhz *//* LTDC 时钟频率 = PLLLCDCLK / DIV = 384/4/4 = 24 Mhz *//* LTDC时钟太高会导花屏,若对刷屏速度要求不高,降低时钟频率可减少花屏现象*//* 以下函数三个参数分别为:PLLSAIN,PLLSAIQ,PLLSAIR,其中PLLSAIQ与LTDC无关*/RCC_PLLSAIConfig(384, 7, 4);/*以下函数的参数为DIV值*/RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);/* Enable PLLSAI Clock */RCC_PLLSAICmd(ENABLE);/* Wait for PLLSAI activation */while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET){}/* 时间参数配置 */  /* 配置行同步信号宽度(HSW-1) */LTDC_InitStruct.LTDC_HorizontalSync =HSW-1;/* 配置垂直同步信号宽度(VSW-1) */LTDC_InitStruct.LTDC_VerticalSync = VSW-1;/* 配置(HSW+HBP-1) */LTDC_InitStruct.LTDC_AccumulatedHBP =HSW+HBP-1;/* 配置(VSW+VBP-1) */LTDC_InitStruct.LTDC_AccumulatedVBP = VSW+VBP-1;/* 配置(HSW+HBP+有效像素宽度-1) */LTDC_InitStruct.LTDC_AccumulatedActiveW = HSW+HBP+LCD_PIXEL_WIDTH-1;/* 配置(VSW+VBP+有效像素高度-1) */LTDC_InitStruct.LTDC_AccumulatedActiveH = VSW+VBP+LCD_PIXEL_HEIGHT-1;/* 配置总宽度(HSW+HBP+有效像素宽度+HFP-1) */LTDC_InitStruct.LTDC_TotalWidth =HSW+ HBP+LCD_PIXEL_WIDTH  + HFP-1; /* 配置总高度(VSW+VBP+有效像素高度+VFP-1) */LTDC_InitStruct.LTDC_TotalHeigh =VSW+ VBP+LCD_PIXEL_HEIGHT  + VFP-1;LTDC_Init(&LTDC_InitStruct);
}

这一步要注意的就是X轴和Y轴,这个st7701,短轴是X轴,长轴是Y轴。

/* LCD Size (Width and Height) */
#define  LCD_PIXEL_WIDTH       ((uint16_t)320)  //X轴
#define  LCD_PIXEL_HEIGHT      ((uint16_t)820)  //Y轴

之后就是emwin的移植了,参考安富莱的裸机移植代码。
基本上都差不多,修改的地方如下:

/* 1. 显示屏的物理分辨率,驱动已经做了显示屏自适应,支持4.3寸,5寸和7寸屏这里填写自适应显示屏中的最大分辨率。
*/
#define XSIZE_PHYS       320  //320
#define YSIZE_PHYS       820uint16_t g_LcdHeight = YSIZE_PHYS;         /* 显示屏分辨率-高度 */
uint16_t g_LcdWidth = XSIZE_PHYS;          /* 显示屏分辨率-宽度 *//* 4. 重定义图层数,对于STM32F429/439,用户可以选择一个图层或者两个图层,不支持三图层 (1). 设置GUI_NUM_LAYERS = 1时,即仅使用图层1时,默认触摸值是发送给图层1的。(2). 设置GUI_NUM_LAYERS = 2时,即图层1和图层2都已经使能,此时图层2是顶层,用户需要根据自己的使用情况设置如下两个地方。a. 在bsp_touch.c文件中的函数TOUCH_InitHard里面设置参数State.Layer = 1,1就表示给图层2发送触摸值。b. 调用GUI_Init函数后,调用函数GUI_SelectLayer(1), 设置当前操作的是图层2。
*/
#undef  GUI_NUM_LAYERS
#define GUI_NUM_LAYERS    1/* 7. 配置图层1的颜色模式和分辨率大小 */
#define COLOR_MODE_0      _CM_RGB565
#define XSIZE_0           XSIZE_PHYS
#define YSIZE_0           YSIZE_PHYS/* 8. 配置图层2的的颜色模式和分辨率大小 */
#define COLOR_MODE_1      _CM_RGB565
#define XSIZE_1           XSIZE_PHYS
#define YSIZE_1           YSIZE_PHYS

之后在初始化图层中:

/*
*********************************************************************************************************
*   函 数 名: _LCD_InitController
*   功能说明: LCD初始化
*   形    参: LayerIndex  选择图层0或者1
*   返 回 值: 无
*********************************************************************************************************
*/
static void _LCD_InitController(int LayerIndex)
{.......LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;;LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH-1;LTDC_Layer_InitStruct.LTDC_VerticalStart = VBP + VSW; LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+VBP+LCD_PIXEL_HEIGHT-1;
}

之后再测试一下:

/*
*********************************************************************************************************
*   函 数 名: MainTask
*   功能说明: GUI主函数
*   形    参: 无
*   返 回 值: 无
*********************************************************************************************************
*/
uint64_t i=0;
void MainTask(void)
{GUI_TIMER_HANDLE hTimer;GUI_Init();
//  /*关于多缓冲和窗口内存设备的设置说明1. 使能多缓冲是调用的如下函数,用户要在LCDConf_Lin_Template.c文件中配置了多缓冲,调用此函数才有效:WM_MULTIBUF_Enable(1);2. 窗口使能使用内存设备是调用函数:WM_SetCreateFlags(WM_CF_MEMDEV);3. 如果emWin的配置多缓冲和窗口内存设备都支持,二选一即可,且务必优先选择使用多缓冲,实际使用STM32F429BIT6 + 32位SDRAM + RGB565/RGB888平台测试,多缓冲可以有效的降低窗口移动或者滑动时的撕裂感,并有效的提高流畅性,通过使能窗口使用内存设备是做不到的。4. 所有emWin例子默认是开启三缓冲。*///GUI_SetOrientation(0);WM_MULTIBUF_Enable(1);//LCD_SetDirection(2);//i = GUI_SetOrientation(GUI_SWAP_XY);GUI_SetOrientation(GUI_SWAP_XY | GUI_MIRROR_Y);/*触摸校准函数默认是注释掉的,电阻屏需要校准,电容屏无需校准。如果用户需要校准电阻屏的话,执行此函数即可,会将触摸校准参数保存到EEPROM里面,以后系统上电会自动从EEPROM里面加载。*///TOUCH_Calibration();GUI_SetBkColor(0x000064c8); GUI_Clear();GUI_Delay(2000);//GUI_SetBkColor(GUI_GRAY);GUI_Clear();GUI_Delay(2000);GUI_SetColor(GUI_BLACK);GUI_SetTextMode(GUI_TM_NORMAL);GUI_SetFont(GUI_FONT_32B_ASCII);GUI_DispStringHCenterAt("GUI_TM_NORMAL" , 160, 10); GUI_Delay(1000);hWin = Createtestwindows();WM_EnableMemdev(hWin);while(1) {i++;//GUI_Delay(100);GUI_Exec();WINDOW_SetBkColor(hWin, 0x00FF0000);GUI_Exec();sys_timer_usDelay(1000000);WINDOW_SetBkColor(hWin, GUI_BLACK);GUI_Exec();sys_timer_usDelay(1000000);}
}

其中main.c如下

/*** @brief  主函数* @param  无* @retval 无*/
int main(void)
{RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);sys_timer_init();sys_timer_usDelay(1000);SDRAM_Init();//PhotomoveSdram();/* LED 端口初始化 */LED_GPIO_Config();   //SDRAM_Init();/*初始化液晶屏*/LCD_SPI_Init();LCD_Init();//LCD_LayerInit();//LTDC_Cmd(ENABLE);while(1){MainTask();}  }

卡壳的地方有:
1、spi初始化哪儿,SCL的空闲时钟。
2、emwin移植之后图像显示有问题,颜色显示不正确,后面通过测试RGB才发现,这个屏用的RGB565,线序与RGB888相比为:

RGB888    RGB565R0-------无R1-------无R2-------无R3-------R0R4-------R1R5-------R2R6-------R3R7-------R4G0-------无G1-------无G2-------G0G3-------G1G4-------G2G5-------G3G6-------G4G7-------G5B0-------无B1-------无B2-------无B3-------B0B4-------B1B5-------B2B6-------B3B7-------B4

3、测试中调用 IMAGE_SetDTA() 函数总是跑飞,调整一下堆栈大小: Stack_Size EQU 0x00001000
4、显示亮色图片对比鲜明的像素点不正常,不知道原因。

ST7701芯片820*320屏幕移植stemwin相关推荐

  1. 超详细!!!STM32F407ZGT6HAL库移植STemwin(基于正点原子最小系统板+GUIBuilder)

    第一次写博客,我以为会是点灯的,没想到留给了GUI,但是第一次写,可能写的不够好欢迎大家批评指正. 最近由于比赛的要求,需要给自己的LCD设计GUI界面,在查了一些资料后,决定先学STemwin然后学 ...

  2. 玩转RT-Thread系列教程(6)--移植STemwin

    玩转RT-Thread系列教程(6)–移植STemwin 一.STemwin介绍 在实际应用中我们时常需要制作 UI 界面来实现人机交互,简单的 UI 我们可以自己直接写代码,但是对于那些复杂的交互方 ...

  3. stm32使用自定义打点函数方式移植stemwin

    stm32使用自定义打点函数方式移植stemwin 背景 显示过程 移植简述 打点函数 stemwin移植要点 实物效果 背景 oled屏移植stemwin,有两种方式,通过自定义打点方式进行移植,或 ...

  4. 基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析

    基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析 随着现代生活节奏的加快,简单快捷的产品越来越受到人们的青睐,产品也越来越注重人机交互和简单明了的用户体验,一款具备LCD屏幕的产品往往更具有竞 ...

  5. 【STemWin】STM32F103VE单片机用FSMC驱动ILI9341彩色触摸屏(触控芯片XPT2046),并裸机移植STemWin图形库(采用LCDConf_FlexColor.c模板)

    本程序采用的是STM32F103VE单片机,外部晶振的大小为8MHz,使用HAL库编写程序. 程序下载地址:https://pan.baidu.com/s/1-Q4LX3DkMjDcLod1m3r1o ...

  6. 第三篇:手把手教你移植任天堂,没有声音、无需外置SD卡、可使用独立按键也可使用外置手柄,本人使用的芯片为ESP32,移植到STM32均可使用。(本篇主要介绍ppu.c文件,即教你如何移植屏幕)

    这一篇就比较简单了,直接上核心代码,也就是大家要修改的地方,不修改这里,直接拿过去是无法编译通过的 //PPU 将行缓存,写入LCD //NES游戏的分辨率为256*240. void NES_LCD ...

  7. STM32移植STemwin

    一.准备基础程序 基于正点原子stm32战舰开发板的移植 1.    正点原子程序下载: 资料盘 战舰  开发板资料A盘: https://pan.baidu.com/s/1qZgG-UAznhQWg ...

  8. STM32F4移植STemWin

    目录 一.STemWin的文件结构 二.STemWin的移植步骤 三.STemWin的LCD驱动移植 四.STemWin的触摸屏驱动移植 五.补充 STM32芯片为:STM32F407VGT6 STe ...

  9. STM32F103移植STEMWIN并驱动0.96寸OLED实现弹球界面效果

    现在很多带显示屏的电子产品,在待机状态下都有一个待机界面,最为经典的当属弹球界面了,当弹球碰到屏幕边界之后则反弹,先上效果图: 由于是移植了STEMWIN,所以只有STM系列单片机才可以正常跑该程序. ...

最新文章

  1. 测序技术及常见的有几种平台类型
  2. js调用linux命令,xshell调用js脚本开发
  3. CentOS 7下的MariaDB Master-Slave Replication配置
  4. jQuery+css模拟下拉框模糊搜索的实现
  5. Android系统移植与驱动开发概述
  6. 计算机安全原理与实践_《计算机图形学原理及实践》学习笔记之第三章
  7. 《MySQL——使用联合索引、覆盖索引,避免临时表的排序操作》
  8. Apsara Stack 技术百科 | 边缘场景智能云化,让云无处不在
  9. 智能家居火了这么久 何时到我家?
  10. java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法
  11. 大数据学习入门难,给初学者支招
  12. 中国天气网城市代码Json数据
  13. uniapp手机号码正则验证
  14. Mixly米思齐——超声波测距控制LED灯
  15. 刷新bios后电脑死机了怎么办
  16. 删除电脑属性制造商_修改Win7系统GHO中OEM信息图文教程
  17. Word 边框刷使用方法
  18. 输入两个正整数m和n,求出[m,n]区间的所有素数。
  19. MAC OSX stdio.h或iostream等头文件无法找到的解决办法
  20. 网易云音乐人申请教程(会唱歌即可)

热门文章

  1. uniapp视频压缩踩坑记录
  2. Javaweb入职第二天
  3. nginx php cgi.sock,nginx中unix:/tmp/php-cgi.sock错误解决解决
  4. ICC II 3 从create_ndm开始design setup
  5. 云计算运维工程师前景怎么样?
  6. Java爬虫初学——爬取BT电影天堂电影的磁力链接并筛选下载
  7. MiniGUI学习整理
  8. Sql server找不到启动图标
  9. 键盘按键ctrl与大小写切换键caps lock位置互换
  10. C# 一些零零碎碎的方法,都是些帮助类,留存,也希望能帮助到各位