<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      歡迎來到SFWR的博客

      訓練題——OLED部分

      訓練題OLED部分

      實現目標

      通過IIC通信控制OLED屏幕顯示出一串字符串

      名詞介紹

      OLED屏
      OLED(Organic Light-Emitting Diode),又稱為有機電激光顯示、有機發光半導體(Organic Electroluminescence Display,OLED)。OLED屬于一種電流型的有機發光器件,是通過載流子的注入和復合而致發光的現象,發光強度與注入的電流成正比。OLED在電場的作用下,陽極產生的空穴和陰極產生的電子就會發生移動,分別向空穴傳輸層和電子傳輸層注入,遷移到發光層。當二者在發光層相遇時,產生能量激子,從而激發發光分子最終產生可見光。
      百度百科上布拉布拉一堆,我也看不懂,不關鍵,原理不重要,會用就行。
      我們這里使用的是OLED12864,12864就是指它有128*64個像素點,而每個像素點都有亮和暗兩種狀態,我們可以通過程序控制哪些像素點的亮來在我們的屏幕上顯示我們想顯示的內容
      image

      IIC通信
      IIC(Inter-Integrated Circuit)其實是IICBus簡稱,所以中文應該叫集成電路總線,它是一種串行通信總線,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊設備而發展。I2C的正確讀法為“I平方C”("I-squared-C"),而“I二C”("I-two-C")則是另一種錯誤但被廣泛使用的讀法。自2006年10月1日起,使用I2C協議已經不需要支付專利費,但制造商仍然需要付費以獲取I2C從屬設備地址。
      我平常一般叫I方C,不過叫啥都行==
      簡單來說IIC就是一種設備間的通信方式,我們可以理解為一種加密方式,就類似于摩斯電碼,發送和接收都要滿足一定的規則才能把數據傳輸過去。IIC的一個主要的特點就是支持多主從結構,每個設備都有一個自己的地址,每次通信都要注明地址,這樣數據就只會被該地址的設備接收,從而實現多個從機同時控制。本文中使用的OLED12864就是IIC通信
      這里簡單以IIC的數據傳輸來介紹一下IIC傳輸中兩根線的作用
      image
      SCL,也就是clock,是控制IIC通信中時序的時鐘信號,SDA,也就是DATA,是控制IIC通信中數據的信號,從這個圖中我們可以看出,當SCL被拉高后,數據開始傳輸,傳輸的數據就是SDA線上的值,或者說是邏輯電平,當SCL拉低后,數據停止傳輸,SDA上的值可以發生變化,準備下一個數據的傳輸,然后周期往復。這樣就通過兩根線實現了數據的傳輸
      這里附上一個更為詳細的通信介紹,推薦大家仔細學習一下,通信協議還是很重要的。

      OLED的實現

      驅動

      有關于OLED的驅動,因為寫起來比較繁瑣我這里就直接提供一個我之前用的驅動,有興趣的同學可以查找OLED的數據手冊學習
      OLED.c

      #include "OLED.h" 
      #include "asc.h"
      #include "main.h"
      #include <stdio.h>
      #include <stdarg.h>
      
      extern I2C_HandleTypeDef hi2c1;
      
      static uint8_t OLED_GRAM[128][8];
      
      void oled_write_byte(uint8_t dat, uint8_t cmd)
      {
          static uint8_t cmd_data[2];
          if(cmd == OLED_CMD)
          {
              cmd_data[0] = 0x00;
          }
          else
          {
              cmd_data[0] = 0x40;
          }
          cmd_data[1] = dat;
          HAL_I2C_Master_Transmit(&hi2c1, OLED_I2C_ADDRESS, cmd_data, 2, 10);
      }
       void OLED_init(void)
      {
          oled_write_byte(0xAE, OLED_CMD);    //display off
          oled_write_byte(0x20, OLED_CMD);    //Set Memory Addressing Mode	
          oled_write_byte(0x10, OLED_CMD);    //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
          oled_write_byte(0xb0, OLED_CMD);    //Set Page Start Address for Page Addressing Mode,0-7
          oled_write_byte(0xc8, OLED_CMD);    //Set COM Output Scan Direction
          oled_write_byte(0x00, OLED_CMD);    //---set low column address
          oled_write_byte(0x10, OLED_CMD);    //---set high column address
          oled_write_byte(0x40, OLED_CMD);    //--set start line address
          oled_write_byte(0x81, OLED_CMD);    //--set contrast control register
          oled_write_byte(0xff, OLED_CMD);    //brightness 0x00~0xff
          oled_write_byte(0xa1, OLED_CMD);    //--set segment re-map 0 to 127
          oled_write_byte(0xa6, OLED_CMD);    //--set normal display
          oled_write_byte(0xa8, OLED_CMD);    //--set multiplex ratio(1 to 64)
          oled_write_byte(0x3F, OLED_CMD);    //
          oled_write_byte(0xa4, OLED_CMD);    //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
          oled_write_byte(0xd3, OLED_CMD);    //-set display offset
          oled_write_byte(0x00, OLED_CMD);    //-not offset
          oled_write_byte(0xd5, OLED_CMD);    //--set display clock divide ratio/oscillator frequency
          oled_write_byte(0xf0, OLED_CMD);    //--set divide ratio
          oled_write_byte(0xd9, OLED_CMD);    //--set pre-charge period
          oled_write_byte(0x22, OLED_CMD);    //
          oled_write_byte(0xda, OLED_CMD);    //--set com pins hardware configuration
          oled_write_byte(0x12, OLED_CMD);
          oled_write_byte(0xdb, OLED_CMD);    //--set vcomh
          oled_write_byte(0x20, OLED_CMD);    //0x20,0.77xVcc
          oled_write_byte(0x8d, OLED_CMD);    //--set DC-DC enable
          oled_write_byte(0x14, OLED_CMD);    //
          oled_write_byte(0xaf, OLED_CMD);    //--turn on oled panel
      }
      void OLED_display_on(void)
      {
          oled_write_byte(0x8d, OLED_CMD);
          oled_write_byte(0x14, OLED_CMD);
          oled_write_byte(0xaf, OLED_CMD);
      }
      void OLED_display_off(void)
      {
          oled_write_byte(0x8d, OLED_CMD);
          oled_write_byte(0x10, OLED_CMD);
          oled_write_byte(0xae, OLED_CMD);
      }
       void OLED_operate_gram(pen_typedef pen)
      {
          uint8_t i, n;
      
          for (i = 0; i < 8; i++)
          {
              for (n = 0; n < 128; n++)
              {
                  if (pen == PEN_WRITE)
                  {
                      OLED_GRAM[n][i] = 0xff;
                  }
                  else if (pen == PEN_CLEAR)
                  {
                      OLED_GRAM[n][i] = 0x00;
                  }
                  else
                  {
                      OLED_GRAM[n][i] = 0xff - OLED_GRAM[n][i];
                  }
              }
          }
      }
      void OLED_set_pos(uint8_t x, uint8_t y)
      {
          oled_write_byte((0xb0 + y), OLED_CMD);              //set page address y
          oled_write_byte(((x&0xf0)>>4)|0x10, OLED_CMD);      //set column high address
          oled_write_byte((x&0x0f), OLED_CMD);                //set column low address
      }
      void OLED_draw_point(int8_t x, int8_t y, pen_typedef pen)
      {
          uint8_t page = 0, row = 0;
      
          /* check the corrdinate */
          if ((x < 0) || (x > (X_WIDTH - 1)) || (y < 0) || (y > (Y_WIDTH - 1)))
          {
              return;
          }
          page = y / 8;
          row = y % 8;
      
          if (pen == PEN_WRITE)
          {
              OLED_GRAM[x][page] |= 1 << row;
          }
          else if (pen == PEN_INVERSION)
          {
              OLED_GRAM[x][page] ^= 1 << row;
          }
          else
          {
              OLED_GRAM[x][page] &= ~(1 << row);
          }
      }
      void OLED_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, pen_typedef pen)
      {
          uint8_t col = 0, row = 0;
          uint8_t x_st = 0, x_ed = 0, y_st = 0, y_ed = 0;
          float k = 0.0f, b = 0.0f;
      
          if (y1 == y2)
          {
              (x1 <= x2) ? (x_st = x1):(x_st = x2);
              (x1 <= x2) ? (x_ed = x2):(x_ed = x1);
      
              for (col = x_st; col <= x_ed; col++)
              {
                  OLED_draw_point(col, y1, pen);
              }
          }
          else if (x1 == x2)
          {
              (y1 <= y2) ? (y_st = y1):(y_st = y2);
              (y1 <= y2) ? (y_ed = y2):(y_ed = y1);
      
              for (row = y_st; row <= y_ed; row++)
              {
                  OLED_draw_point(x1, row, pen);
              }
          }
          else
          {
              k = ((float)(y2 - y1)) / (x2 - x1);
              b = (float)y1 - k * x1;
      
              (x1 <= x2) ? (x_st = x1):(x_st = x2);
              (x1 <= x2) ? (x_ed = x2):(x_ed = x2);
      
              for (col = x_st; col <= x_ed; col++)
              {
                  OLED_draw_point(col, (uint8_t)(col * k + b), pen);
              }
          }
      }
      void OLED_show_char(uint8_t row, uint8_t col, uint8_t chr)
      {
          uint8_t x = col * 6;
          uint8_t y = row * 12;
          uint8_t temp, t, t1;
          uint8_t y0 = y;
          chr = chr - ' ';
      
          for (t = 0; t < 12; t++)
          {
              temp = asc2_1206[chr][t];
      
              for (t1 = 0; t1 < 8; t1++)
              {
                  if (temp&0x80)
                      OLED_draw_point(x, y, PEN_WRITE);
                  else
                      OLED_draw_point(x, y, PEN_CLEAR);
      
                  temp <<= 1;
                  y++;
                  if ((y - y0) == 12)
                  {
                      y = y0;
                      x++;
                      break;
                  }
              }
          }
      }
      
      void OLED_show_string(uint8_t row, uint8_t col, uint8_t *chr)
      {
          uint8_t n =0;
      
          while (chr[n] != '\0')
          {
              OLED_show_char(row, col, chr[n]);
              col++;
      
              if (col > 20)
              {
                  col = 0;
                  row += 1;
              }
              n++;
          }
      }
       void OLED_printf(uint8_t row, uint8_t col, const char *fmt,...)
      {
          static uint8_t LCD_BUF[128] = {0};
          static va_list ap;
          uint8_t remain_size = 0;
      
          if ((row > 4) || (col > 20) )
          {
              return;
          }
          va_start(ap, fmt);
      
          vsprintf((char *)LCD_BUF, fmt, ap);
      
          va_end(ap);
      
          remain_size = 21 - col;
      
          LCD_BUF[remain_size] = '\0';
      
          OLED_show_string(row, col, LCD_BUF);
      }
      void OLED_refresh_gram(void)
      {
          uint8_t i, n;
      
          for (i = 0; i < 8; i++)
          {
              OLED_set_pos(0, i);
              for (n = 0; n < 128; n++)
              {
                  oled_write_byte(OLED_GRAM[n][i], OLED_DATA);
              }
          }
      }
      

      OLED.h

      #ifndef OLED_H
      #define OLED_H
      
      #include <stdint.h>
      
      
      // the I2C address of oled
      #define OLED_I2C_ADDRESS    0x78
      
      //the resolution of oled   128*64
      #define MAX_COLUMN      128
      #define MAX_ROW         64
      
      #define X_WIDTH         MAX_COLUMN
      #define Y_WIDTH         MAX_ROW
      
      #define OLED_CMD        0x00
      #define OLED_DATA       0x01
      
      typedef enum
      {
          PEN_CLEAR = 0x00,
          PEN_WRITE = 0x01,
          PEN_INVERSION= 0x02,
      }pen_typedef;
      extern void OLED_init(void);
      extern void OLED_display_on(void);
      extern void OLED_display_off(void);
      extern void OLED_operate_gram(pen_typedef pen);
      extern void OLED_set_pos(uint8_t x, uint8_t y);
      extern void OLED_draw_point(int8_t x, int8_t y, pen_typedef pen);
      extern void OLED_show_string(uint8_t row, uint8_t col, uint8_t *chr);
      extern void OLED_printf(uint8_t row, uint8_t col, const char *fmt,...);
      extern void OLED_refresh_gram(void);
      extern void OLED_LOGO(void);
      #endif
      

      asc.h

      #ifndef ASC__H
      #define ASC__H
      const unsigned char asc2_1206[95][12]={
      {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
      {0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
      {0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/
      {0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/
      {0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/
      {0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/
      {0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/
      {0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
      {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},/*"(",8*/
      {0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},/*")",9*/
      {0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},/*"*",10*/
      {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},/*"+",11*/
      {0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
      {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},/*"-",13*/
      {0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
      {0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"/",15*/
      {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"0",16*/
      {0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"1",17*/
      {0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/
      {0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"3",19*/
      {0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},/*"4",20*/
      {0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},/*"5",21*/
      {0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},/*"6",22*/
      {0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},/*"7",23*/
      {0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"8",24*/
      {0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},/*"9",25*/
      {0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
      {0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
      {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},/*"<",28*/
      {0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},/*"=",29*/
      {0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},/*">",30*/
      {0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"?",31*/
      {0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},/*"@",32*/
      {0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},/*"A",33*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"B",34*/
      {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},/*"C",35*/
      {0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"D",36*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},/*"E",37*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},/*"F",38*/
      {0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},/*"G",39*/
      {0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},/*"H",40*/
      {0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},/*"I",41*/
      {0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},/*"J",42*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},/*"K",43*/
      {0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},/*"L",44*/
      {0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},/*"M",45*/
      {0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},/*"N",46*/
      {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"O",47*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"P",48*/
      {0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},/*"Q",49*/
      {0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},/*"R",50*/
      {0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},/*"S",51*/
      {0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},/*"T",52*/
      {0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},/*"U",53*/
      {0x20,0x00,0x3E,0x00,0x01,0xC0,0x07,0x00,0x38,0x00,0x20,0x00},/*"V",54*/
      {0x38,0x00,0x07,0xC0,0x3C,0x00,0x07,0xC0,0x38,0x00,0x00,0x00},/*"W",55*/
      {0x20,0x40,0x39,0xC0,0x06,0x00,0x39,0xC0,0x20,0x40,0x00,0x00},/*"X",56*/
      {0x20,0x00,0x38,0x40,0x07,0xC0,0x38,0x40,0x20,0x00,0x00,0x00},/*"Y",57*/
      {0x30,0x40,0x21,0xC0,0x26,0x40,0x38,0x40,0x20,0xC0,0x00,0x00},/*"Z",58*/
      {0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00},/*"[",59*/
      {0x00,0x00,0x70,0x00,0x0C,0x00,0x03,0x80,0x00,0x40,0x00,0x00},/*"\",60*/
      {0x00,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00},/*"]",61*/
      {0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
      {0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"_",63*/
      {0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
      {0x00,0x00,0x02,0x80,0x05,0x40,0x05,0x40,0x03,0xC0,0x00,0x40},/*"a",65*/
      {0x20,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"b",66*/
      {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},/*"c",67*/
      {0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},/*"d",68*/
      {0x00,0x00,0x03,0x80,0x05,0x40,0x05,0x40,0x03,0x40,0x00,0x00},/*"e",69*/
      {0x00,0x00,0x04,0x40,0x1F,0xC0,0x24,0x40,0x24,0x40,0x20,0x00},/*"f",70*/
      {0x00,0x00,0x02,0xE0,0x05,0x50,0x05,0x50,0x06,0x50,0x04,0x20},/*"g",71*/
      {0x20,0x40,0x3F,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"h",72*/
      {0x00,0x00,0x04,0x40,0x27,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"i",73*/
      {0x00,0x10,0x00,0x10,0x04,0x10,0x27,0xE0,0x00,0x00,0x00,0x00},/*"j",74*/
      {0x20,0x40,0x3F,0xC0,0x01,0x40,0x07,0x00,0x04,0xC0,0x04,0x40},/*"k",75*/
      {0x20,0x40,0x20,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00},/*"l",76*/
      {0x07,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x03,0xC0,0x00,0x00},/*"m",77*/
      {0x04,0x40,0x07,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"n",78*/
      {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"o",79*/
      {0x04,0x10,0x07,0xF0,0x04,0x50,0x04,0x40,0x03,0x80,0x00,0x00},/*"p",80*/
      {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x50,0x07,0xF0,0x00,0x10},/*"q",81*/
      {0x04,0x40,0x07,0xC0,0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00},/*"r",82*/
      {0x00,0x00,0x06,0x40,0x05,0x40,0x05,0x40,0x04,0xC0,0x00,0x00},/*"s",83*/
      {0x00,0x00,0x04,0x00,0x1F,0x80,0x04,0x40,0x00,0x40,0x00,0x00},/*"t",84*/
      {0x04,0x00,0x07,0x80,0x00,0x40,0x04,0x40,0x07,0xC0,0x00,0x40},/*"u",85*/
      {0x04,0x00,0x07,0x00,0x04,0xC0,0x01,0x80,0x06,0x00,0x04,0x00},/*"v",86*/
      {0x06,0x00,0x01,0xC0,0x07,0x00,0x01,0xC0,0x06,0x00,0x00,0x00},/*"w",87*/
      {0x04,0x40,0x06,0xC0,0x01,0x00,0x06,0xC0,0x04,0x40,0x00,0x00},/*"x",88*/
      {0x04,0x10,0x07,0x10,0x04,0xE0,0x01,0x80,0x06,0x00,0x04,0x00},/*"y",89*/
      {0x00,0x00,0x04,0x40,0x05,0xC0,0x06,0x40,0x04,0x40,0x00,0x00},/*"z",90*/
      {0x00,0x00,0x00,0x00,0x04,0x00,0x7B,0xE0,0x40,0x20,0x00,0x00},/*"{",91*/
      {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00},/*"|",92*/
      {0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
      {0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/
      };
      #endif
      

      與之前招新題一樣,新建一個文本文檔然后改成對應的名字,然后把代碼復制進去,然后.c放在src,.h放在inc

      代碼解釋

      1. oled.h
        image
        這個就是我們之前提到的IIC的設備地址,我們可以看到本博客開始時的OLED示例中的
        image
        這個就是生產廠家給出的地址選擇,一共有兩個可選項,想使用哪個就把電阻焊在哪一端,在這里我們可以看出地址是用的0x78
      2. asc.h
        這個里面主要存的是字庫,就是每種字符對應的都是哪些像素點亮,如果想要修改字符的字體就需要修改這個文件。
      3. oled.c
      • image
        在本博客的配置中,我們選擇的是單片機的硬件IIC,是片內集成的IIC,配置起來較為方便,缺點是不太自由,需要使用固定的引腳。也可以通過GPIO模擬IIC通信時序,這個就比較自由,只要有GPIO功能的引腳就可以,缺點就是需要自己寫通信驅動。由于c6t6上只有一個硬件IIC,即i2c1,于是這里寫i2c1,如果你使用的是其他單片機,就要注意這里的i2c要與你配置的i2c一致。

      image
      這個函數就是向OLED通信的函數,最下面的HAL_I2C_Master_Transmit便是HAL庫封裝的IIC通信函數,可以看到是需要指明從機地址的

      • 其余常用函數的簡單介紹
        OLED_init(void) 初始化函數,在主程序的前面要加上來初始化OLED
        OLED_display_on(void),OLED_display_off(void) OLED屏幕顯示與關閉
        OLED_operate_gram(pen_typedef pen) 將整個屏幕點亮或點滅,可以用來清屏
        OLED_draw_point(int8_t x, int8_t y, pen_typedef pen) 畫點
        OLED_draw_line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, pen_typedef pen) 畫線
        OLED_show_char(uint8_t row, uint8_t col, uint8_t chr) 繪出一個字符
        OLED_show_string(uint8_t row, uint8_t col, uint8_t *chr) 繪出一個字符串
        OLED_refresh_gram(void)
        這個就比較重要了,是更新函數,在前面的很多個OLED的控制函數,都是對一個數組OLED_GRAM的修改,這個二維數組控制的就是屏幕上每個像素點的亮滅與否,而數組的修改是不會讓屏幕更改的,如果想讓屏幕修改就必須要在后面加上這個函數,將數組的值更新到屏幕上。這樣做的好處就是可以處理完好幾個函數后再更新,讓顯示更流暢。
        PS:注意pen_typedef pen這個參數填的是0與1,控制的就是亮和滅,另外字符的顯示是8x128,即行的位置是固定的8個地方,而列則可以從128中任意地方開始顯示,所以row的范圍是0-7,col是0-127.

      代碼配置與生成

      有關于工程的生成不再贅述,直接開始配置IIC
      image
      如圖所示,選擇硬件IIC,可以看到右邊出現了IIC的引腳,與OLED上對應引腳相連即可。
      然后更新代碼
      image
      將頭文件include進去
      image

      在主程序中添加如圖代碼,分別進行初始化,打開顯示,將整個屏幕點滅也就是清屏(OLED上電后會花屏,所以先清一下)。
      然后用show_string函數在第二行第二列顯示一串字符串。此時只是對數組進行了修改,還需要再加上refresh函數將數組更新到屏幕上。
      效果如下
      image

      總結

      本文簡單介紹了OLED的使用,希望同學們可以理解原理并實現顯示,另外,有關于OLED還有個更為強大的庫——U8G2,這個庫有很多優化與更多繪制的函數,也有很多預制好的字體樣式,推薦想要用OLED做的更加美觀的同學自行學習,這里提供一個講解的博客

      posted @ 2022-11-12 09:21  SFWR  Views(405)  Comments(0)    收藏  舉報
      主站蜘蛛池模板: 一区二区三区四区亚洲自拍| 色综合天天综合天天综| 久久se精品一区精品二区| 精品国产综合成人亚洲区| 中文字幕日本六区小电影| 亚洲成人av在线综合| 又粗又硬又黄a级毛片| 成人啪啪高潮不断观看| 国产三级精品三级| 久久一区二区中文字幕| 日本黄色三级一区二区三区| 非会员区试看120秒6次| 国产亚洲av日韩精品熟女| 成人国产精品一区二区网站公司| 2018av天堂在线视频精品观看 | 日本一区二区a√成人片| 精品久久人人做爽综合| 国产一区二区三区美女| 久久男人av资源站| 日韩国产精品一区二区av| 九九九国产| 亚洲国产精品一二三区| 99久久亚洲综合网精品| 亚洲欧美日韩在线码| 波多野结衣美乳人妻hd电影欧美| 国产av一区二区三区综合| 超碰成人人人做人人爽| 久久精品人妻无码一区二区三区| 婷婷丁香五月深爱憿情网| 不卡在线一区二区三区视频| 日韩有码av中文字幕| 婷婷色综合成人成人网小说 | 欧美成人精品三级网站视频| 日韩狼人精品在线观看| 在线观看国产区亚洲一区| 国产一区日韩二区三区| 亚洲av第一区二区三区| 国内精品久久人妻互换| 伊伊人成亚洲综合人网7777| 欧美大胆老熟妇乱子伦视频| 亚洲欧洲日韩国内精品|