[应用方案] 以NuMaker--PFM--M487 实现OLED屏显示驱动

2023-05-16

OLED屏是一种自发光的显示器件,它有多种类型,按接口分有I2C接口和SPI接口,按色彩分有单色、双色及彩色屏,按显示规格分为0.91、0.96寸等。

本篇将介绍2种OLED屏的显示驱动,其中一款是I2C接口的 0.96寸双色OLED屏,另一款则是SPI接口的0.96寸彩色OLED屏,开发工具仍为RT_Thread。

1. I2C_OLED屏

I2C接口的OLED屏是最节省I/O口的显示屏,它只需2个GPIO口即可驱动其显示,这里选用的是0.96寸的双色屏,其显示分辨率为128*64像素点。实则它是一款准双色屏。因为尽管它有黄蓝2种色彩,但色彩是分区域使用的,而不能自主的设置色彩来进行显示。

使用NuMaker--PFM--M487驱动OLED双色显示屏其显示效果如图1所示,由于这里是采用GPIO口模拟I2C的方式来实现,故可以不受I2C引脚的限制,能直接插入开发板的Arduino接口上来直接使用。 

图1 显示效果

在上图的连接方式中,该显示屏与开发板的连接关系为:

SDA-- PA1

SCL-- PA2

 

图2  所用Arduino接口

为使定义的引脚输出高低电平,所定义的语句为:

#define CLK_PIN    NU_GET_PININDEX(NU_PA, 2)

#define DIN_PIN    NU_GET_PININDEX(NU_PA, 1)

#define OLED_SCLK_Clr()  rt_pin_write(CLK_PIN, PIN_LOW)

#define OLED_SCLK_Set()  rt_pin_write(CLK_PIN, PIN_HIGH)

#define OLED_SDIN_Clr()  rt_pin_write(DIN_PIN, PIN_LOW)

#define OLED_SDIN_Set()  rt_pin_write(DIN_PIN, PIN_HIGH)

相应的OLED屏初始化函数为:

void OLED_Init(void)

{

    OLED_SCLK_Set();

    OLED_SDIN_Set();

    rt_thread_mdelay(800);

    OLED_WR_Byte(0xAE,OLED_CMD);

    OLED_WR_Byte(0x02,OLED_CMD);

    OLED_WR_Byte(0x10,OLED_CMD);

    OLED_WR_Byte(0x40,OLED_CMD);

    OLED_WR_Byte(0x81,OLED_CMD);

    OLED_WR_Byte(0xff,OLED_CMD);

    OLED_WR_Byte(0xA1,OLED_CMD);

    OLED_WR_Byte(0xC8,OLED_CMD);

    OLED_WR_Byte(0xA6,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(0xd5,OLED_CMD);

    OLED_WR_Byte(0x80,OLED_CMD);

    OLED_WR_Byte(0xD9,OLED_CMD);

    OLED_WR_Byte(0xF1,OLED_CMD);

    OLED_WR_Byte(0xDA,OLED_CMD);

    OLED_WR_Byte(0x12,OLED_CMD);

    OLED_WR_Byte(0xDB,OLED_CMD);

    OLED_WR_Byte(0x40,OLED_CMD);

    OLED_WR_Byte(0x20,OLED_CMD);

    OLED_WR_Byte(0x02,OLED_CMD);

    OLED_WR_Byte(0x8D,OLED_CMD);

    OLED_WR_Byte(0x14,OLED_CMD);

    OLED_WR_Byte(0xA4,OLED_CMD);

    OLED_WR_Byte(0xA6,OLED_CMD);

    OLED_WR_Byte(0xAF,OLED_CMD);

    OLED_WR_Byte(0xAF,OLED_CMD);

}

I/O口模拟I2C方式发送字节数据的函数为:

void Write_IIC_Byte(unsigned char IIC_Byte)

{

    unsigned char i;

    unsigned char m,da;

    da=IIC_Byte;

    OLED_SCLK_Clr();

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

    {

        m=da;

        m=m&0x80;

        if(m==0x80)

        {OLED_SDIN_Set();}

        else OLED_SDIN_Clr();

        rt_hw_us_delay(2);

            da=da<<1;

        OLED_SCLK_Set();

        rt_hw_us_delay(2);

        OLED_SCLK_Clr();

        rt_hw_us_delay(2);

        }

}

OLED屏用于清屏的函数为:

void OLED_Clear(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(0,OLED_DATA);

    }

}

使OLED屏显示字符的函数为:

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)

{

        unsigned char c=0,i=0;

        c=chr-' ';

        if(x>Max_Column-1)

        {

            x=0;

            y=y+2;

        }

        if(Char_Size ==16)

        {

            OLED_Set_Pos(x,y);

            for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);

            OLED_Set_Pos(x,y+1);

            for(i=0;i<8;i++) OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);

         }

         else

         {

                OLED_Set_Pos(x,y);

                for(i=0;i<6;i++) OLED_WR_Byte(F6x8[c][i],OLED_DATA);

         }

}

使OLED屏显示字符串的函数为:

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)

{

    unsigned char j=0;

    while (chr[j]!='\0')

    {

            OLED_ShowChar(x,y,chr[j],Char_Size);

            x+=8;

            if(x>120)

            {

                x=0;

                y+=2;

            }

            j++;

    }

}

实现图示效果的主程序为:

void main(void)

{

    rt_pin_mode(CLK_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(DIN_PIN, PIN_MODE_OUTPUT);

    OLED_Init();

    OLED_Clear();

    OLED_ShowString(20,0,"OLED TEST",16);

    OLED_ShowString(20,2,"NuMarker-",16);

    OLED_ShowString(36,4,"-PFM-M487",16);

    while (1);

}

经编译处理,其结果如图3所示。

 

图3 编译结果

2. SPI_OLED屏

相较于前面介绍的双色OLED屏,基于SPI接口的彩色OLED屏更具色彩表现力,为此它出了用于信息显示外,其更主要的用途则是显示图像信息,其显示效果如图4所示。

该显示屏的分辨率为160*80像素点,支持16位色彩显示。

 

图4 显示效果

在上图的连接方式中,本可以直接将显示屏直接插入Arduino接口来使用,但在实际测试是却发现,连接CS引脚的PA4却无法提供片选控制的低电平信号,故只能由GND来为其提供低电平,故该显示屏与开发板的连接关系为:

VCC---3.3V

GND---GND

SCL---PA2

SDA--- PA1

RES--- PA0

DC--- PA3

CS--- GND

BLK--- PA5

使相关引脚输出高低电平的语句定义为:

#defineOLED_SCLK_Set()   rt_pin_write(SCL,PIN_HIGH)  //CLK

#defineOLED_SCLK_Clr()   rt_pin_write(SCL,PIN_LOW)

#defineOLED_SDIN_Set()   rt_pin_write(SDA,PIN_HIGH)  //DIN

#defineOLED_SDIN_Clr()   rt_pin_write(SDA,PIN_LOW)

#defineOLED_RST_Set()    rt_pin_write(RES,PIN_HIGH)  //RES

#defineOLED_RST_Clr()    rt_pin_write(RES,PIN_LOW)

#defineOLED_DC_Set()     rt_pin_write(DC,PIN_HIGH)    //DC

#defineOLED_DC_Clr()     rt_pin_write(DC,PIN_LOW)

#defineOLED_BLK_Set()    rt_pin_write(BLK,PIN_HIGH);  //BLK

该显示屏的初始化函数为:

void Lcd_Init(void)

{

  OLED_RST_Clr();

  rt_thread_mdelay(200);  //Delay_Ms(200);

  OLED_RST_Set();

  rt_thread_mdelay(200);

  LCD_WR_REG(0x11);

  rt_thread_mdelay(100);

  LCD_WR_REG(0x21);

  LCD_WR_REG(0xB1);

  LCD_WR_DATA8(0x05);

  LCD_WR_DATA8(0x3A);

  LCD_WR_DATA8(0x3A);

  LCD_WR_REG(0xB2);

  LCD_WR_DATA8(0x05);

  LCD_WR_DATA8(0x3A);

  LCD_WR_DATA8(0x3A);

  LCD_WR_REG(0xB3);

  LCD_WR_DATA8(0x05);

  LCD_WR_DATA8(0x3A);

  LCD_WR_DATA8(0x3A);

  LCD_WR_DATA8(0x05);

  LCD_WR_DATA8(0x3A);

  LCD_WR_DATA8(0x3A);

  LCD_WR_REG(0xB4);

  LCD_WR_DATA8(0x03);

  LCD_WR_REG(0xC0);

  LCD_WR_DATA8(0x62);

  LCD_WR_DATA8(0x02);

  LCD_WR_DATA8(0x04);

  LCD_WR_REG(0xC1);

  LCD_WR_DATA8(0xC0);

  LCD_WR_REG(0xC2);

  LCD_WR_DATA8(0x0D);

  LCD_WR_DATA8(0x00);

  LCD_WR_REG(0xC3);

  LCD_WR_DATA8(0x8D);

  LCD_WR_DATA8(0x6A);

  LCD_WR_REG(0xC4);

  LCD_WR_DATA8(0x8D);

  LCD_WR_DATA8(0xEE);

  LCD_WR_REG(0xC5);

  LCD_WR_DATA8(0x0E);

  LCD_WR_REG(0xE0);

  LCD_WR_DATA8(0x10);

  LCD_WR_DATA8(0x0E);

  LCD_WR_DATA8(0x02);

  LCD_WR_DATA8(0x03);

  LCD_WR_DATA8(0x0E);

  LCD_WR_DATA8(0x07);

  LCD_WR_DATA8(0x02);

  LCD_WR_DATA8(0x07);

  LCD_WR_DATA8(0x0A);

  LCD_WR_DATA8(0x12);

  LCD_WR_DATA8(0x27);

  LCD_WR_DATA8(0x37);

  LCD_WR_DATA8(0x00);

  LCD_WR_DATA8(0x0D);

  LCD_WR_DATA8(0x0E);

  LCD_WR_DATA8(0x10);

  LCD_WR_REG(0xE1);

  LCD_WR_DATA8(0x10);

  LCD_WR_DATA8(0x0E);

  LCD_WR_DATA8(0x03);

  LCD_WR_DATA8(0x03);

  LCD_WR_DATA8(0x0F);

  LCD_WR_DATA8(0x06);

  LCD_WR_DATA8(0x02);

  LCD_WR_DATA8(0x08);

  LCD_WR_DATA8(0x0A);

  LCD_WR_DATA8(0x13);

  LCD_WR_DATA8(0x26);

  LCD_WR_DATA8(0x36);

  LCD_WR_DATA8(0x00);

  LCD_WR_DATA8(0x0D);

  LCD_WR_DATA8(0x0E);

  LCD_WR_DATA8(0x10);

  LCD_WR_REG(0x3A);

  LCD_WR_DATA8(0x05);

  LCD_WR_REG(0x36);

  LCD_WR_DATA8(0x78);

  LCD_WR_REG(0x29);

  OLED_BLK_Set();

}

以指定色彩清除显示屏的函数为:

void LCD_Clear(u16 Color)

{

    u16 i,j;

    LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);

    for(i=0;i<LCD_W;i++)

      {

            for (j=0;j<LCD_H;j++)

            {

                    LCD_WR_DATA(Color);

            }

      }

}

显示满屏图片显示的函数为:

void LCD_ShowPicture(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)

{

uint16_t i;

LCD_Address_Set(x1,y1,x2,y2);

for(i=0;i<12800;i++)

{

LCD_WR_DATA8(gImage_RW[i*2]);

LCD_WR_DATA8(gImage_RW[i*2+1]);

}

}

其中的数值gImage_RW[],用于存放显示的图片数据。

实现图示效果的主程序为:

void main(void)

{

    uint8_t i;

    rt_pin_mode(SCL_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(SDA_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(RES_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(DC_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);

    rt_pin_mode(BLK_PIN, PIN_MODE_OUTPUT);

    Lcd_Init();

    LCD_Clear(BLACK);

    LCD_ShowPicture(0,0,159,79);

    while (1);

}

为自己需要的图片内容,可使用相应的图片处理工具将图片的内容转换为相应格式的文件,图5所示的就是这样一种处理工具。用它可生成一个C语言数组,并以*.h为文件后缀加以保存。

这样就可以同前面给出的图像显示函数LCD_ShowPicture()相匹配,若显示的图片规格小于屏幕的尺寸,还可指定图片的显示位置。当然,若图片的规格小于屏幕的尺寸则需要适当地调整循环的次数,以匹配图片的字节数。

图5 数据文件生成工具

此外,在配备文字显示函数的情况下,可完成图6所示的信息显示。

 

图6 位置显示效果

其中用于字符及字符串显示的函数分别为:

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color)

{

    u8 temp;

    u8 pos,t;

    u16 x0=x;

    if(x>LCD_W-16||y>LCD_H-16) return;

    num=num-' ';

    LCD_Address_Set(x,y,x+8-1,y+16-1);

    if(!mode)

    {

        for(pos=0;pos<16;pos++)

        {

            temp=asc2_1608[(u16)num*16+pos];

            for(t=0;t<8;t++)

          {

                if(temp&0x01)LCD_WR_DATA(color);

                else LCD_WR_DATA(BACK_COLOR);

                temp>>=1;

                x++;

          }

            x=x0;

            y++;

        }

    }

    else

    {

        for(pos=0;pos<16;pos++)

        {

            temp=asc2_1608[(u16)num*16+pos];

            for(t=0;t<8;t++)

            {

                if(temp&0x01)LCD_DrawPoint(x+t,y+pos,color);

                temp>>=1;

            }

        }

    }

}

void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)

{

    while(*p!='\0')

    {

        if(x>LCD_W-16){x=0;y+=16;}

        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}

        LCD_ShowChar(x,y,*p,0,color);

        x+=8;

        p++;

    }

}

中文显示函数为:

void LCD_ShowChinese(uint16_t x,uint16_t y,uint8_t index,uint8_t size,uint16_t color)

{

    uint8_t i,j;

    uint8_t *temp,size1;

    if(size==16)temp=Hzk16;

    if(size==32)temp=Hzk32;

    LCD_Address_Set(x,y,x+size-1,y+size-1);

    size1=size*size/8;

    temp+=index*size1;

    for(j=0;j<size1;j++)

    {

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

        {

            if((*temp&(1<<i))!=0)

            {

                LCD_WR_DATA(color);

            }

            else

            {

                LCD_WR_DATA(BACK_COLOR);

            }

        }

        temp++;

     }

}

所用的16和32点阵的字模数组格式为:

u8 Hzk16[]={

0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x84,0x10,0x84,0x10,0x84,0x10,

0x84,0x10,0x84,0x10,0xFC,0x1F,0x84,0x10,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,/*"中",0*/

...

}

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x01,0x00,

0x10,0x80,0x01,0x0C,0xF0,0xFF,0xFF,0x0F,0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,

0x30,0x80,0x01,0x04,0x30,0x80,0x01,0x04,0xF0,0xFF,0xFF,0x07,0x30,0x80,0x01,0x04,

0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,

0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"中",0*/

...

}

对应于图6显示效果的主程序为:

void main(void)

{

rt_pin_mode(SCL_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(SDA_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(RES_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(DC_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(CS_PIN, PIN_MODE_OUTPUT);

rt_pin_mode(BLK_PIN, PIN_MODE_OUTPUT);

Lcd_Init();

LCD_Clear(BLACK);

LCD_ShowString(0,0, "NuMaker-PFM-M487",YELLOW);

LCD_ShowString(20,20,"0.96'   OLED",YELLOW);

LCD_ShowChinese(20,60,0,16,RED);

LCD_ShowChinese(40,60,1,16,RED);

LCD_ShowChinese(60,60,3,16,RED);

LCD_ShowChinese(80,60,4,16,RED);

while (1);

}

3. 软件包的使用

前面曾说过使用RT_Thread的优点之一就是可以用软件包来扩展对外设的使用,对于OLED屏在软件包中也是通过支持的。

那该如何使用它呢?

其具体步骤如下:

1)创建一个基于M487开发板的项目

2)点击 

 

3)点击  ,从中选取ssd1306,见图7所示。

 

 

图7 选取器件

 

图8 相关介绍

4)选取  下的“配置项”,再由“软件包”选项卡,按图9加以设置。

 

 

图9 选项设置

5)选取“硬件”选项卡,并按图10进行设置,然后加以“全部保存”。

 

图10选项设置

6)完成主程序的编写

主程序的内容如下:

#include <stdio.h>

#include <stdlib.h>

#include <rtthread.h>

#include <rtdevice.h>

#include <board.h>

#include <string.h>

#include "ssd1306.h"

int main(int argc, char **argv)

{

ssd1306_TestAll();

return 0;

}

ssd1306的测试函数为:

void ssd1306_TestAll()

{

ssd1306_Init();

ssd1306_TestFPS();

rt_thread_mdelay(3000);

ssd1306_TestBorder();

ssd1306_TestFonts();

rt_thread_mdelay(3000);

ssd1306_Fill(Black);

ssd1306_TestRectangle();

ssd1306_TestLine();

rt_thread_mdelay(3000);

ssd1306_Fill(Black);

ssd1306_TestPolyline();

rt_thread_mdelay(3000);

ssd1306_Fill(Black);

ssd1306_TestArc();

rt_thread_mdelay(3000);

ssd1306_Fill(Black);

ssd1306_TestCircle();

rt_thread_mdelay(3000);

}

7)完成程序的编译,以生成目标文件rtthread.bin。

8)连接OLED屏,该显示屏与开发板的连接关系如图11所示。

图11 引脚连接

9)完成程序下载,其运行效果如图12和图13所示。

图12 显示字符

图13显示图形

除了OLED屏,还有其他的显示器类型,如TFT显示屏、LCD1602、LCD12864及LCD5110等,后面再陆续与大家分享其驱动的方法。
---------------------
作者:jinglixixi
链接:https://bbs.21ic.com/icview-3214156-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

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

[应用方案] 以NuMaker--PFM--M487 实现OLED屏显示驱动 的相关文章

  • unity用按钮跳转场景代码

    首先创建场景scene 0 xff0c 在上面创建一个按钮 xff0c 保存scene 0 然后创建场景scene 1 xff0c 保存scene 1 然后分别运行其场景 xff0c 在运行的过程中 xff0c 点击 File gt Bui
  • Unity给游戏添加倒计时和分数

    总觉得敲代码可难可难 xff0c 昨天做了一天 xff0c 游戏雏形出来了 xff0c 涉及到逻辑一块却很棘手 xff0c 网上百度了 xff0c 版本太多 xff0c 实现的效果也不近人意 问室友 xff0c 分分钟就解决了 xff0c
  • 建立对象模型即使用UML画类图

    UML类图画法及其之间的几种关系 最近复习软件工程的考试 xff0c 大题需要画一下类图 xff0c 发现类图的画法及其之间的几种关系已经淡忘了很多 xff0c 上百度进行搜索 xff0c 发现了一篇学习笔记 xff0c 整理总结的不错哦
  • Maya里面的模型动画导入Unity使用

    听别人将东西要是不感兴趣还真是听不进去 xff0c 听老师讲课更是如此 xff0c 有时候还起到很好地催眠作用 最近一直在想模型原创的问题 xff0c 如何自己制动画导入Unity进行使用 xff0c 上百度上开始寻找方法 xff0c 有时
  • 对象模型,动态模型,功能模型

    第七周作业 用面向对象方法分析研究书中习题2第3题中描述的机票预订系统 xff0c 试建立它的对象模型 动态模型和功能模型 来源 xff1a 博客园 2016 04 18 对象模型如下 xff1a 动态模型如下 xff1a 功能模型如下 x
  • 要你命三千又三千的成长之旅

    今天 xff0c 是我第一回玩博客 xff0c 也是作为一个小白听从他人的建议 xff0c 用博客来记录自己的电脑学习之旅 xff0c 自己的成长之旅 xff01 我不喜欢博客 xff0c 但是我依然要开始努力用博客记录自己的点点滴滴 xf
  • UML中关联,依赖,聚集,组成的联系和区别

    在UML中 xff0c 关联 xff0c 依赖 xff0c 聚集 xff0c 组成的联系十分紧密 xff0c 不容易区分 xff0c 本文试图用通俗的语言来讲解这四种关系的区别 关联 xff0c 即是发生关系 xff0c 一个类A关联类B
  • XML基础

    首先用记事本建立一个XML文件 xff0c 后缀自己改txt gt xml lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt root gt lt Level gt lt n
  • 科研必备的14个学术搜索引擎

    学术搜索可以帮助学术科研人员快速寻找学术资料 xff0c 如专家评审文献 论文 书籍 预印本 摘要以及技术报告等 本文为你介绍14个学术搜索引擎 1 Google Scholar Google 推出的免费学术搜索工具 xff0c 可以帮助用
  • Windows 10中python2和python3共存

    在win10中暗转python2和python3在命令行同时使用时可能无法实现 xff0c 因为安装python3时默认只有python exe和python2里的一样 xff0c 所以这时候需要再弄一个python3 exe来区分 xff
  • 解决error: unknown type name ‘__u8’问题,认识__u8,__u16,__u32,__u64的大小及作用

    1 解决Linux error unknown type name u8 问题 xff1a 内核提供的数据类型都在头文件 lt asm types h gt 声明 xff0c 可以在程序中加上 include lt asm types h
  • 基于ZigBee的智能家居系统

    本项目基于C 编写智能家居系统PC客户端 同时编写安卓客户端 代码下载链接https download csdn net download hzqgangtiexia 10435931 1 硬件选型及数据采集 节点板子以CC2530芯片为核
  • 一文理解ZigBee通信全过程(基于ZStack-CC2530-2.5.1a协议栈)

    自己在word中整理的笔记 基本上详细的分析了Zigbee的原理 比较透彻 分享给大家交流参考 目录 0概述 2 1协议栈整体运行流程 3 1 1 操作系统初始化流程 5 1 2操作系统启动 9 2相关数据结构与函数调用 13 3 ZigB
  • 深度学习(五)学习率的调节

    nbsp nbsp nbsp 学习率对于深度学习是一个重要的超参数 它控制着基于损失梯度调整神经网络权值的速度 大多数优化算法 SGD RMSprop Adam 对其都有所涉及 学习率越小 损失梯度下降的速度越慢 收敛的时间更长 如公式所示
  • 深度学习(九)正则化惩罚项

    在机器学习特别是深度学习中 xff0c 我们通过大量数据集希望训练得到精确 泛化能力强的模型 xff0c 对于生活中的对象越简洁 抽象就越容易描述和分别 xff0c 相反 xff0c 对象越具体 复杂 明显就越不容易描述区分 xff0c 描
  • 深度学习(十五)卷积神经网络CNN(3)---局部连接

    作用 xff1a 降低参数数目 xff0c 减少网络运算复杂度 原理 xff1a 一般认为人对外界的认知是从局部到全局的 xff0c 而图像的空间联系也是局部的像素联系较为紧密 xff0c 而距离较远的像素相关性则较弱 因而 xff0c 每
  • 深度学习(十五)卷积神经网络CNN(5)---池化层/采样层

    池化层的输入一般来源于上一个卷积层 xff0c 主要作用是提供了很强的鲁棒性 xff08 例如max pooling是取一小块区域中的最大值 xff0c 此时若此区域中的其他值略有变化 xff0c 或者图像稍有平移 xff0c poolin
  • 深度学习(十九)对抗学习(1)

    sorry 笔记正在上传
  • 深度学习(十九)对抗学习(2)

    sorry 笔记正在上传
  • C#界面开发终极UI工具包分享——Krypton

    目录 摘要 1 实例展示 2 下载 3 使用 3 1 直接用源码中例程 3 2 在已有的工程中添加Krypton库 摘要 能看到这篇分享的小伙伴 我相信都对C 的界面开发有了一定的了解 每当自己辛辛苦苦地做完了一个上位机小工具 但总是觉得U

随机推荐

  • 深度学习(十九)对抗学习(3)

    sorry 笔记正在上传
  • 函数指针和回调函数以及返回指向函数的指针

    nbsp nbsp nbsp nbsp 函数指针指向的是函数而非对象 和其他类型一样 函数指针指向某种特定类型 因为函数的类型由它的返回类型和形参类型共同决定 与函数名无关 所以想要声明一个函数指针 只需要用指针替换函数名即可 例如 比较字
  • Winform的控件学习整理篇

    窗体 窗体是整个WinForm的核心 xff0c 在Windows系统上的每一个界面都可以看作是一个窗体 xff0c 只不过其功能各异而已 新建一个空白的窗体 xff1a 窗体常用属性 xff1a name xff1a 窗体的名称 xff0
  • 解决vnc在win7下黑屏的问题

    解决vnc在win7下黑屏的问题 xff0c 在服务里面禁用vnc服务 xff0c 然后在启动里面加上服务程序 一切OK 黑屏的原因是启动了两份进程 xff0c 客户端连的总是后面一个 xff0c 有时黑屏有时不黑 只开一个进程就行了
  • 巧用“谷歌学术”,轻松完成参考文献

    巧用 谷歌学术 xff0c 轻松完成参考文献 作者 xff1a 毛斌 谷歌学术 是谷歌搜索引擎中的学术检索部分 xff0c 相对于知网 维普 万方 Pubmed等专业的论文数据库来说功能单薄了些 xff0c 但具有页面简约 搜索速度快 集国
  • 计算机网络——OSI网络层次的划分

    网络层次的划分 7 物理层 xff08 Physics Layer xff09 中继器 xff08 Repeater xff0c 也叫放大器 xff09 集线器 xff08 HUB xff09 6 数据链路层 xff08 Data Link
  • 深刻理解需求场景:三层 与 三见

    透彻理解用户的需求场景 xff0c 重要性不必多说 xff0c 这篇给几个极简的例子 需求有三层 观点和行为 目标和动机 人性和心智 工地上 xff0c 希望工人安全生产的口号 xff0c 如下写法依次对应着三层 进入工地 xff0c 记得
  • 三谈 钉钉、企微、飞书 的不同:优势即劣势

    最近几周和好几位钉钉 飞书的高管都有交流 xff0c 所以继续聊几句钉钉 企微 飞书给我的启发 一句话总结 xff0c 就是 xff1a 高水平的竞争 xff0c 优势即劣势 xff0c 所以只能把它看做自己的特点 xff0c 并找到独特的
  • 用户生态案例分析:以一场培训为例

    用户生态 利益相关人分析是个很有用的工具 一场简单的线下培训 xff0c 聚焦到现场实施时 xff0c 也有 用户生态 xff0c 以企业内训为例 xff0c 粗略分析一下 我们以 讲师 顾问 教练 这个角色为中心 xff0c 都有哪些利益
  • 2月了,开工,讲个需求蔓延的小故事

    年前有一段时间比较空 xff0c 小小折腾升级了一下家里的影音系统 xff0c 转念一想 xff0c 是个典型的需求蔓延案例 事情的起点是 客厅有一个天猫的投影 xff0c 放在和沙发旁的边几上 xff0c 投白墙 xff0c 白天偶尔想看
  • MYSQL知识点

    本文根据bilibili达内的大数据课程 xff08 BV1FQ4yR7SM xff09 总结 xff0c 受益匪浅 学习的比较慢 xff0c 学完某块 xff0c 我也会继续上传我的笔记 1 mysql基本概念 xff08 1 xff09
  • 用AI给娃定制绘本 #麻瓜+AI混合工作流试验 9

    这次试着用AI给娃定制一本绘本 xff0c 目的是解决一个问题 娃很喜欢国际象棋 xff0c 但在下棋的时候又很怕输 过程中尽量少人工参与 xff0c 先看半成品 xff0c 再说工作流 这个画风 xff0c 有点像娃喜欢的 工作细胞 主要
  • 逃避可耻但有用——当竞争太激烈时的一个通用解法

    往上游走 xff0c 去服务你的竞争对手 竞争激烈 xff0c 意味着供给太多而需求太少 但我们知道 xff0c 供需是有链条的 xff0c 当供需链条里某个生态位上供给太多 xff0c 即玩家太多 xff0c 也意味着这个生态位的需求也多
  • 尝试寻找一些合作伙伴,产品相关培训咨询服务介绍(2B/支持在线)

    若干年来 xff0c 在线下 xff0c 我提供的服务基本都是走进企业的 xff0c 几乎没开过公开课 xff08 如果行业会议上几十分钟的分享不算的话 xff09 而线上的音视频课 训练营等形式都也做过 xff0c 特别是过去的疫情三年
  • 产品总监可以通过培训提升么 to HR/管理者

    我觉得是不行的 从产品岗位从初级到高级 xff0c 越初级 xff0c 越可以通过学习一些标准化的知识 技能来 打底 xff0c 目的是提升下限 而到了总监级别 xff0c 默认已经知道了基础方法论 领域知识 xff08 不知道的也应该有自
  • 产品设计体会(十六)——Feature List

    这周来点实在的 xff0c 这两天主要在列新产品的Feature List 说一下自己感觉这个玩意应该怎么做 xff0c 其中吸取了叶老大原来的表格还有网上一些相关文章的内容 这个表是用Excel 做的 xff0c 一些简单的技巧 xff0
  • 【原创】产品经理值得看的16个博客

    这些都是我经常看的博客 xff0c 但没有一个产品经理的博客 xff0c xff1a xff09 xff08 注意逻辑 xff1a 我并没有说我经常看的博客里没有产品经理的博客 xff09 我觉得产品经理应该是通才 xff0c 本行功夫自不
  • 长假多图-生活中产品的小细节

    再长的休假也有结束的时候 xff0c 今天第一天上班 假期中跑了一些地方 xff0c 拍了一些照片 xff0c 晚上整理起来 xff0c 发现还是挺职业病的 xff0c 特地拍摄了一些生活中产品的小细节 xff0c 分享给大家 先是在南京
  • 给想转行做产品经理的同学

    已经很长一段时间了 xff0c 不断收到邮件 xff0c 有应届生 技术人员 运营人员等等 xff0c 说因为种种原因 xff08 排名第一的原因居然是看了 某本书 xff0c 囧 xff09 xff0c 发现自己真的很喜欢做产品经理 xf
  • [应用方案] 以NuMaker--PFM--M487 实现OLED屏显示驱动

    OLED屏是一种自发光的显示器件 xff0c 它有多种类型 xff0c 按接口分有I2C接口和SPI接口 xff0c 按色彩分有单色 双色及彩色屏 xff0c 按显示规格分为0 91 0 96寸等 本篇将介绍2种OLED屏的显示驱动 xff