zoukankan      html  css  js  c++  java
  • Arduino Adafruit_SSD1306的使用

    鸟哥:https://blog.csdn.net/dpjcn1990/article/details/103376058

     设置字体:   参考:https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts#       https://forum.arduino.cc/index.php?topic=460827.0

    #include <Adafruit_GFX.h> // Core graphics library
    #include <Fonts/FreeSerif9pt7b.h>

    display.setFont(&FreeSerif9pt7b);

     display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Hello, Arduino!");
      display.setCursor(0,8);
    //  display.setTextColor(BLACK,WHITE);
      display.setTextColor(WHITE);
      display.setTextSize(2);
      display.println(3.55);

    目前支持的字体:

    /**
    * 日期:2017/09/24
    * 功能:OLED12864  SSD1306测试
    * 作者:单片机菜鸟
    * 16X16点阵显示 取模方式 阴码+逐行式+顺向
    **/
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
     
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
     
    #define NUMFLAKES 10
    #define XPOS 0
    #define YPOS 1
    #define DELTAY 2
     
    #define LOGO16_GLCD_HEIGHT 16 
    #define LOGO16_GLCD_WIDTH  16 
     
    #if (SSD1306_LCDHEIGHT != 64)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
     
    //显示一个心形
    static const uint8_t PROGMEM Heart_16x16[] = {
      0x00,0x00,0x18,0x18,0x3C,0x3C,0x7E,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x00,0x00//未命名文件0
    };
     
    //"猛"
    static const uint8_t PROGMEM Strong_16x16[] = {
      0x00,0x00,0x45,0xFC,0x28,0x08,0x10,0x10,0x28,0x20,0x4B,0xFE,0x88,0x20,0x08,0xA0,
      0x18,0x40,0x29,0xFC,0x49,0x54,0x89,0x54,0x09,0x54,0x09,0x54,0x57,0xFE,0x20,0x00//猛0
    };
     
    static const uint8_t PROGMEM Welcome_16x16[] ={
    0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,
    0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,//欢0
    0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,
    0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,//迎1
    0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x11,0x10,0x09,0x10,0x09,0x20,
    0xFF,0xFE,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,0x01,0x00,//来2
    0x00,0x04,0xFF,0x84,0x08,0x04,0x10,0x24,0x22,0x24,0x41,0x24,0xFF,0xA4,0x08,0xA4,
    0x08,0x24,0x08,0x24,0x7F,0x24,0x08,0x24,0x08,0x04,0x0F,0x84,0xF8,0x14,0x40,0x08,//到3
    0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,
    0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,//王4
    0x02,0x00,0x02,0x08,0x3F,0xD0,0x02,0x20,0x02,0x40,0xFF,0xFE,0x01,0x00,0x02,0x00,
    0x0F,0xF0,0x18,0x10,0x28,0x10,0x4F,0xF0,0x88,0x10,0x08,0x10,0x0F,0xF0,0x08,0x10,//者5
    0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x00,0x00,0x7F,0xFE,0x40,0x02,0x81,0x04,
    0x01,0x00,0x7F,0xFC,0x03,0x80,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,//荣6
    0x10,0x00,0x11,0xDC,0x90,0x44,0x55,0x54,0x58,0xCC,0x11,0x54,0xFC,0x00,0x28,0x48,
    0x28,0xFE,0x29,0x90,0x2A,0xFC,0x28,0x90,0x2A,0xFC,0x4C,0x90,0x48,0xFE,0x80,0x80//耀7
    }; 
     
    static const uint8_t PROGMEM Author_16x16[] ={
    0x10,0x10,0x08,0x20,0x04,0x40,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
    0x21,0x08,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,//单0
    0x00,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x1F,0xFC,0x10,0x00,0x10,0x00,
    0x10,0x00,0x1F,0xE0,0x10,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x40,0x20,//片1
    0x10,0x00,0x11,0xF0,0x11,0x10,0x11,0x10,0xFD,0x10,0x11,0x10,0x31,0x10,0x39,0x10,
    0x55,0x10,0x55,0x10,0x91,0x10,0x11,0x12,0x11,0x12,0x12,0x12,0x12,0x0E,0x14,0x00,//机2
    0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x00,0x10,0x00,0xF8,0x3F,0x00,0x11,0x10,
    0x08,0x20,0x01,0x00,0x7F,0xFC,0x05,0x40,0x09,0x20,0x31,0x18,0xC1,0x06,0x01,0x00,//菜3
    0x01,0x00,0x02,0x00,0x1F,0xF0,0x10,0x10,0x12,0x10,0x11,0x10,0x11,0x50,0x10,0x20,
    0x10,0x00,0x1F,0xFC,0x00,0x04,0x00,0x04,0x7F,0xE4,0x00,0x04,0x00,0x28,0x00,0x10,//鸟4
    }; 
     
    void setup()   {                
      Serial.begin(115200);
      delay(500);
      // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64) 
    }
     
    void loop() {
      test_SSD1306();
    }
     
    void test_SSD1306(void){
        //1.检测全屏显示(看看有没有大面积坏点)
      display.fillScreen(WHITE);
      display.display();
      delay(2000);
     
      //2.画点 点坐标(10,10)
      display.clearDisplay();   // clears the screen and buffer
      display.drawPixel(10, 10, WHITE);
      display.display();
      delay(2000);
     
      //3. 画线 从(0,0)到(50,50)
      display.clearDisplay();   // clears the screen and buffer
      display.drawLine(0, 0,50,50, WHITE);
      display.display();
      delay(2000);
     
      //4.画空心矩形  左上角坐标(x0,y0)  右下角坐标(x1,y1)
      display.clearDisplay();   // clears the screen and buffer
      display.drawRect(0,0,128,64,WHITE);
      display.display();
      delay(2000);
     
      //5.来画个实心矩形
      display.clearDisplay();   // clears the screen and buffer
      display.fillRect(0,0,64,64,WHITE);
      display.display();
      delay(2000);
     
      //6.画空心圆
      display.clearDisplay();   // clears the screen and buffer
      display.drawCircle(20,20,20,WHITE);
      display.display();
      delay(2000);
      
      //7.画实心圆
      display.clearDisplay();   // clears the screen and buffer
      display.fillCircle(20,20,20,WHITE);
      display.display();
      delay(2000);
     
      //8.画空心三角形
      display.clearDisplay();   // clears the screen and buffer
      display.drawTriangle(20,0,0,20,40,20,WHITE);
      display.display();
      delay(2000);
     
      //9.画实心三角形
      display.clearDisplay();   // clears the screen and buffer
      display.fillTriangle(20,0,0,20,40,20,WHITE);
      display.display();
      delay(2000);
     
      //10.画空心圆角矩形
      display.clearDisplay();   // clears the screen and buffer
      display.drawRoundRect(0,0,40,40,5,WHITE);
      display.display();
      delay(2000);
     
      //11.画实心圆角矩形
      display.clearDisplay();   // clears the screen and buffer
      display.fillRoundRect(0,0,40,40,5,WHITE);
      display.display();
      delay(2000);
     
      //12.画心形(楼主自己用取模软件画的)
      display.clearDisplay();   // clears the screen and buffer
      display.drawBitmap(16,16,Heart_16x16,16,16,WHITE);
      display.display();
      delay(2000);
     
      //13.显示英文 数字
      display.clearDisplay();   // clears the screen and buffer
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.println("Hello, Arduino!");
      display.setTextColor(BLACK, WHITE); // 'inverted' text
      display.println(3.141592);
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.print("0x"); display.println(0xDEADBEEF, HEX);
      display.display();
      delay(2000);
     
      //14.显示单个文字 有木有发现就是调用drawBitmap
      display.clearDisplay();   // clears the screen and buffer
      display.drawBitmap(16,16,Strong_16x16,16,16,WHITE);
      display.display();
      delay(2000);
      
      //15.显示多个文字(楼主在库里面加入一个ShowCN_16方法  就是为了同时显示多个中文 16X16 ,不然的话 就得一个一个drawBitmap)
      display.clearDisplay();   // clears the screen and buffer
      display.ShowCN_16(0,0, Welcome_16x16,sizeof(Welcome_16x16)/32,WHITE);
      display.ShowCN_16(48,16, Author_16x16,sizeof(Author_16x16)/32,WHITE);    
      display.display();
      delay(2000); 
    }
    /**************************************************************************
     This is an example for our Monochrome OLEDs based on SSD1306 drivers
    
     Pick one up today in the adafruit shop!
     ------> http://www.adafruit.com/category/63_98
    
     This example is for a 128x32 pixel display using I2C to communicate
     3 pins are required to interface (two I2C and one reset).
    
     Adafruit invests time and resources providing this open
     source code, please support Adafruit and open-source
     hardware by purchasing products from Adafruit!
    
     Written by Limor Fried/Ladyada for Adafruit Industries,
     with contributions from the open source community.
     BSD license, check license.txt for more information
     All text above, and the splash screen below must be
     included in any redistribution.
     **************************************************************************/
    
    #include <SPI.h>
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    // 这里的屏幕是128X64 SSD1306
    #define SCREEN_WIDTH 128 // OLED display width, in pixels
    #define SCREEN_HEIGHT 64 // OLED display height, in pixels
    
    // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
    #define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
    // 构造类函数 IIC版本
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
    #define NUMFLAKES     10 // Number of snowflakes in the animation example
    
    // drawBitmap
    #define LOGO_HEIGHT   16
    #define LOGO_WIDTH    16
    static const unsigned char PROGMEM logo_bmp[] =
    { B00000000, B11000000,
      B00000001, B11000000,
      B00000001, B11000000,
      B00000011, B11100000,
      B11110011, B11100000,
      B11111110, B11111000,
      B01111110, B11111111,
      B00110011, B10011111,
      B00011111, B11111100,
      B00001101, B01110000,
      B00011011, B10100000,
      B00111111, B11100000,
      B00111111, B11110000,
      B01111100, B11110000,
      B01110000, B01110000,
      B00000000, B00110000 };
    
    void setup() {
      Serial.begin(9600);
    
      // 第一个步骤 begin启动函数 创建buffer缓存
      // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
      }
    
      // Show initial display buffer contents on the screen --
      // the library initializes this with an Adafruit splash screen.
      // 显示内容 默认显示 Adafruit 启动页面
      display.display();
      delay(2000); // Pause for 2 seconds
    
      // Clear the buffer 清理缓存
      display.clearDisplay();
    
      // Draw a single pixel in white 绘制类函数(单一像素点)
      display.drawPixel(10, 10, SSD1306_WHITE);
    
      // Show the display buffer on the screen. You MUST call display() after
      // drawing commands to make them visible on screen!
      // 执行显示类函数
      display.display();
      delay(2000);
      // display.display() is NOT necessary after every single drawing command,
      // unless that's what you want...rather, you can batch up a bunch of
      // drawing operations and then update the screen all at once by calling
      // display.display(). These examples demonstrate both approaches...
    
      // 测试绘制线方法
      testdrawline();      // Draw many lines
      // 测试绘制空心矩形方法
      testdrawrect();      // Draw rectangles (outlines)
      // 测试绘制实心矩形方法
      testfillrect();      // Draw rectangles (filled)
      // 测试绘制空心圆方法
      testdrawcircle();    // Draw circles (outlines)
      // 测试绘制实心圆方法
      testfillcircle();    // Draw circles (filled)
      // 测试绘制空心圆角矩形方法
      testdrawroundrect(); // Draw rounded rectangles (outlines)
      // 测试绘制实心圆角矩形方法
      testfillroundrect(); // Draw rounded rectangles (filled)
      // 测试绘制空心三角形方法
      testdrawtriangle();  // Draw triangles (outlines)
      // 测试绘制实心三角形方法
      testfilltriangle();  // Draw triangles (filled)
      // 测试绘制字符方法
      testdrawchar();      // Draw characters of the default font
    
      testdrawstyles();    // Draw 'stylized' characters
      // 测试滚动方法
      testscrolltext();    // Draw scrolling text
      // 测试绘制图片方法
      testdrawbitmap();    // Draw a small bitmap image
    
      // Invert and restore display, pausing in-between
      display.invertDisplay(true);
      delay(1000);
      display.invertDisplay(false);
      delay(1000);
    
      testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
    }
    
    void loop() {
    }
    
    void testdrawline() {
      int16_t i;
      // 清理缓存
      display.clearDisplay(); // Clear display buffer
    
      for(i=0; i<display.width(); i+=4) {
        display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
        display.display(); // Update screen with each newly-drawn line
        delay(1);
      }
      for(i=0; i<display.height(); i+=4) {
        display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      delay(250);
    
      display.clearDisplay();
    
      for(i=0; i<display.width(); i+=4) {
        display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      for(i=display.height()-1; i>=0; i-=4) {
        display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      delay(250);
    
      display.clearDisplay();
    
      for(i=display.width()-1; i>=0; i-=4) {
        display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      for(i=display.height()-1; i>=0; i-=4) {
        display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      delay(250);
    
      display.clearDisplay();
    
      for(i=0; i<display.height(); i+=4) {
        display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
      for(i=0; i<display.width(); i+=4) {
        display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
        display.display();
        delay(1);
      }
    
      delay(2000); // Pause for 2 seconds
    }
    
    void testdrawrect(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<display.height()/2; i+=2) {
        display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
        display.display(); // Update screen with each newly-drawn rectangle
        delay(1);
      }
    
      delay(2000);
    }
    
    void testfillrect(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<display.height()/2; i+=3) {
        // The INVERSE color is used so rectangles alternate white/black
        display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
        display.display(); // Update screen with each newly-drawn rectangle
        delay(1);
      }
    
      delay(2000);
    }
    
    void testdrawcircle(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
        display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
    
      delay(2000);
    }
    
    void testfillcircle(void) {
      display.clearDisplay();
    
      for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
        // The INVERSE color is used so circles alternate white/black
        display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
        display.display(); // Update screen with each newly-drawn circle
        delay(1);
      }
    
      delay(2000);
    }
    
    void testdrawroundrect(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<display.height()/2-2; i+=2) {
        display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
          display.height()/4, SSD1306_WHITE);
        display.display();
        delay(1);
      }
    
      delay(2000);
    }
    
    void testfillroundrect(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<display.height()/2-2; i+=2) {
        // The INVERSE color is used so round-rects alternate white/black
        display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
          display.height()/4, SSD1306_INVERSE);
        display.display();
        delay(1);
      }
    
      delay(2000);
    }
    
    void testdrawtriangle(void) {
      display.clearDisplay();
    
      for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
        display.drawTriangle(
          display.width()/2  , display.height()/2-i,
          display.width()/2-i, display.height()/2+i,
          display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
        display.display();
        delay(1);
      }
    
      delay(2000);
    }
    
    void testfilltriangle(void) {
      display.clearDisplay();
    
      for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
        // The INVERSE color is used so triangles alternate white/black
        display.fillTriangle(
          display.width()/2  , display.height()/2-i,
          display.width()/2-i, display.height()/2+i,
          display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);
        display.display();
        delay(1);
      }
    
      delay(2000);
    }
    
    void testdrawchar(void) {
      display.clearDisplay();
    
      display.setTextSize(1);      // Normal 1:1 pixel scale
      display.setTextColor(SSD1306_WHITE); // Draw white text
      display.setCursor(0, 0);     // Start at top-left corner
      display.cp437(true);         // Use full 256 char 'Code Page 437' font
    
      // Not all the characters will fit on the display. This is normal.
      // Library will draw what it can and the rest will be clipped.
      for(int16_t i=0; i<256; i++) {
        if(i == '
    ') display.write(' ');
        else          display.write(i);
      }
    
      display.display();
      delay(2000);
    }
    
    void testdrawstyles(void) {
      display.clearDisplay();
    
      display.setTextSize(1);             // Normal 1:1 pixel scale
      display.setTextColor(SSD1306_WHITE);        // Draw white text
      display.setCursor(0,0);             // Start at top-left corner
      display.println(F("Hello, world!"));
    
      display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
      display.println(3.141592);
    
      display.setTextSize(2);             // Draw 2X-scale text
      display.setTextColor(SSD1306_WHITE);
      display.print(F("0x")); display.println(0xDEADBEEF, HEX);
    
      display.display();
      delay(2000);
    }
    
    void testscrolltext(void) {
      display.clearDisplay();
    
      display.setTextSize(2); // Draw 2X-scale text
      display.setTextColor(SSD1306_WHITE);
      display.setCursor(10, 0);
      display.println(F("scroll"));
      display.display();      // Show initial text
      delay(100);
    
      // Scroll in various directions, pausing in-between:
      display.startscrollright(0x00, 0x0F);
      delay(2000);
      display.stopscroll();
      delay(1000);
      display.startscrollleft(0x00, 0x0F);
      delay(2000);
      display.stopscroll();
      delay(1000);
      display.startscrolldiagright(0x00, 0x07);
      delay(2000);
      display.startscrolldiagleft(0x00, 0x07);
      delay(2000);
      display.stopscroll();
      delay(1000);
    }
    
    void testdrawbitmap(void) {
      display.clearDisplay();
    
      display.drawBitmap(
        (display.width()  - LOGO_WIDTH ) / 2,
        (display.height() - LOGO_HEIGHT) / 2,
        logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
      display.display();
      delay(1000);
    }
    
    #define XPOS   0 // Indexes into the 'icons' array in function below
    #define YPOS   1
    #define DELTAY 2
    
    void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
      int8_t f, icons[NUMFLAKES][3];
    
      // Initialize 'snowflake' positions
      for(f=0; f< NUMFLAKES; f++) {
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
        Serial.print(F("x: "));
        Serial.print(icons[f][XPOS], DEC);
        Serial.print(F(" y: "));
        Serial.print(icons[f][YPOS], DEC);
        Serial.print(F(" dy: "));
        Serial.println(icons[f][DELTAY], DEC);
      }
    
      for(;;) { // Loop forever...
        display.clearDisplay(); // Clear the display buffer
    
        // Draw each snowflake:
        for(f=0; f< NUMFLAKES; f++) {
          display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
        }
    
        display.display(); // Show the display buffer on the screen
        delay(200);        // Pause for 1/10 second
    
        // Then update coordinates of each flake...
        for(f=0; f< NUMFLAKES; f++) {
          icons[f][YPOS] += icons[f][DELTAY];
          // If snowflake is off the bottom of the screen...
          if (icons[f][YPOS] >= display.height()) {
            // Reinitialize to a random position, just off the top
            icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
            icons[f][YPOS]   = -LOGO_HEIGHT;
            icons[f][DELTAY] = random(1, 6);
          }
        }
      }
    }
     
  • 相关阅读:
    进程管理 2
    进程管理 1
    Linux进程
    分配swap分区
    磁盘分区与挂载
    文件系统常用命令
    多线程
    系统hosts文件的作用
    sql 连接查询的区别 inner,left,right,full
    sql 游标
  • 原文地址:https://www.cnblogs.com/dengziqi/p/14519861.html
Copyright © 2011-2022 走看看