关于OLED屏的笔记

2023-05-16

OLED即有机发光管(Organic Light-Emitting Diode,OLED)。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低功耗、极高反应速度、可用于绕曲性面板、使用温度范围广、构造及制程简单等有点,被认为是下一代的平面显示屏新兴应用技术。

OLED显示和传统的LCD显示不同,其可以自发光,所以不需要背光灯,这使得OLED显示屏相对于LCD显示屏尺寸更薄,同时显示效果更优。 常用的OLED屏幕有蓝色、黄色、白色等几种。屏的大小为0.96寸,像素点为 128*64,所以我们称为0.96oled屏或者12864屏。

------------------------------------------------------------------------------------

如何让字符显示在OLED屏幕上:

由于我们实际上是在和OLED的驱动IC通信,所以我们要选择驱动的相应时序8080时序。然后利用厂家给的初始化序列进行屏幕初始化。然后再进行画点读点的操作。

接下来介绍8080并行通信的读/写操作过程。

1、设置DC电平,选择写入类型(高电平为读写数据,低电平为读写命令);

2、拉低片选,选中我们的操作设备;

3、设置RD(读)/WD(写)为低电平,选择操作方式,再拉高选择的操作位,使之产生一个上升沿触发信号,会将数据锁存/写入,等于是在这个上升沿之后命令有效。

接下来以写入为例进行示范:根据需求自行选择DC电平,比如说读写数据的时候我们选择高电平;接下来拉低CS选中相应OLED屏设备;然后拉低WR线,准备进行写入数据;接下来在数据线上进行数据准备;然后我们再拉高WR线,产生一个上升沿触发信号,此时我们的数据线上的数据会被读取;然后再分别释放CS和DC线。

接下来进行代码示范:

void oled_wr_byte(uint8_t data, uint_8 cmd){

    OLED_RS(cmd); //数据类型,有传参决定
    OLED_CS(0);
    OLED_WR(0);
    oled_data_out(data); //数据线准备
    OLED_WR(1);
    OLED_CS(0);
    OLED_RS(cmd); //释放,恢复默认

}

void oled_data_out(uint8_t data){

    GPIOC->ODR = (GPIOC->ODR & 0xFF00) | (data & 0x00FF); //D[7:0]使用的是PC0~7,前一段清空后8位的数据,,后一段传入数据
}

整个OLED屏幕分成了八页,说白了就是把OLED的屏幕把宽平均分成了八份。比如想要在第0列第三行的开头显示一个点那就是按位来配置,0000 0100(0x08)。在对GRAM进行操作的时候,列地址指针自动递增,当列地址指针达到列结束地址的时候,重置开始地址,但页指针不变。用户必须设置新的页和列地址,才能访问下一页GRAM内容。

 

 STM32内部建立一个缓存(共128*8个字节),每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),修改完后一次性把STM32上的缓存数据写入到OLED的GRAM。

代码实现如下:

static uint8_t g_oled_gram[128][8]; //OLED的显存,前面是列数,后面是页数

void oled_refresh_gram(void){

    unit8_t 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);     //设置列高地址

        for(n=0;n<128;n++){
            oled_wr_byte(g_oled_gram[n][i], OLED_DATA);
        }
    }
}

一个通用的置1表达式为OLED_GRAM[x][y/8] |= 1<< y%8;

然后给出标准画点的代码:

void oled_draw_point(uint8_t x, uint8_t y, uint8_t dot){

    uint8_t pos, bx, temp = 0;
    if(x > 127 || y > 63) return;

    pos = y / 8;    //页地址
    bx = y % 8;     //在页中纵坐标的位置
    temp = 1 << bx; //转换后y对应的bit位置
    
    if(dot)
        g_oled_gram[x][pos] |= temp;
    else
        g_oled_gram[x][pos] |= ~temp;

}

接下来介绍字符显示原理:

1、显示字符必须有相应的点阵数据,点阵数据的集合叫做字库;

2、单片机根据点阵数据按取模放进行描点还原,从而显示字符;

3、ASCII字符宽度 = 汉字宽度的一半。

画点遵循原则:从上到下,从左到右,高位在前。

如图中的字符,我们对应的数据是

0x00, 0x04, 0x00, 0x3C, 0x03, 0xC4, 0x1C, 0x40。 

接下来给出字符显示代码:

void oled_show_chara(){

    uint8_t temp, t1, t;
    uint8_t y0 = y; //保存y的初值
    uint8_t mode = 1;

    for(t1=0;t1<16;t1++){
        temp = oled_ascii_1608[t];

        for(t=0;t<8;t++){
            if(temp & 0x80) //用最高位判断,如果这个点有效,则画出来
                oled_draw_point(x, y, mode);
            else
                oled_draw_point(x, y, !mode);

            temp <<= 1; //进行移位操作,直接丢弃最高位,以下一位为最高位进行判断
            y++; //纵坐标自增

            if((y-y0) == 16){ //显示完了一列
                y=y0;  //纵坐标复位
                x++;   //横坐标自增
                break; 
            }
        }
    }
}

接下来用代码实现OLED基本驱动:

先写函数头文件oled.h:

#ifndef __OLED_H
#define __OLED_H

#include "stdlib.h"
#include "./SYSTEM/sys/sys.h"

#define OLED_MODE       1


//引脚定义和时钟开启
#define OLED_SPI_RST_PORT               GPIOG
#define OLED_SPI_RST_PIN                GPIO_PIN_15
#define OLED_SPI_RST_CLK_ENABLE()       do{ __HAL_RCC_GPIOG_CLK_ENABLE(); }while(0)

#define OLED_SPI_CS_PORT                GPIOD
#define OLED_SPI_CS_PIN                 GPIO_PIN_6
#define OLED_SPI_CS_CLK_ENABLE()        do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)   

#define OLED_SPI_RS_PORT                GPIOD
#define OLED_SPI_RS_PIN                 GPIO_PIN_3
#define OLED_SPI_RS_CLK_ENABLE()        do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0)

#define OLED_SPI_SCLK_PORT              GPIOC
#define OLED_SPI_SCLK_PIN               GPIO_PIN_0
#define OLED_SPI_SCLK_CLK_ENABLE()      do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)

#define OLED_SPI_SDIN_PORT              GPIOC
#define OLED_SPI_SDIN_PIN               GPIO_PIN_1
#define OLED_SPI_SDIN_CLK_ENABLE()      do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)



//端口函数启动
#define OLED_RST(x)     do{ x ? \
                                  HAL_GPIO_WritePin(OLED_SPI_RST_PORT, OLED_SPI_RST_PIN, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(OLED_SPI_RST_PORT, OLED_SPI_RST_PIN, GPIO_PIN_RESET); \
                        }while(0)       /* ÉèÖÃRSTÒý½Å */

#define OLED_CS(x)      do{ x ? \
                                  HAL_GPIO_WritePin(OLED_SPI_CS_PORT, OLED_SPI_CS_PIN, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(OLED_SPI_CS_PORT, OLED_SPI_CS_PIN, GPIO_PIN_RESET); \
                        }while(0)       /* ÉèÖÃCSÒý½Å */
#define OLED_RS(x)      do{ x ? \
                                  HAL_GPIO_WritePin(OLED_SPI_RS_PORT, OLED_SPI_RS_PIN, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(OLED_SPI_RS_PORT, OLED_SPI_RS_PIN, GPIO_PIN_RESET); \
                        }while(0)       /* ÉèÖÃRSÒý½Å */
                              
#define OLED_SCLK(x)    do{ x ? \
                                  HAL_GPIO_WritePin(OLED_SPI_SCLK_PORT, OLED_SPI_SCLK_PIN, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(OLED_SPI_SCLK_PORT, OLED_SPI_SCLK_PIN, GPIO_PIN_RESET); \
                        }while(0)       /* ÉèÖÃSCLKÒý½Å */
#define OLED_SDIN(x)    do{ x ? \
                                  HAL_GPIO_WritePin(OLED_SPI_SDIN_PORT, OLED_SPI_SDIN_PIN, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(OLED_SPI_SDIN_PORT, OLED_SPI_SDIN_PIN, GPIO_PIN_RESET); \
                        }while(0)       /* ÉèÖÃSDINÒý½Å */


#define OLED_WR(x)      do{ x ? \
                                  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_SET) :  \
                                  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_RESET); \
                        } while (0)     
#define OLED_RD(x)      do{ x ? \
                                  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET) : \
                                  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET); \
                        }while(0)       



#define OLED_CMD        0 //CS脚写命令
#define OLED_DATA       1 //CS脚写数据


    
static void oled_wr_byte(uint8_t data, uint8_t cmd);   //写一个字节到OLED
static uint32_t oled_pow(uint8_t m, uint8_t n);        //求平方函数 


void oled_init(void);           
void oled_clear(void);          
void oled_display_on(void);     
void oled_display_off(void);   
void oled_refresh_gram(void);   
void oled_draw_point(uint8_t x, uint8_t y, uint8_t dot);    
void oled_fill(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t dot);        
void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t size, uint8_t mode);
void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size);
void oled_show_string(uint8_t x, uint8_t y, const char *p, uint8_t size);


#endif

接下来写函数文件代码:

#include "stdlib.h"
#include "./BSP/OLED/oled.h"
#include "./BSP/OLED/oledfont.h"
#include "./SYSTEM/delay/delay.h"

static uint8_t g_oled_gram[128][8];

void oled_refresh_gram(void)
{
    uint8_t 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);     //设置列高地址

        for (n = 0; n < 128; n++)
        {
            oled_wr_byte(g_oled_gram[n][i], OLED_DATA);
        }
    }
}

#if OLED_MODE == 1    //使用8080并口通信驱动OLED

static void oled_data_out(uint8_t data) //数据线准备
{
    GPIOC->ODR = (GPIOC->ODR & 0XFF00) | (data & 0X00FF);
}


static void oled_wr_byte(uint8_t data, uint8_t cmd) //OLED读写操作
{
    oled_data_out(data);
    OLED_RS(cmd);
    OLED_CS(0);
    OLED_WR(0);
    OLED_WR(1);
    OLED_CS(1);
    OLED_RS(1);
}

#else       //使用SPI驱动

static void oled_wr_byte(uint8_t data, uint8_t cmd)
{
    uint8_t i;
    OLED_RS(cmd);   /* дÃüÁî */
    OLED_CS(0);

    for (i = 0; i < 8; i++)
    {
        OLED_SCLK(0);

        if (data & 0x80)
        {
            OLED_SDIN(1);
        }
        else
        {
            OLED_SDIN(0);
        }

        OLED_SCLK(1);
        data <<= 1;
    }

    OLED_CS(1);
    OLED_RS(1);
}

#endif

//开启OLED显示
void oled_display_on(void)
{
    oled_wr_byte(0X8D, OLED_CMD);   /* SET DCDCÃüÁî */
    oled_wr_byte(0X14, OLED_CMD);   /* DCDC ON */
    oled_wr_byte(0XAF, OLED_CMD);   /* DISPLAY ON */
}

//关闭OLED显示
void oled_display_off(void)
{
    oled_wr_byte(0X8D, OLED_CMD);   /* SET DCDCÃüÁî */
    oled_wr_byte(0X10, OLED_CMD);   /* DCDC OFF */
    oled_wr_byte(0XAE, OLED_CMD);   /* DISPLAY OFF */
}

//清屏
void oled_clear(void)
{
    uint8_t i, n;

    for (i = 0; i < 8; i++)for (n = 0; n < 128; n++)g_oled_gram[n][i] = 0X00;

    oled_refresh_gram();    
}

画点
void oled_draw_point(uint8_t x, uint8_t y, uint8_t dot)
{
    uint8_t pos, bx, temp = 0;

    if (x > 127 || y > 63) return;  

    pos = y / 8;            

    bx = y % 8;             
    temp = 1 << bx;         

    if (dot)    
    {
        g_oled_gram[x][pos] |= temp;
    }
    else        
    {
        g_oled_gram[x][pos] &= ~temp;
    }
}

//OLED区域填充
void oled_fill(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t dot)
{
    uint8_t x, y;

    for (x = x1; x <= x2; x++)
    {
        for (y = y1; y <= y2; y++)oled_draw_point(x, y, dot);
    }

    oled_refresh_gram();    
}

//在指定位置显示字符
void oled_show_char(uint8_t x, uint8_t y, uint8_t chr, uint8_t size, uint8_t mode)
{
    uint8_t temp, t, t1;
    uint8_t y0 = y;
    uint8_t *pfont = 0;
    uint8_t csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2); //得到一个字符对应点阵所占字节数
    chr = chr - ' ';        //得到偏移后的值,因为是从空格开始记录的

    if (size == 12)         /* 1206字体*/
    {
        pfont = (uint8_t *)oled_asc2_1206[chr];
    }
    else if (size == 16)     /* 1608字体 */
    {
        pfont = (uint8_t *)oled_asc2_1608[chr];
    }
    else if (size == 24)     /* 2412字库 */
    {
        pfont = (uint8_t *)oled_asc2_2412[chr];
    }
    else                    /* 不存在相应字库 */
    {
        return;
    }

    for (t = 0; t < csize; t++)
    {
        temp = pfont[t];

        for (t1 = 0; t1 < 8; t1++)
        {
            if (temp & 0x80)oled_draw_point(x, y, mode);
            else oled_draw_point(x, y, !mode);

            temp <<= 1;
            y++;

            if ((y - y0) == size)
            {
                y = y0;
                x++;
                break;
            }
        }
    }
}

//平方函数
static uint32_t oled_pow(uint8_t m, uint8_t n)
{
    uint32_t result = 1;

    while (n--)
    {
        result *= m;
    }

    return result;
}

/显示len个数字
void oled_show_num(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size)
{
    uint8_t t, temp;
    uint8_t enshow = 0;

    for (t = 0; t < len; t++)   /* °´×ÜÏÔʾλÊýÑ­»· */
    {
        temp = (num / oled_pow(10, len - t - 1)) % 10;  /* »ñÈ¡¶ÔӦλµÄÊý×Ö */

        if (enshow == 0 && t < (len - 1))   /* ûÓÐʹÄÜÏÔʾ,ÇÒ»¹ÓÐλҪÏÔʾ */
        {
            if (temp == 0)
            {
                oled_show_char(x + (size / 2)*t, y, ' ', size, 1); /* ÏÔʾ¿Õ¸ñ,վλ */
                continue;       /* ¼ÌÐøϸöһλ */
            }
            else
            {
                enshow = 1;     /* ʹÄÜÏÔʾ */
            }
        }

        oled_show_char(x + (size / 2)*t, y, temp + '0', size, 1);    /* ÏÔʾ×Ö·û */
    }
}

//显示字符串
void oled_show_string(uint8_t x, uint8_t y, const char *p, uint8_t size)
{
    while ((*p <= '~') && (*p >= ' '))   
    {
        if (x > (128 - (size / 2)))     
        {
            x = 0;
            y += size;                  
        }

        if (y > (64 - size))            
        {
            y = x = 0;
            oled_clear();
        }

        oled_show_char(x, y, *p, size, 1);   
        x += size / 2;      
        p++;
    }
}

//初始化OLED
void oled_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    __HAL_RCC_GPIOC_CLK_ENABLE();     
    __HAL_RCC_GPIOD_CLK_ENABLE();     
    __HAL_RCC_GPIOG_CLK_ENABLE();     

#if OLED_MODE==1    /* 使用8080并口通信 */

    /* PC0 ~ 7 设置 */
    gpio_init_struct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;                
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(GPIOC, &gpio_init_struct);                /* PC0 ~ 7 设置 */

    gpio_init_struct.Pin = GPIO_PIN_3|GPIO_PIN_6;           /* PD3, PD6 设置 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(GPIOD, &gpio_init_struct);                /* PD3, PD6 设置 */
    
    gpio_init_struct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(GPIOG, &gpio_init_struct);                /* WR/RD/RST引脚模式设置 */

    OLED_WR(1);
    OLED_RD(1);

#else               /* SPI串口通信模式 */

    gpio_init_struct.Pin = OLED_SPI_RST_PIN;                /* RST引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉­ */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(OLED_SPI_RST_PORT, &gpio_init_struct);    

    gpio_init_struct.Pin = OLED_SPI_CS_PIN;                 /* CS引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉*/
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(OLED_SPI_CS_PORT, &gpio_init_struct);     

    gpio_init_struct.Pin = OLED_SPI_RS_PIN;                 /* RS引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(OLED_SPI_RS_PORT, &gpio_init_struct);     

    gpio_init_struct.Pin = OLED_SPI_SCLK_PIN;                /* SCLK引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;             /* 推挽 */
    gpio_init_struct.Pull = GPIO_PULLUP;                     /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;         /* 中速 */
    HAL_GPIO_Init(OLED_SPI_SCLK_PORT, &gpio_init_struct);    

    gpio_init_struct.Pin = OLED_SPI_SDIN_PIN;               /* SDIN引脚 */
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽 */
    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_MEDIUM;        /* 中速 */
    HAL_GPIO_Init(OLED_SPI_SDIN_PORT, &gpio_init_struct);   

    OLED_SDIN(1);
    OLED_SCLK(1);
#endif
    OLED_CS(1);
    OLED_RS(1);

    OLED_RST(0);
    delay_ms(100);
    OLED_RST(1);

    oled_wr_byte(0xAE, OLED_CMD);   
    oled_wr_byte(0xD5, OLED_CMD);   
    oled_wr_byte(80, OLED_CMD);     
    oled_wr_byte(0xA8, OLED_CMD);   
    oled_wr_byte(0X3F, OLED_CMD);   
    oled_wr_byte(0xD3, OLED_CMD);   
    oled_wr_byte(0X00, OLED_CMD);   

    oled_wr_byte(0x40, OLED_CMD);   

    oled_wr_byte(0x8D, OLED_CMD);   
    oled_wr_byte(0x14, OLED_CMD);   
    oled_wr_byte(0x20, OLED_CMD);   
    oled_wr_byte(0x02, OLED_CMD);   
    oled_wr_byte(0xA1, OLED_CMD);   
    oled_wr_byte(0xC8, OLED_CMD);   
    oled_wr_byte(0xDA, OLED_CMD);   
    oled_wr_byte(0x12, OLED_CMD);   

    oled_wr_byte(0x81, OLED_CMD);   
    oled_wr_byte(0xEF, OLED_CMD);   
    oled_wr_byte(0xD9, OLED_CMD);   
    oled_wr_byte(0xf1, OLED_CMD);   
    oled_wr_byte(0xDB, OLED_CMD);   
    oled_wr_byte(0x30, OLED_CMD);   

    oled_wr_byte(0xA4, OLED_CMD);   
    oled_wr_byte(0xA6, OLED_CMD);   
    oled_wr_byte(0xAF, OLED_CMD);   
    oled_clear();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于OLED屏的笔记 的相关文章

  • Keil5----新建项目文件( .c文件 和 .h文件)

    前言 在使用 Keil5 编辑程序的时候 xff0c 一定需要新建几个文件 xff08 c文件 和 h文件 xff09 xff0c 在其中编写不同功能的程序 例如 xff1a 新建LED c和LED h文件 xff0c 实现LED灯闪烁的功
  • 编码和串口通信

    先了解字符串和bytes xff08 字节 xff09 字符串 xff1a python里的字符串就是文本 xff0c 用于与人类交互 xff0c 像这样 xff1a 阿拉伯数字 xff1a a 61 1234566454 英语 xff1a
  • vscode终端不显示,闪退问题解决(完整步骤)

    1 以管理员身份运行此程序 步骤 xff1a 1 1 找到该文件目录的文件图标 1 2 右键属性选择兼容性 1 3 选择更改所有用户的设置然后勾选以管理员身份运行此程序后重新打开vscode 2 在vscode修改配置文件 2 1 打开vs
  • Vue项目启动报错 error:cannot find module xxx

    原因 xff1a 无法找到项目依赖的某个模块 解决办法 xff1a 1 删掉存放模块的文件夹node module xff1b 2 执行清除缓存命令 npm cache clean xff1b 如果报错 xff0c 使用强制清除npm ca
  • OkHttp-(一)HttpUrl了解

    1 xff0c git地址 xff1a https github com square okhttp 2 xff0c 官网地址 xff1a https square github io okhttp Http作为现代应用程序的常用联网方式
  • 学习网络编程第一步,安装NetAssist网络调试助手

    x1f4d6 摘要 今天分享下 遇到 Request header is too large xff0c 如何解决 xff0c 欢迎关注 xff01 x1f91e 简单介绍 NetAssist 是一款免安装的网络调试助手工具 今天给大家带来
  • 初学STM32之串口通信

    文章目录 一 背景知识1 处理器与外部通信的两种方式2 串行通信的三种传输方式3 串行通信的通信方式 二 串口通信基础1 STM32的串口通信接口2 UART异步通信引脚连接方法3 UART异步通信方式特点4 串口异步通信需要定义的参数 三
  • 前端架构图解

  • Ubuntu 18.04快捷安装ROS Melodic及rosdep update time out的问题解决

    1 ROS快捷安装 以下安装指令汇总针对Ubuntu18 04的ROS Melodic版本 xff1a 强烈建议复制以下指令到新建的xxx sh文件中 xff0c 保存后给xxx sh权限 xff0c 然后执行脚本一路输入y等候安装完成 e
  • NVIDIA Jetson AGX Xavier学习笔记3——环境配置(pytorch、torchvision、cv2)

    最近研究中需要使用NVIDIA Jetson AGX Xavier人工智能开发组件 由于也是第一次接触相关硬件设备 xff0c 遇到了很多困难 在这里记录整个Jetson AGX Xavier组件的学习过程 其中很多内容网上有比较详细的教程
  • Linux网络编程——tcp实例

    题目 1 通过TCP协议实现多个client端可以并发连接到server xff0c client可获得server指定目录下的文件列表 span class hljs comment client c Created on 2016年11
  • A星寻路算法的学习总结(详解)

    目录 1 理论基础 1 1A星寻路是用来解决什么问题的 1 2A星寻路的基本原理 2 代码实现 2 1每个格子的信息 2 2A星寻路管理器 2 3测试代码 3 实例演示 1 理论基础 1 1A星寻路是用来解决什么问题的 A星寻路是用来计算玩
  • C语言单片机栈、堆、堆栈的区别(仅供参考)

    计算机C语言中各个变量的存放区域 xff1a 代码区 xff08 CODE xff09 xff1a 存放函数代码 xff1b 静态数据区 xff08 DATA xff09 xff1a 存放全局变量 静态变量 xff1b 堆区 xff08 H
  • 用c语言写链表

    链表是数据结构的一种 xff0c 是其他三个数据结构栈 xff0c 树 xff0c 图的基础 xff0c 只有将链表这一数据结构弄懂 xff0c 才能理解其他三种数据结构 举一个例子 xff0c 老师让你设计一个联系人系统 xff0c 其中
  • Fiddler抓包工具详解

    Fiddler的详细介绍 一 Fiddler与其他抓包工具的区别 1 Firebug虽然可以抓包 xff0c 但是对于分析http请求的详细信息 xff0c 不够强大 模拟http请求的功能也不够 xff0c 且firebug常常是需要 无
  • python 解析Json对象之jsonpath_rw用法

    jsonpath rw xff1a 一个可以像写xpath一样写json的Python第三方库 首先安装 xff1a pip install jsonpath rw 实例 xff1a from jsonpath rw import json
  • selenium之xpath使用

    XPath即XML路径语言 xff0c 支持从xml或html中查找元素节点 xff0c 使用XPath完全可以替代其他定位放式 xff0c 如 xff1a find element by xpath 39 64 id 61 34 34 3
  • Python-面向对象之多态

    当子类和父类都存在相同的run 方法时 xff0c 我们说 xff0c 子类的run 覆盖了父类的run xff0c 在代码运行的时候 xff0c 总是会调用子类的run 这样 xff0c 我们就获得了继承的另一个好处 xff1a 多态 c
  • 使用Ubuntu帐户创建SFTP

    提供sftp服务的有vsftpd和internal sftp xff0c 这里用的是系统自带的internal sftp xff0c 操作步骤如下 xff1a 1 创建用户 testenv xff0c 并禁止ssh登录 xff0c 不创建家
  • flask数据分页paginate的使用(flask学习)

    Flask的数据分页示例 1 xff0c 首先写数据获取的视图函数 xff0c 就像这样 xff1a 64 app route 39 39 64 login required def index page 61 request args g

随机推荐

  • Python __dict__属性详解

    我们都知道Python一切皆对象 xff0c 那么Python究竟是怎么管理对象的呢 xff1f 1 无处不在的 dict 首先看一下类的 dict 属性和类对象的 dict 属性 coding utf 8 class A object 3
  • Flask-SQLAlchemy 中的 relationship & backref

    今天重看 Flask 时 xff0c 发现对backref仍然没有理解透彻 查阅文档后发现 xff0c 以前试图孤立地理解backref是问题之源 xff0c backref是与relationship配合使用的 一对多关系 db rela
  • Django HttpResponse与JsonResponse

    我们编写一些接口函数的时候 xff0c 经常需要给调用者返回json格式的数据 xff0c 那么如何返回可直接解析的json格式的数据呢 xff1f 首先先来第一种方式 xff1a from django shortcuts import
  • Ubuntu安装mysql

    首先执行下面三条命令 xff1a sudo apt get install mysql server sudo apt install mysql client sudo apt install libmysqlclient dev 安装成
  • 10种动态进度条用css3实现

    用css做的10种动态进度条 xff0c 喜欢可以直接去用话不多说先看效果图 xff1a 实现上图的 xff0c 最主要的就是应用了css动画属性 64 keyframes和animation属性结合应用 下面看看语法 xff1a 64 k
  • Yolo训练数据标注工具-Yolo_mark 使用教程

    一 安装与测试 环境 xff1a Ubuntu16 04 43 Opnecv 43 Cmake 项目地址 xff1a https github com AlexeyAB Yolo mark 下载 打开终端 xff0c 键入 xff1a gi
  • x86、ARM分属大小端

    小端模式 xff1a 一个数据的高位在大的地址端 xff0c 低位在小的地址端 xff0c x86也就是pc机就是小端的 xff1a include 34 stdio h 34 include 34 stdlib h 34 int main
  • 二叉树(C语言实现)——链式存储结构

    include lt stdio h gt include lt stdlib h gt include lt stdbool h gt define QueueSize 200 typedef char DataType typedef
  • 栈,堆,常量区都放什么

    1 寄存器 xff1a 最快的存储区 由编译器根据需求进行分配 我们在程序中无法控制 xff1b 1 栈 xff1a 存放基本类型的变量数据和对象的引用 xff0c 但对象本身不存放在栈中 xff0c 而是存放在堆 xff08 new 出来
  • Windows10安装Docker并创建本地Ubuntu环境

    安装Docker参考文章 xff1a https www cnblogs com Can daydayup p 15468591 html label0 安装本地Ubuntu环境 xff1a windows10下安装docker xff0c
  • 机器人操作系统ROS是什么?

    目录 1 什么是ROS 2 ROS的许可协议 3 ROS的主要发行版本 4 ROS的主要功能 5 ROS的应用 6 ROS开发的常用工具 7 ROS的优点 8 ROS的缺点 1 什么是ROS ROS是机器人操作系统 xff08 Robot
  • 【教程】如何移植FPGA关于HDMI例程

    教程 如何移植FPGA关于HDMI例程 时钟IP核约束条件 在完成EDA作业后 xff0c 抽空分享一下如何移植FPGA的例程 我EDA作业用的板子型号是Zybo Z7 xff0c 然后移植的是原子哥的HDMI实现方块移动例程 故本教程是基
  • 【MATLAB UAV Toolbox】使用指南(三)

    可视化自定义飞行日志 通过配置flightLogSignalMapping可从自定义的飞行日志中可视化数据 加载自定义的飞行日志 在本例中 xff0c 假设飞行数据已经被解析到MATLAB 中 xff0c 并存储为M文件 本示例重点介绍如何
  • matplotlib学习笔记

    matplotlib第一章 matplotlib通常有两种绘图接口 xff1a 显示创建figure和axes 依赖pyplot自动创建figure和axes 并绘图 matplotlib环境 本文是在jupyter notebook下运行
  • OPNET 修改节点图标大小

    老是记不住在哪修改图标 xff0c 有一天看急眼了 xff0c 经过半小时的斗争 xff0c 终于找到了 xff0c 这次一定要把它记下来 View gt Layout gt Scale Node icons Interactively
  • 自定义msg使用C++

    在之前创建talker的src文件夹中创建person cpp并编写如下 include 34 ros ros h 34 include 34 learning communication Person h 34 include lt ss
  • GPIO的八种模式分析

    GPIO是general purpose input output 即通用输入输出端口 xff0c 作用是负责外部器件的信息和控制外部器件工作 GPIO有如下几个特点 xff1a 1 不同型号的IO口数量不同 xff1b 2 xff0c 反
  • 关于STM32_IWDG独立看门狗的一些笔记

    独立看门狗 IWDG xff0c Independent watchdog xff0c 本质是一个可以定时产生系统复位信号 并且可以通过 喂狗 复位的计时器 它由独立的RC振荡器 低速时钟 LSI 驱动 xff0c 即使主时钟发生故障它也仍
  • 关于MPU的笔记

    MPU xff08 memory protection unit xff09 内存保护单元 这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作 即要防止系统资源和其他一些任务不受非法访问 嵌入式系统有专门的硬件来检测和限制系统
  • 关于OLED屏的笔记

    OLED即有机发光管 Organic Light Emitting Diode OLED OLED显示技术具有自发光 广视角 几乎无穷高的对比度 较低功耗 极高反应速度 可用于绕曲性面板 使用温度范围广 构造及制程简单等有点 xff0c 被