天天看點

RVB2601 開箱測試-裸奔Oled+定時器+按鍵測試

本文作者:智峰科技年

本文轉自:​

晶片開放社群(OCC)

RVB2601開發闆到手有一段時間了,斷斷續續的測試內建開發環境的使用,這期間發現了很多的問題。經過摸索,在原先的示範程式的基礎上修改了OLed的基本驅動,添加了可以列印漢字及英文字元串的一系列函數。将原先的測試需要作業系統的去除,直接裸奔,實作了,oled顯示字元串,及定時器,按鍵測試。闆子上面的 KEY1 壓下,oled 顯示KEY1。KEY2按下oled顯示KEY2。

1,先說說CDK的一些問題及應對解決方法。CDK編譯目前工程後,不能 點選 Debug 菜單下面的 Start/Stop Debug正确運作,一定要手動點選 Flash 菜單 下面Download将編譯通過的程式寫入RVB2601,然後,再點選Debug菜單下面 Start/Stop Debug的啟動程式這樣才能正确進入調試 。

2,如果,停止,調試後,無法再次進入調試,無論點選 Start/Stop Debug 還是 Start/Stop Debug Without Dowmload 都是無法正确調試的。必須再次Flash菜單再次Download才能再次進入調試 3, vsprintf 函數有問題,在其他開發環境正确的程式CDK編譯出結果是不正确的,現象是 轉換英文字元串,沒有錯誤,轉換漢字字元正确的 應該轉換出2個BYTES,實際出來占用3BYTES。我的解決方案是直接調整指針。具體,可以參看我的oled 的驅動函數。

RVB2601 開箱測試-裸奔Oled+定時器+按鍵測試

具體的實作方法見下面的程式 main.c #define _DEFAULT_SOURCE /* needed for usleep() */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <aos/aos.h> #include "aos/cli.h"

#include "app_config.h" #include "app_init.h" #include "csi_config.h" #include "hw_config.h" #include "lvgl.h" #include "lv_label.h" #include "oled.h"

#include "board_config.h" #include "drv/gpio_pin.h" #include <drv/pin.h> #include <drv/pwm.h>

/*********************

DEFINES      

*********************/ #define TAG "app"

/**********************

TYPEDEFS      

**********************/

  • STATIC PROTOTYPES **********************/ // GUI static void demo_task(void *arg);
  • STATIC VARIABLES **********************/
MACROS      
  • GLOBAL FUNCTIONS **********************/

volatile uint32_t g_debug = 0; volatile uint32_t g_debug_v = 0;

static void demo_task(void *arg);

#include "csi_core.h"

extern void Myoled_init(); extern Display_5x7(unsigned int str,unsigned char x,unsigned char y,unsigned char fan); extern void LcdSet(uint16_t x0, uint16_t y0); extern void LcdPrintf(uint8_t fan,char *fmt,...);

#include "main.h"

#include <csi_config.h> #include <drv/timer.h> #include <drv/irq.h> #include "dw_timer_ll.h" #include <drv/spi.h>

#include <yoc/at_port.h> #include <devices/w800.h> #include <yoc/netmgr.h>

csi_timer_t timer1;

#define KEYDELAY 100

int test; uint32_t timeover = 0;

csi_gpio_pin_t pin_key1; csi_gpio_pin_t pin_key2;

#define KEY1_IN csi_gpio_pin_read(&pin_key1) #define KEY2_IN csi_gpio_pin_read(&pin_key2)

static void time_event_kb(csi_timer_t *timer_handle, void *arg) { timeover++; }

csi_error_t timer1_tick_init(void) { csi_error_t ret;

ret = csi_timer_init(&timer1, 0);
if (ret == CSI_OK) {
    ret = csi_timer_attach_callback(&timer1, &time_event_kb, NULL);
    if (ret == CSI_OK) {
        ret = csi_timer_start(&timer1, 1000);
    }
}
return ret;      

}

/**

  • main */ int main(void) {

    csi_pin_set_mux(CONSOLE_TXD, CONSOLE_TXD_FUNC); csi_pin_set_mux(CONSOLE_RXD, CONSOLE_RXD_FUNC); // board_init(); console_init(CONSOLE_UART_IDX, 115200, 128);

    csi_pin_set_mux(PA11, PIN_FUNC_GPIO); //key1 csi_pin_set_mux(PA12, PIN_FUNC_GPIO); //key2 csi_gpio_pin_init(&pin_key1, PA11); csi_gpio_pin_dir(&pin_key1, GPIO_DIRECTION_INPUT); csi_gpio_pin_init(&pin_key2, PA12); csi_gpio_pin_dir(&pin_key2, GPIO_DIRECTION_INPUT);

    Myoled_init();

    printf("OLED Init...\n"); LcdSet(0,0); LcdPrintf(0x80,"Hello! Zhifeng!"); LcdSet(0,1); LcdPrintf(0,"Hello! Zhifeng!"); LcdSet(16,3); LcdPrintf(0x40,"-系-統-設-置-");

    timer1_tick_init();

    printf("timer Init...\n");

    while(1) {

if(timeover>100)
 {
    timeover=0;
     LcdSet(0,5);
    LcdPrintf(0,"Timer Demo %d",test++);    
    
    if(!csi_gpio_pin_read(&pin_key1))
    {
     LcdSet(0,7);
    LcdPrintf(0x80,"KEY1");                 
    }
    if(!csi_gpio_pin_read(&pin_key2))
    {
     LcdSet(40,7);
    LcdPrintf(0x80,"KEY2");                 
    }                   
 }      
  • } return 0; }

main.h #ifndef MAIN_H #define MAIN_H

typedef struct { volatile uint8_t cnt; volatile uint8_t ok; volatile uint8_t dat; volatile uint8_t press; } tKEY;

#endif

OLED的驅動程式 oled.c /*

  • Copyright (C) 2015-2017 Alibaba Group Holding Limited */
INCLUDES      

*********************/ #include <stdio.h> #include <string.h> #include <soc.h> #include "lv_conf.h" #include "lvgl.h" #include "src/lv_hal/lv_hal.h" #include "oled.h" #include "board_config.h" #include "drv/gpio_pin.h" #include <drv/pin.h>

#define code

#define SPI // 4-wire Serial

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Delay Time //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void uDelay(unsigned char l) { udelay(l * 5); }

void Delay(unsigned char n) { udelay(n * 1000); }

#ifdef SPI // 4-wire Serial csi_gpio_pin_t pin_clk; csi_gpio_pin_t pin_mosi; csi_gpio_pin_t pin_cs; csi_gpio_pin_t pin_miso;

static void lcd_pinmux_init() { csi_pin_set_mux(PA28, PIN_FUNC_GPIO); //clk csi_pin_set_mux(PA29, PIN_FUNC_GPIO); //mosi csi_pin_set_mux(PA27, PIN_FUNC_GPIO); //cs csi_pin_set_mux(PA30, PIN_FUNC_GPIO); //miso }

static void lcd_gpio_init() { // csi_gpio_pin_init(&pin_clk, PA28); csi_gpio_pin_dir(&pin_clk, GPIO_DIRECTION_OUTPUT); csi_gpio_pin_init(&pin_mosi, PA29); csi_gpio_pin_dir(&pin_mosi, GPIO_DIRECTION_OUTPUT); csi_gpio_pin_init(&pin_cs, PA27); csi_gpio_pin_dir(&pin_cs, GPIO_DIRECTION_OUTPUT); csi_gpio_pin_init(&pin_miso, PA30); //dc csi_gpio_pin_dir(&pin_miso, GPIO_DIRECTION_OUTPUT); }

static void lcd_cs(uint8_t d) { if (d == 1) { csi_gpio_pin_write(&pin_cs, GPIO_PIN_HIGH); } else { csi_gpio_pin_write(&pin_cs, GPIO_PIN_LOW); } }

static void lcd_dc(uint8_t d) { if (d == 1) { csi_gpio_pin_write(&pin_miso, GPIO_PIN_HIGH); } else { csi_gpio_pin_write(&pin_miso, GPIO_PIN_LOW); } }

static void lcd_sclk(uint8_t d) { if (d == 1) { csi_gpio_pin_write(&pin_clk, GPIO_PIN_HIGH); } else { csi_gpio_pin_write(&pin_clk, GPIO_PIN_LOW); } }

static void lcd_sdin(uint8_t d) { if (d == 1) { csi_gpio_pin_write(&pin_mosi, GPIO_PIN_HIGH); } else { csi_gpio_pin_write(&pin_mosi, GPIO_PIN_LOW); } }

void Write_Command(unsigned char Data) { unsigned char i;

lcd_cs(0);
lcd_dc(0);
for (i = 0; i < 8; i++)
{
    lcd_sclk(0);
    lcd_sdin((Data & 0x80) >> 7);
    Data = Data << 1;
    lcd_sclk(1);
}
lcd_dc(1);
lcd_cs(1);      

void Write_Data(unsigned char Data) { unsigned char i;

lcd_cs(0);
lcd_dc(1);
for (i = 0; i < 8; i++)
{
    lcd_sclk(0);
    lcd_sdin((Data & 0x80) >> 7);
    Data = Data << 1;
    lcd_sclk(1);
}
lcd_dc(1);
lcd_cs(1);      

} #endif

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Instruction Setting //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Set_Start_Column(unsigned char d) { Write_Command(0x00 + d % 16); // Set Lower Column Start Address for Page Addressing Mode // Default => 0x00 Write_Command(0x10 + d / 16); // Set Higher Column Start Address for Page Addressing Mode // Default => 0x10 }

void Set_Addressing_Mode(unsigned char d) { Write_Command(0x20); // Set Memory Addressing Mode Write_Command(d); // Default => 0x02 // 0x00 => Horizontal Addressing Mode // 0x01 => Vertical Addressing Mode // 0x02 => Page Addressing Mode }

void Set_Column_Address(unsigned char a, unsigned char b) { Write_Command(0x21); // Set Column Address Write_Command(a); // Default => 0x00 (Column Start Address) Write_Command(b); // Default => 0x7F (Column End Address) }

void Set_Page_Address(unsigned char a, unsigned char b) { Write_Command(0x22); // Set Page Address Write_Command(a); // Default => 0x00 (Page Start Address) Write_Command(b); // Default => 0x07 (Page End Address) }

void Set_Start_Line(unsigned char d) { Write_Command(0x40 | d); // Set Display Start Line // Default => 0x40 (0x00) }

void Set_Contrast_Control(unsigned char d) { Write_Command(0x81); // Set Contrast Control for Bank 0 Write_Command(d); // Default => 0x7F }

void Set_Segment_Remap(unsigned char d) { Write_Command(d); // Set Segment Re-Map // Default => 0xA0 // 0xA0 => Column Address 0 Mapped to SEG0 // 0xA1 => Column Address 0 Mapped to SEG127 }

void Set_Entire_Display(unsigned char d) { Write_Command(d); // Set Entire Display On / Off // Default => 0xA4 // 0xA4 => Normal Display // 0xA5 => Entire Display On }

void Set_Inverse_Display(unsigned char d) { Write_Command(d); // Set Inverse Display On/Off // Default => 0xA6 // 0xA6 => Normal Display // 0xA7 => Inverse Display On }

void Set_Multiplex_Ratio(unsigned char d) { Write_Command(0xA8); // Set Multiplex Ratio Write_Command(d); // Default => 0x3F (1/64 Duty) }

void Set_Display_On_Off(unsigned char d) { Write_Command(d); // Set Display On/Off // Default => 0xAE // 0xAE => Display Off // 0xAF => Display On }

void Set_Start_Page(unsigned char d) { Write_Command(0xB0 | d); // Set Page Start Address for Page Addressing Mode // Default => 0xB0 (0x00) }

void Set_Common_Remap(unsigned char d) { Write_Command(d); // Set COM Output Scan Direction // Default => 0xC0 // 0xC0 => Scan from COM0 to 63 // 0xC8 => Scan from COM63 to 0 }

void Set_Display_Offset(unsigned char d) { Write_Command(0xD3); // Set Display Offset Write_Command(d); // Default => 0x00 }

void Set_Display_Clock(unsigned char d) { Write_Command(0xD5); // Set Display Clock Divide Ratio / Oscillator Frequency Write_Command(d); // Default => 0x70 // D[3:0] => Display Clock Divider // D[7:4] => Oscillator Frequency }

void Set_Low_Power(unsigned char d) { Write_Command(0xD8); // Set Low Power Display Mode Write_Command(d); // Default => 0x04 (Normal Power Mode) }

void Set_Precharge_Period(unsigned char d) { Write_Command(0xD9); // Set Pre-Charge Period Write_Command(d); // Default => 0x22 (2 Display Clocks [Phase 2] / 2 Display Clocks [Phase 1]) // D[3:0] => Phase 1 Period in 1~15 Display Clocks // D[7:4] => Phase 2 Period in 1~15 Display Clocks }

void Set_Common_Config(unsigned char d) { Write_Command(0xDA); // Set COM Pins Hardware Configuration Write_Command(d); // Default => 0x12 // Alternative COM Pin Configuration // Disable COM Left/Right Re-Map }

void Set_VCOMH(unsigned char d) { Write_Command(0xDB); // Set VCOMH Deselect Level Write_Command(d); // Default => 0x34 (0.78*VCC) }

void Set_NOP() { Write_Command(0xE3); // Command for No Operation }

void Set_Command_Lock(unsigned char d) { Write_Command(0xFD); // Set Command Lock Write_Command(d); // Default => 0x12 // 0x12 => Driver IC interface is unlocked from entering command. // 0x16 => All Commands are locked except 0xFD. }

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Global Variables //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= #define XLevelL 0x00 #define XLevelH 0x10 #define XLevel ((XLevelH & 0x0F) * 16 + XLevelL) #define Max_Column 128 #define Max_Row 64 #define Brightness 0xBF

#define SET_BIT(b, n) b |= (1 << n) #define CLR_BIT(b, n) b &= ~(uint8_t)(1 << n)

uint8_t g_oled_ram[8][128];

void oled_draw_point(uint8_t r, uint8_t c, uint8_t t) { if (t) { SET_BIT(g_oled_ram[r / 8][c], ((r % 8))); } else { CLR_BIT(g_oled_ram[r / 8][c], (r % 8)); } }

void oled_draw_frame(uint8_t p[Max_Row][Max_Column]) { unsigned char i, j;

for (i = 0; i < Max_Row; i++)
{
    for (j = 0; j < Max_Column; j++)
    {
        oled_draw_point(i, j, p[i][j]);
    }
}      

void oled_reflesh() { unsigned char i, j; for (i = 0; i < 8; i++) { Set_Start_Page(i); Set_Start_Column(0x00);

for (j = 0; j < 128; j++)
    {
        Write_Data(g_oled_ram[i][j]);
    }
}      

void Fill_RAM(unsigned char Data) { unsigned char i, j;

for (i = 0; i < 8; i++)
{
    Set_Start_Page(i);
    Set_Start_Column(0x00);
    for (j = 0; j < 128; j++)
    {
        Write_Data(Data);
    }
}      

#include "font.h" #include "hz12.h" uint16_t x,y; /LCD 設定坐标***************/ void LCD_Set_Pos(unsigned char x, unsigned char y) { Write_Command(0xb0+y); Write_Command(((x&0xf0)>>4)|0x10); Write_Command((x&0x0f)|0x01); }

//顯示一個5*7點陣的圖符 //unsigned char X unsigned char Y //unsigned char fan Bit0=1 字元反相

void Display_5x7(char *str,unsigned char x,unsigned char y,unsigned char fan) { unsigned char i,dd; unsigned int neima; neima = (unsigned int)(str[0]-32)*5; if(x>126) { x=0; y++; } LCD_Set_Pos(x,y);

for(i=0;i<5;i++)
{
    dd=font5x7[i+neima];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}      

//顯示一個12*12點陣的圖符 //unsigned char X unsigned char Y //unsigned char fan Bit0=1 字元反相

void Display_12x12(char *str,unsigned char x,unsigned char y,unsigned char fan) { unsigned char i; unsigned int dd; int j;

for(j=0;j<sizeof(GB_12)/sizeof(GB_12[0]);j++)   // 查找定位
{
    if((GB_12[j].Index[0] == str[0])&&(GB_12[j].Index[1]==str[1]))      
        break;
}
LCD_Set_Pos(x,y);
if(j>=sizeof(GB_12)/sizeof(GB_12[0]))
{
    Display_5x7('?',x,y,0);
    Display_5x7('?',x+8,y,0);
    return;
}
for (i=0;i<12;i++)
{
    dd=GB_12[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}
LCD_Set_Pos(x,y+1);
for (i=12;i<24;i++)
{
    dd=GB_12[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}      

} //顯示一個8*16點陣的圖符 //unsigned char X unsigned char Y //unsigned char fan Bit0=1 字元反相

void Display_8x16(char *str,unsigned char x,unsigned char y,unsigned char fan) { unsigned char i,dd,j;

for(j=0;j<sizeof(ASC16)/sizeof(ASC16[0]);j++)   // 查找定位
{
    dd = ASC16[j].Index;
    if(dd == str[0])
    {
        break;
    }
}
LCD_Set_Pos(x,y);
for (i=0;i<8;i++)
{
    dd=ASC16[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}
LCD_Set_Pos(x,y+1);
for (i=8;i<16;i++)
{
    dd=ASC16[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}      

//------------------------------------------------------ // 中文寫入函數 // x方向 x+1螢幕下移動1點;y方向 y+1螢幕下移動8點 //unsigned int neima 為字元的内碼 //unsigned char X unsigned char Y //unsigned char fan Bit7=1 5x7字元Bit7=0 8x16字元 Bit0=1 字元反相 //------------------------------------------------------

void Display_16x16(char *str,unsigned char x,unsigned char y,unsigned char fan) { unsigned char i,dd,j;

for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)   // 查找定位
{
    if((GB_16[j].Index[0] == str[0])&&(GB_16[j].Index[1]==str[1]))  
        break;
}
LCD_Set_Pos(x,y);
if(j>=sizeof(GB_16)/sizeof(GB_16[0]))
{
    Display_5x7('?',x,y,0);
    Display_5x7('?',x+8,y,0);
    return;
}
for (i=0;i<16;i++)
{
    dd=GB_16[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}
LCD_Set_Pos(x,y+1);
for (i=16;i<32;i++)
{
    dd=GB_16[j].Msk[i];
    if (fan&0x01)
        dd = ~dd;
    Write_Data(dd);
}      

//------------------------------------------------------ // 中文寫入函數 // x方向 x+1螢幕下移動1點;y方向 y+1螢幕下移動8點 //unsigned char *str 顯示的字元串 //unsigned char X unsigned char Y //unsigned char fan // Bit0=1 字元反相 // bit7, bit6 // 1 0 5x7字元 // 0 0 8x16字元 // 0 1 8x12字元 //------------------------------------------------------

void PutLcdStr(char *str,unsigned char fan) { while (*str) { if(fan & 0x80) { if(x>=128) //判讀位置換行 { x -= 128; y += 1; }

Display_5x7(str, x,y,fan);      //5個位元組
        x +=8;
    }
    else
    {
        if((*str)&0x80)             //為漢字
        {
            if(fan&0x40)
            {
                Display_12x12(str, x,y,fan);     //16個位元組
                x += 12;
            }
            else
            {
                Display_16x16(str, x,y,fan);     //16個位元組
                x += 16;
            }
            str++;
            str++;
        }
        else
        {
            if(x>=128)                     //判讀位置換行
            {
               x -= 128;
               y += 2;
            }
            Display_8x16(str, x,y,fan);  //16個位元組
            //                if(fan&0x40)
            //                AddrX += 6;
            //                else
            x += 8;
        }
    }
    str++;
}      

/************************************************************************************** 功能描述: 在螢幕按格式顯示一個字元串 輸 入:

輸 出: 無 **************************************************************************************/ void LcdPrintf(uint8_t fan,char *fmt,...) { va_list ap; volatile char str[64];

va_start(ap,fmt);
vsprintf(str,fmt,ap);
PutLcdStr(str,fan);
va_end(ap);      

void LcdSet(uint16_t x0, uint16_t y0) { x=x0; y=y0; } void LcdGet(uint16_t * x0, uint16_t *y0) { *x0 = x; *y0 = y; }

/功能描述:顯示顯示BMP圖檔128×64起始點坐标(x,y),x的範圍0~127,y為頁的範圍0~7******/ void Draw_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y;

if(y1%8==0)
    y=y1/8;
else
    y=y1/8+1;
for(y=y0;y<y1;y++)
{
    LCD_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
    {
        Write_Data(BMP[j++]);
    }
}      

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Initialization //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void OLED_Init() { Set_Command_Lock(0x12); // Unlock Driver IC (0x12/0x16) Set_Display_On_Off(0xAE); // Display Off (0xAE/0xAF) Set_Display_Clock(0xA0); // Set Clock as 116 Frames/Sec Set_Multiplex_Ratio(0x3F); // 1/64 Duty (0x0F~0x3F) Set_Display_Offset(0x00); // Shift Mapping RAM Counter (0x00~0x3F) Set_Start_Line(0x00); // Set Mapping RAM Display Start Line (0x00~0x3F) Set_Low_Power(0x04); // Set Normal Power Mode (0x04/0x05) Set_Addressing_Mode(0x02); // Set Page Addressing Mode (0x00/0x01/0x02) Set_Segment_Remap(0xA1); // Set SEG/Column Mapping (0xA0/0xA1) Set_Common_Remap(0xC8); // Set COM/Row Scan Direction (0xC0/0xC8) Set_Common_Config(0x12); // Set Alternative Configuration (0x02/0x12) Set_Contrast_Control(Brightness); // Set SEG Output Current Set_Precharge_Period(0x82); // Set Pre-Charge as 8 Clocks & Discharge as 2 Clocks Set_VCOMH(0x34); // Set VCOM Deselect Level Set_Entire_Display(0xA4); // Disable Entire Display On (0xA4/0xA5) Set_Inverse_Display(0xA6); // Disable Inverse Display On (0xA6/0xA7)

Fill_RAM(0x00); // Clear Screen
Set_Display_On_Off(0xAF); // Display On (0xAE/0xAF)      

} /* Flush the content of the internal buffer the specific area on the display

  • You can use DMA or any hardware acceleration to do this operation in the background but
  • 'lv_disp_flush_ready()' has to be called when finished. */ static void oled_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_tcolor_p) { oled_draw_frame((uint8_t ()[Max_Column])color_p); oled_reflesh();/* IMPORTANT!!!
    • Inform the graphics library that you are ready with the flushing*/ lv_disp_flush_ready(disp_drv); }

static lv_disp_buf_t disp_buf1; static lv_color_t buf1[64 * 128]; static lv_color_t buf2[64 * 128]; //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Main Program //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // #define CONFIG_OLED_TEST void oled_init() { lcd_pinmux_init(); lcd_gpio_init(); OLED_Init();

// lv_disp porting
/*Create a display buffer*/
lv_disp_buf_init(&disp_buf1, buf1, buf2, 64 * 128);
/*Create a display*/
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv); /*Basic initialization*/
disp_drv.buffer = &disp_buf1;
disp_drv.flush_cb = oled_flush;
disp_drv.rotated = 0;
lv_disp_drv_register(&disp_drv);      

//---------------------------------------------------------------------------- void Myoled_init() { lcd_pinmux_init(); lcd_gpio_init(); OLED_Init(); Fill_RAM(0); } //---------------------------------------------------------------------------- 字庫就不補貼出來了, 可以找我索取 完整工程。

在此感謝官方從業人員的大力支援!

繼續閱讀