SPI子系统之驱动SSD1306 OLED(9)

t.tx_buf = &data;
    t.len = 2;
    t.bits_per_word = 9;
    //t.cs_change = 1;
    spi_message_init(&m);
    spi_message_add_tail(&t, &m);
    spi_sync(spi_ssd1306_dev, &m);
}


void ssd1306_display_on(void)
{
    ssd1306_write_byte(0x8D, SSD1306_CMD); 
    ssd1306_write_byte(0x14, SSD1306_CMD); 
    ssd1306_write_byte(0xAF, SSD1306_CMD); 
}
 
/**
  * @brief  OLED turns off
  *       
  * @param  None
  *       
  * @retval  None
**/
void ssd1306_display_off(void)
{
    ssd1306_write_byte(0x8D, SSD1306_CMD); 
    ssd1306_write_byte(0x10, SSD1306_CMD);
    ssd1306_write_byte(0xAE, SSD1306_CMD); 
}

void ssd1306_refresh_gram(void)
{
    uint8_t i, j;
   
    for (i = 0; i < 8; i ++) { 
        ssd1306_write_byte(0xB0 + i, SSD1306_CMD);   
        ssd1306_write_byte(0x02, SSD1306_CMD);
        ssd1306_write_byte(0x10, SSD1306_CMD);   
        for (j = 0; j < 128; j ++) {
            ssd1306_write_byte(s_chDispalyBuffer[j][i], SSD1306_DAT);
        }
    } 
}


void ssd1306_clear_screen(uint8_t chFill) 
{
    memset(s_chDispalyBuffer,chFill, sizeof(s_chDispalyBuffer));
    ssd1306_refresh_gram();
}

/**
  * @brief  Draws a piont on the screen
  *       
  * @param  chXpos: Specifies the X position
  * @param  chYpos: Specifies the Y position
  * @param  chPoint: 0: the point turns off    1: the piont turns on
  *       
  * @retval None
**/

void ssd1306_draw_point(uint8_t chXpos, uint8_t chYpos, uint8_t chPoint)
{
    uint8_t chPos, chBx, chTemp = 0;
   
    if (chXpos > 127 || chYpos > 63) {
        return;
    }
    chPos = 7 - chYpos / 8; //
    chBx = chYpos % 8;
    chTemp = 1 << (7 - chBx);
   
    if (chPoint) {
        s_chDispalyBuffer[chXpos][chPos] |= chTemp;
       
    } else {
        s_chDispalyBuffer[chXpos][chPos] &= ~chTemp;
    }
}
     
/**
  * @brief  Fills a rectangle
  *       
  * @param  chXpos1: Specifies the X position 1 (X top left position)
  * @param  chYpos1: Specifies the Y position 1 (Y top left position)
  * @param  chXpos2: Specifies the X position 2 (X bottom right position)
  * @param  chYpos3: Specifies the Y position 2 (Y bottom right position)
  *       
  * @retval
**/

void ssd1306_fill_screen(uint8_t chXpos1, uint8_t chYpos1, uint8_t chXpos2, uint8_t chYpos2, uint8_t chDot) 

    uint8_t chXpos, chYpos;
   
    for (chXpos = chXpos1; chXpos <= chXpos2; chXpos ++) {
        for (chYpos = chYpos1; chYpos <= chYpos2; chYpos ++) {
            ssd1306_draw_point(chXpos, chYpos, chDot);
        }
    }   
   
    ssd1306_refresh_gram();
}


/**
  * @brief Displays one character at the specified position   
  *       
  * @param  chXpos: Specifies the X position
  * @param  chYpos: Specifies the Y position
  * @param  chSize:
  * @param  chMode
  * @retval
**/
void ssd1306_display_char(uint8_t chXpos, uint8_t chYpos, uint8_t chChr, uint8_t chSize, uint8_t chMode)
{         
    uint8_t i, j;
    uint8_t chTemp, chYpos0 = chYpos;
   
    chChr = chChr - ' ';                 
    for (i = 0; i < chSize; i ++) { 
        if (chMode) {
            chTemp = c_chFont1608[chChr][i];
        } else {
            chTemp = ~c_chFont1608[chChr][i];
        }
       
        for (j = 0; j < 8; j ++) {
            if (chTemp & 0x80) {
                ssd1306_draw_point(chXpos, chYpos, 1);
            } else {
                ssd1306_draw_point(chXpos, chYpos, 0);
            }
            chTemp <<= 1;
            chYpos ++;
           
            if ((chYpos - chYpos0) == chSize) {
                chYpos = chYpos0;
                chXpos ++;
                break;
            }
        }     
    }
}   

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f06f37a19007f6f04167f392c9581460.html