RVB2601 开箱测试-裸奔Oled+定时器+按键测试

简介: 本文主要介绍RVB2601开发板的开箱测试过程。

本文作者:智峰科技年

本文转自:芯片开放社区(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 的驱动函数。


1.jpg


具体的实现方法见下面的程序 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); } //---------------------------------------------------------------------------- 字库就不补贴出来了, 可以找我索取 完整工程。

在此感谢官方工作人员的大力支持!

相关文章
|
4月前
|
SQL 弹性计算 测试技术
实时数仓Hologres TPC-H及点查性能开箱测试
Hologres现在仍然是TPCH-30000榜单的全球第一,领先第二名高达23%,最新发布的2.2版本相比之前的1.x的版本性能大约提升100%。
【单片机期中测试】9.定时器实现简单的秒表程序
【单片机期中测试】9.定时器实现简单的秒表程序
149 0
|
6月前
|
应用服务中间件 nginx
nginx中的定时器源码分析与测试
nginx中的定时器源码分析与测试
54 0
【单片机期中测试】10.利用定时器实现pwm呼吸灯
【单片机期中测试】10.利用定时器实现pwm呼吸灯
140 0
【单片机期中测试】7.按键调光
【单片机期中测试】7.按键调光
57 0
【单片机期中测试】4.按键不同时长控制流水灯
【单片机期中测试】4.按键不同时长控制流水灯
60 0
【单片机期中测试】3.按键控制流水灯循环
【单片机期中测试】3.按键控制流水灯循环
147 0
【单片机期中测试】2.独立按键控制LED移位
【单片机期中测试】2.独立按键控制LED移位
106 0
|
Web App开发 Linux 网络安全
PYNQ-Z2-开箱测试
PYNQ-Z2-开箱测试
756 0
PYNQ-Z2-开箱测试
MSP430-定时器的寄存器介绍以及测试应用
MSP430-定时器的寄存器介绍以及测试应用
147 0
MSP430-定时器的寄存器介绍以及测试应用