日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于瑞薩FPB-RA0E2開發(fā)板實(shí)現(xiàn)OLED驅(qū)動(dòng)顯示

瑞薩嵌入式小百科 ? 來源:RA生態(tài)工作室 ? 2026-05-19 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文轉(zhuǎn)自RA生態(tài)工作室:

瑞薩“RA MCU眾測(cè)寶典”OLED顯示專題再添實(shí)戰(zhàn)新篇!

開啟寶典

本文介紹了瑞薩FPB-RA0E2開發(fā)板實(shí)現(xiàn)OLED驅(qū)動(dòng)顯示Renesas圖標(biāo)logo以及ADC電壓表框架的項(xiàng)目設(shè)計(jì)。

一、項(xiàng)目介紹

硬件連接:依據(jù)r_sau_i2c配置,選擇目標(biāo)管腳用以實(shí)現(xiàn)開發(fā)板與OLED的IIC通信;

驅(qū)動(dòng)OLED:配置硬件IIC通信,實(shí)現(xiàn)OLED驅(qū)動(dòng);包括工程創(chuàng)建、代碼添加、工程調(diào)試等;

OLED顯示Renesas圖標(biāo)以及ADC電壓表框架。

二、硬件連接

OLED RA0E2
SCL P500(13)
SDA P502(12)
GND GND
VCC 3V3

示意圖

f53aa5c2-4db8-11f1-90a1-92fbcf53809c.jpg

三、工程創(chuàng)建

打開e2studio軟件,依次選擇文件-新建-C/C++-RA項(xiàng)目;

設(shè)備選擇:開發(fā)板選擇FPB-RA0E2,選擇GNU ARM工具鏈和J-Link調(diào)試器,完成工程創(chuàng)建;

新建IIC通信堆棧NewStack-Connectivity-I2CMaster(r_sau_i2c);

屬性配置中,Slave Address設(shè)置為0x3c,檢查引腳對(duì)應(yīng)關(guān)系為SCL00-P500、SDA00-P502;

點(diǎn)擊Generate Project Content按鈕,生成工程代碼。

四、工程代碼

包括hal_entry.c、OLED驅(qū)動(dòng)代碼、字模和圖片代碼等。

hal_entry.c

在左側(cè)的項(xiàng)目目錄中,打開src/hal_entry.c文件,添加如下關(guān)鍵代碼:

滑動(dòng)查看完整內(nèi)容

#include"hal_data.h"
#include"oled.h"
#include"bmp.h"


FSP_CPP_HEADER
voidR_BSP_WarmStart(bsp_warm_start_event_tevent);
FSP_CPP_FOOTER


i2c_master_event_ti2c_event = I2C_MASTER_EVENT_ABORTED;
voidsau_i2c_master_callback(i2c_master_callback_args_t*p_args)
{
  i2c_event = I2C_MASTER_EVENT_ABORTED;
 if(NULL!= p_args)
  {
   /* capture callback event for validating the i2c transfer event*/
    i2c_event = p_args->event;
  }
}
fsp_err_terr = FSP_SUCCESS;
int timeout_ms =100;


voidhal_entry(void)
{
 /*TODO:add your own code here */
 /* Initialize IIC OLED */
      err =R_SAU_I2C_Open(&g_i2c0_ctrl, &g_i2c0_cfg);
     assert(FSP_SUCCESS == err);
     OLED_Init();
     OLED_Clear();
     OLED_DrawBMP(0,0,128,8,BMP1,0);// initialized page -> Renesas logo
     R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);


     /*----------- Frame ------------*/
     OLED_Clear();
     OLED_ShowString(0,0,"  ADC ",16,1);
     OLED_ShowCHinese(56,0,0,1);//電
     OLED_ShowCHinese(72,0,1,1);//壓
     OLED_ShowCHinese(88,0,2,1);//表
     OLED_ShowString(104,0,"  ",16,1);


     OLED_ShowString(4,3,"ADC",16,0);
     OLED_ShowCHinese(32,3,3,0);//值
     OLED_ShowChar(48,3,':',16,0);


     OLED_ShowCHinese(0,6,0,0);//電
     OLED_ShowCHinese(16,6,1,0);//壓
     OLED_ShowCHinese(32,6,3,0);//值
     OLED_ShowChar(48,6,':',16,0);
     OLED_ShowChar(100,6,'V',16,0);


#ifBSP_TZ_SECURE_BUILD
 /* Enter non-secure code */
 R_BSP_NonSecureEnter();
#endif
}

oled.c

在src文件夾下新建OLED驅(qū)動(dòng)源文件,命名為 oled.c,添加如下代碼:

滑動(dòng)查看完整內(nèi)容

#include"oled.h"
#include"oledfont.h"
#include"hal_data.h"
#include"stdint.h"
uint8_t CMD_Data[]={
0xAE,
0x00,
0x10,
0x40,
0xB0,
0x81,
0xFF,
0xA1,
0xA6,
0xA8,
0x3F,
0xC8,
0xD3,
0x00,
0xD5,
0x80,
0xD8,
0x05,
0xD9,
0xF1,
0xDA,
0x12,
0xD8,
0x30,
0x8D,
0x14,
0xAF
};   //初始化命令
externfsp_err_t err;
externint timeout_ms;
extern i2c_master_event_t i2c_event ;
voidWriteCmd(void)
{
  uint8_t i =0;
  uint8_t ii[2]={0x00,0x00};
 for(i=0;i<27;i++)
? ? {
? ? ? ? ii[1]=CMD_Data[i];
? ? ? ??//err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
? ? ? ? err =?R_SAU_I2C_Write(&g_i2c0_ctrl, ii,?0x02,?true);
? ? ? ??assert(FSP_SUCCESS?== err);
? ? ? ??/* Since there is nothing else to do, block until Callback triggers*/
? ? ? ??while?((I2C_MASTER_EVENT_TX_COMPLETE?!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
  }
}
/**
*@function: void OLED_WR_CMD(uint8_t cmd)
*@description: 向設(shè)備寫控制命令
*@param{uint8_t} cmd 芯片手冊(cè)規(guī)定的命令
*@return{*}
*/
voidOLED_WR_CMD(uint8_t cmd)
{
    uint8_t ii[2]={0x00,0x00};
    ii[1]=cmd;
   //err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
    err =R_SAU_I2C_Write(&g_i2c0_ctrl, ii,0x02,true);
   assert(FSP_SUCCESS== err);
   /* Since there is nothing else to do, block until Callback triggers*/
   //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
   while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
}
/**
*@function: void OLED_WR_DATA(uint8_t data)
*@description: 向設(shè)備寫控制數(shù)據(jù)
*@param{uint8_t} data 數(shù)據(jù)
*@return{*}
*/
voidOLED_WR_DATA(uint8_t data)
{
    uint8_t ii[2]={0x40,0x00};
    ii[1]=data;
   //err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
    err =R_SAU_I2C_Write(&g_i2c0_ctrl, ii,0x02,true);
   assert(FSP_SUCCESS== err);
   /* Since there is nothing else to do, block until Callback triggers*/
   while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
}
/**
*@function: void OLED_Init(void)
*@description: OLED初始化
*@return{*}
*/
voidOLED_Init(void)
{
 R_BSP_SoftwareDelay(200,BSP_DELAY_UNITS_MILLISECONDS);
 WriteCmd();
}
/**
*@function: OLED_Clear(void)
*@description: 清屏,整個(gè)屏幕的像素點(diǎn)都是關(guān)閉的
*@return{*}
*/
voidOLED_Clear(void)
{
  uint8_t i,n;
 for(i=0;i<8;i++)
? ? {
? ? ? ??OLED_WR_CMD(0xb0+i);//設(shè)置頁(yè)地址(0~7)
? ? ? ??OLED_WR_CMD?(0x00);?//設(shè)置顯示位置—列低地址
? ? ? ??OLED_WR_CMD?(0x10);?//設(shè)置顯示位置—列高地址
? ? ? ??for(n=0;n<132;n++)
? ? ? ? ? ??OLED_WR_DATA(0);//更新顯示
? ? }
}
/**
?*?@function: void OLED_Display_On(void)
?*?@description: 更新顯示
?*?@return?{*}
?*/
voidOLED_Display_On(void)
{
? ??OLED_WR_CMD(0X8D); ?//SET DCDC命令
? ??OLED_WR_CMD(0X14); ?//DCDC ON
? ??OLED_WR_CMD(0XAF); ?//DISPLAY ON
}
/**
?*?@function: void OLED_Display_Off(void)
?*?@description: 關(guān)閉OLED顯示
?*?@return?{*}
?*/
voidOLED_Display_Off(void)
{
? ??OLED_WR_CMD(0X8D); ?//SET DCDC命令
? ??OLED_WR_CMD(0X10); ?//DCDC OFF
? ??OLED_WR_CMD(0XAE); ?//DISPLAY OFF
}
/**
?*?@function: void OLED_Set_Pos(uint8_t x, uint8_t y)
?*?@description: 坐標(biāo)設(shè)置
?*?@param?{uint8_t} x,y
?*?@return?{*}
?*/
voidOLED_Set_Pos(uint8_t x, uint8_t y)
{
? ??OLED_WR_CMD(0xb0+y);
? ??OLED_WR_CMD(((x&0xf0)>>4)|0x10);
 OLED_WR_CMD(x&0x0f);
}
/**
*@function: void OLED_On(void)
*@description: 更新顯示
*@return{*}
*/
voidOLED_On(void)
{
  uint8_t i,n;
 for(i=0;i<8;i++)
? ? {
? ? ? ??OLED_WR_CMD(0xb0+i); ? ?//設(shè)置頁(yè)地址(0~7)
? ? ? ??OLED_WR_CMD(0x00); ? ? ?//設(shè)置顯示位置—列低地址
? ? ? ??OLED_WR_CMD(0x10); ? ? ?//設(shè)置顯示位置—列高地址
? ? ? ??for(n=0;n<128;n++)
? ? ? ? ? ??OLED_WR_DATA(1);
? ? }?//更新顯示
}
/**
?*?@function: unsigned int oled_pow(uint8_t m,uint8_t n)
?*?@description: m^n函數(shù)
?*?@param?{uint8_t} m,n
?*?@return?{unsigned int}?result
?*/
unsignedintoled_pow(uint8_t m,uint8_t n)
{
? ? unsignedint result=1;
? ??while(n--)result*=m;
? ??return?result;
}
/**
?*?@function: void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2, uint8_t mode)
?*?@description: 在OLED12864特定位置開始顯示一個(gè)整數(shù)
?*?@param?{uint8_t} x字符開始顯示的橫坐標(biāo) 0~127
?*?@param?{uint8_t} y字符開始顯示的縱坐標(biāo) 0~63
?*?@param?{uint8_t} num 待顯示的整數(shù)
?*?@param?{uint8_t} len 待顯示數(shù)字的位數(shù)
?*?@param?{uint8_t} size2 待顯示數(shù)字的大小
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_ShowNum(uint8_t x,uint8_t y,unsignedint num,uint8_t len,uint8_t size2, uint8_t mode)
{
? ? uint8_t t,temp;
? ? uint8_t enshow=0;
? ??for(t=0;t128-1)
    {
      x=0;
      y=y+2;
    }
   if(Char_Size ==16)
    {
     OLED_Set_Pos(x,y);
     for(i=0;i<8;i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//OLED_WR_DATA(F8X16[c*16+i]);
? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F8X16[c*16+i]);
? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F8X16[c*16+i]);
? ? ? ? ? ? }
? ? ? ? ? ??OLED_Set_Pos(x,y+1);
? ? ? ? ? ??for(i=0;i<8;i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//OLED_WR_DATA(F8X16[c*16+i+8]);
? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F8X16[c*16+i+8]);
? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F8X16[c*16+i+8]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ??else
? ? ? ? {
? ? ? ? ? ? ? ??OLED_Set_Pos(x,y);
? ? ? ? ? ? ? ??for(i=0;i<6;i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ??//OLED_WR_DATA(F6x8[c][i]);
? ? ? ? ? ? ? ? ? ??for(i=0;i<6;i++)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F6x8[c][i]);
? ? ? ? ? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F6x8[c][i]);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? }
}
/**
?*?@function: void OLED_Showdecimal(uint8_t x,uint8_t y,float num,uint8_t z_len,uint8_t f_len,uint8_t size2, uint8_t Color_Turn)
?*?@description: 顯示正負(fù)浮點(diǎn)數(shù)
?*?@param?{uint8_t} x待顯示的數(shù)字起始橫坐標(biāo),x:0~126
?*?@param?{uint8_t} y待顯示的數(shù)字起始縱坐標(biāo), y:0~7,若選擇字體大小為16,則兩行數(shù)字之間需要間隔2,若選擇字體大小為12,間隔1
?*?@param?{float} num:輸入的浮點(diǎn)型數(shù)據(jù)
?*?@param?{uint8_t?} z_ len:整數(shù)部分的位數(shù)
?*?@param?{uint8_t?} f_len: 小數(shù)部分的位數(shù)
?*?@param?{uint8_t} size2:輸入的數(shù)據(jù)大小,選擇 16/12,16為8X16,12為6x8
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_ShowDecimal(uint8_t x,uint8_t y,float num,uint8_t z_len,uint8_t f_len,uint8_t size2, uint8_t mode)
{
? ? uint8_t t,temp,i=0;//i為負(fù)數(shù)標(biāo)志位
? ? uint8_t enshow;
? ? int z_temp,f_temp;
? ??if(num<0)
? ? {
? ? ? ? z_len+=1;
? ? ? ? i=1;
? ? ? ? num=-num;
? ? }
? ? z_temp=(int)num;
? ??//整數(shù)部分
? ??for(t=0;t122&&Char_Size==12)//TextSize6x8如果一行不夠顯示了,從下一行繼續(xù)顯示
    {
      x =0;
      y++;
    }
   if(x >120&&Char_Size==16)//TextSize8x16如果一行不夠顯示了,從下一行繼續(xù)顯示
    {
      x =0;
      y+=2;
    }
    j++;
  }
}
/**
*@function: void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t Color_Turn)
*@description: 在OLED特定位置開始顯示16X16漢字
*@param{uint8_t} x待顯示的漢字起始橫坐標(biāo)x: 0~112,兩列漢字之間需要間隔16
*@param{uint8_t} y待顯示的漢字起始縱坐標(biāo) y: 0~6 , 兩行漢字之間需要間隔2
*@param{uint8_t} no待顯示的漢字編號(hào)
*@param{uint8_t} mode 是否反相顯示(1反相、0不反相)
*@return{*}
*/
voidOLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t mode)
{
  uint8_t t=0;
 OLED_Set_Pos(x,y);
 for(t=0;t<16;t++)
? ? {
? ? ? ??if?(mode)
? ? ? ? ? ??OLED_WR_DATA(~Hzk[2*no][t]);?//顯示漢字的上半部分
? ? ? ??else
? ? ? ? ? ??OLED_WR_DATA(Hzk[2*no][t]);?//顯示漢字的上半部分
? ? }
? ??OLED_Set_Pos(x,y+1);
? ??for(t=0;t<16;t++)
? ? {
? ? ? ??if?(mode)
? ? ? ? ? ??OLED_WR_DATA(~Hzk[2*no+1][t]);?//顯示漢字的上半部分
? ? ? ??else
? ? ? ? ? ??OLED_WR_DATA(Hzk[2*no+1][t]);//顯示漢字的上半部分
? ? }
}
/**
?*?@function: void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t * ?BMP,uint8_t Color_Turn)
?*?@description: 在OLED特定區(qū)域顯示BMP圖片
?*?@param?{uint8_t} x0圖像開始顯示橫坐標(biāo) ?x0:0~127
?*?@param?{uint8_t} y0圖像開始顯示縱坐標(biāo) ?y0:0~7
?*?@param?{uint8_t} x1圖像結(jié)束顯示橫坐標(biāo) ?x1:1~128
?*?@param?{uint8_t} y1圖像結(jié)束顯示縱坐標(biāo) ?y1:1~8
?*?@param?{uint8_t} *BMP待顯示的圖像數(shù)據(jù)
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t * ?BMP, uint8_t mode)
{
? ?uint32_t j =?0;
? ?uint8_t x =?0, y =?0;
??if(y1%8==0)
? ? ? ? y = y1/8;
??else
? ? ? ? y = y1/8?+?1;
? ??for(y=y0;y

oled.h

在src文件夾下新建OLED驅(qū)動(dòng)頭文件,命名為 oled.h,添加如下代碼:

左右滑動(dòng)查看完整內(nèi)容

#ifndefOLED_H_
#defineOLED_H_


#include"stdint.h"


voidWriteCmd(void);
voidOLED_WR_CMD(uint8_tcmd);
voidOLED_WR_DATA(uint8_tdata);
voidOLED_Init(void);
voidOLED_Clear(void);
voidOLED_Display_On(void);
voidOLED_Display_Off(void);
voidOLED_Set_Pos(uint8_tx,uint8_ty);
voidOLED_On(void);
voidOLED_ShowNum(uint8_tx,uint8_ty,unsignedint num,uint8_tlen,uint8_tsize2,uint8_tmode);
voidOLED_ShowDecimal(uint8_tx,uint8_ty,floatnum,uint8_tz_len,uint8_tf_len,uint8_tsize2,uint8_tmode);
voidOLED_ShowChar(uint8_tx,uint8_ty,uint8_tchr,uint8_tChar_Size,uint8_tmode);
voidOLED_ShowString(uint8_tx,uint8_ty,uint8_t*chr,uint8_tChar_Size,uint8_tmode);
voidOLED_ShowCHinese(uint8_tx,uint8_ty,uint8_tno,uint8_tmode);
voidOLED_DrawBMP(unsignedchar x0,unsignedchar y0,unsignedchar x1,unsignedchar y1,unsignedchar BMP[],uint8_tmode);
voidOLED_DisplayMode(uint8_tmode);
voidOLED_IntensityControl(uint8_tintensity);


#endif/* OLED_H_ */

oledfont.h

在src文件夾下新建字體驅(qū)動(dòng)頭文件,命名為 oledfont.h,添加如下代碼

滑動(dòng)查看完整內(nèi)容

#include"oled.h"
#include"oledfont.h"
#include"hal_data.h"
#include"stdint.h"
uint8_t CMD_Data[]={
0xAE,
0x00,
0x10,
0x40,
0xB0,
0x81,
0xFF,
0xA1,
0xA6,
0xA8,
0x3F,
0xC8,
0xD3,
0x00,
0xD5,
0x80,
0xD8,
0x05,
0xD9,
0xF1,
0xDA,
0x12,
0xD8,
0x30,
0x8D,
0x14,
0xAF
};   //初始化命令
externfsp_err_t err;
externint timeout_ms;
extern i2c_master_event_t i2c_event ;
voidWriteCmd(void)
{
  uint8_t i =0;
  uint8_t ii[2]={0x00,0x00};
 for(i=0;i<27;i++)
? ? {
? ? ? ? ii[1]=CMD_Data[i];
? ? ? ??//err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
? ? ? ? err =?R_SAU_I2C_Write(&g_i2c0_ctrl, ii,?0x02,?true);
? ? ? ??assert(FSP_SUCCESS?== err);
? ? ? ??/* Since there is nothing else to do, block until Callback triggers*/
? ? ? ??while?((I2C_MASTER_EVENT_TX_COMPLETE?!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
  }
}
/**
*@function: void OLED_WR_CMD(uint8_t cmd)
*@description: 向設(shè)備寫控制命令
*@param{uint8_t} cmd 芯片手冊(cè)規(guī)定的命令
*@return{*}
*/
voidOLED_WR_CMD(uint8_t cmd)
{
    uint8_t ii[2]={0x00,0x00};
    ii[1]=cmd;
   //err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
    err =R_SAU_I2C_Write(&g_i2c0_ctrl, ii,0x02,true);
   assert(FSP_SUCCESS== err);
   /* Since there is nothing else to do, block until Callback triggers*/
   //while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms)
   while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
}
/**
*@function: void OLED_WR_DATA(uint8_t data)
*@description: 向設(shè)備寫控制數(shù)據(jù)
*@param{uint8_t} data 數(shù)據(jù)
*@return{*}
*/
voidOLED_WR_DATA(uint8_t data)
{
    uint8_t ii[2]={0x40,0x00};
    ii[1]=data;
   //err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
    err =R_SAU_I2C_Write(&g_i2c0_ctrl, ii,0x02,true);
   assert(FSP_SUCCESS== err);
   /* Since there is nothing else to do, block until Callback triggers*/
   while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms>0)
    {
     R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MICROSECONDS);
      timeout_ms--;
    }
   if(I2C_MASTER_EVENT_ABORTED== i2c_event)
    {
     __BKPT(0);
    }
   /* Read data back from the I2C slave */
    i2c_event =I2C_MASTER_EVENT_ABORTED;
    timeout_ms      =100;
}
/**
*@function: void OLED_Init(void)
*@description: OLED初始化
*@return{*}
*/
voidOLED_Init(void)
{
 R_BSP_SoftwareDelay(200,BSP_DELAY_UNITS_MILLISECONDS);
 WriteCmd();
}
/**
*@function: OLED_Clear(void)
*@description: 清屏,整個(gè)屏幕的像素點(diǎn)都是關(guān)閉的
*@return{*}
*/
voidOLED_Clear(void)
{
  uint8_t i,n;
 for(i=0;i<8;i++)
? ? {
? ? ? ??OLED_WR_CMD(0xb0+i);//設(shè)置頁(yè)地址(0~7)
? ? ? ??OLED_WR_CMD?(0x00);?//設(shè)置顯示位置—列低地址
? ? ? ??OLED_WR_CMD?(0x10);?//設(shè)置顯示位置—列高地址
? ? ? ??for(n=0;n<132;n++)
? ? ? ? ? ??OLED_WR_DATA(0);//更新顯示
? ? }
}
/**
?*?@function: void OLED_Display_On(void)
?*?@description: 更新顯示
?*?@return?{*}
?*/
voidOLED_Display_On(void)
{
? ??OLED_WR_CMD(0X8D); ?//SET DCDC命令
? ??OLED_WR_CMD(0X14); ?//DCDC ON
? ??OLED_WR_CMD(0XAF); ?//DISPLAY ON
}
/**
?*?@function: void OLED_Display_Off(void)
?*?@description: 關(guān)閉OLED顯示
?*?@return?{*}
?*/
voidOLED_Display_Off(void)
{
? ??OLED_WR_CMD(0X8D); ?//SET DCDC命令
? ??OLED_WR_CMD(0X10); ?//DCDC OFF
? ??OLED_WR_CMD(0XAE); ?//DISPLAY OFF
}
/**
?*?@function: void OLED_Set_Pos(uint8_t x, uint8_t y)
?*?@description: 坐標(biāo)設(shè)置
?*?@param?{uint8_t} x,y
?*?@return?{*}
?*/
voidOLED_Set_Pos(uint8_t x, uint8_t y)
{
? ??OLED_WR_CMD(0xb0+y);
? ??OLED_WR_CMD(((x&0xf0)>>4)|0x10);
 OLED_WR_CMD(x&0x0f);
}
/**
*@function: void OLED_On(void)
*@description: 更新顯示
*@return{*}
*/
voidOLED_On(void)
{
  uint8_t i,n;
 for(i=0;i<8;i++)
? ? {
? ? ? ??OLED_WR_CMD(0xb0+i); ? ?//設(shè)置頁(yè)地址(0~7)
? ? ? ??OLED_WR_CMD(0x00); ? ? ?//設(shè)置顯示位置—列低地址
? ? ? ??OLED_WR_CMD(0x10); ? ? ?//設(shè)置顯示位置—列高地址
? ? ? ??for(n=0;n<128;n++)
? ? ? ? ? ??OLED_WR_DATA(1);
? ? }?//更新顯示
}
/**
?*?@function: unsigned int oled_pow(uint8_t m,uint8_t n)
?*?@description: m^n函數(shù)
?*?@param?{uint8_t} m,n
?*?@return?{unsigned int}?result
?*/
unsignedintoled_pow(uint8_t m,uint8_t n)
{
? ? unsignedint result=1;
? ??while(n--)result*=m;
? ??return?result;
}
/**
?*?@function: void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2, uint8_t mode)
?*?@description: 在OLED12864特定位置開始顯示一個(gè)整數(shù)
?*?@param?{uint8_t} x字符開始顯示的橫坐標(biāo) 0~127
?*?@param?{uint8_t} y字符開始顯示的縱坐標(biāo) 0~63
?*?@param?{uint8_t} num 待顯示的整數(shù)
?*?@param?{uint8_t} len 待顯示數(shù)字的位數(shù)
?*?@param?{uint8_t} size2 待顯示數(shù)字的大小
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_ShowNum(uint8_t x,uint8_t y,unsignedint num,uint8_t len,uint8_t size2, uint8_t mode)
{
? ? uint8_t t,temp;
? ? uint8_t enshow=0;
? ??for(t=0;t128-1)
    {
      x=0;
      y=y+2;
    }
   if(Char_Size ==16)
    {
     OLED_Set_Pos(x,y);
     for(i=0;i<8;i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//OLED_WR_DATA(F8X16[c*16+i]);
? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F8X16[c*16+i]);
? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F8X16[c*16+i]);
? ? ? ? ? ? }
? ? ? ? ? ??OLED_Set_Pos(x,y+1);
? ? ? ? ? ??for(i=0;i<8;i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//OLED_WR_DATA(F8X16[c*16+i+8]);
? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F8X16[c*16+i+8]);
? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F8X16[c*16+i+8]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ??else
? ? ? ? {
? ? ? ? ? ? ? ??OLED_Set_Pos(x,y);
? ? ? ? ? ? ? ??for(i=0;i<6;i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ??//OLED_WR_DATA(F6x8[c][i]);
? ? ? ? ? ? ? ? ? ??for(i=0;i<6;i++)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ??if(mode)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(~F6x8[c][i]);
? ? ? ? ? ? ? ? ? ? ? ??else
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??OLED_WR_DATA(F6x8[c][i]);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? }
}
/**
?*?@function: void OLED_Showdecimal(uint8_t x,uint8_t y,float num,uint8_t z_len,uint8_t f_len,uint8_t size2, uint8_t Color_Turn)
?*?@description: 顯示正負(fù)浮點(diǎn)數(shù)
?*?@param?{uint8_t} x待顯示的數(shù)字起始橫坐標(biāo),x:0~126
?*?@param?{uint8_t} y待顯示的數(shù)字起始縱坐標(biāo), y:0~7,若選擇字體大小為16,則兩行數(shù)字之間需要間隔2,若選擇字體大小為12,間隔1
?*?@param?{float} num:輸入的浮點(diǎn)型數(shù)據(jù)
?*?@param?{uint8_t?} z_ len:整數(shù)部分的位數(shù)
?*?@param?{uint8_t?} f_len: 小數(shù)部分的位數(shù)
?*?@param?{uint8_t} size2:輸入的數(shù)據(jù)大小,選擇 16/12,16為8X16,12為6x8
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_ShowDecimal(uint8_t x,uint8_t y,float num,uint8_t z_len,uint8_t f_len,uint8_t size2, uint8_t mode)
{
? ? uint8_t t,temp,i=0;//i為負(fù)數(shù)標(biāo)志位
? ? uint8_t enshow;
? ? int z_temp,f_temp;
? ??if(num<0)
? ? {
? ? ? ? z_len+=1;
? ? ? ? i=1;
? ? ? ? num=-num;
? ? }
? ? z_temp=(int)num;
? ??//整數(shù)部分
? ??for(t=0;t122&&Char_Size==12)//TextSize6x8如果一行不夠顯示了,從下一行繼續(xù)顯示
    {
      x =0;
      y++;
    }
   if(x >120&&Char_Size==16)//TextSize8x16如果一行不夠顯示了,從下一行繼續(xù)顯示
    {
      x =0;
      y+=2;
    }
    j++;
  }
}
/**
*@function: void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t Color_Turn)
*@description: 在OLED特定位置開始顯示16X16漢字
*@param{uint8_t} x待顯示的漢字起始橫坐標(biāo)x: 0~112,兩列漢字之間需要間隔16
*@param{uint8_t} y待顯示的漢字起始縱坐標(biāo) y: 0~6 , 兩行漢字之間需要間隔2
*@param{uint8_t} no待顯示的漢字編號(hào)
*@param{uint8_t} mode 是否反相顯示(1反相、0不反相)
*@return{*}
*/
voidOLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no, uint8_t mode)
{
  uint8_t t=0;
 OLED_Set_Pos(x,y);
 for(t=0;t<16;t++)
? ? {
? ? ? ??if?(mode)
? ? ? ? ? ??OLED_WR_DATA(~Hzk[2*no][t]);?//顯示漢字的上半部分
? ? ? ??else
? ? ? ? ? ??OLED_WR_DATA(Hzk[2*no][t]);?//顯示漢字的上半部分
? ? }
? ??OLED_Set_Pos(x,y+1);
? ??for(t=0;t<16;t++)
? ? {
? ? ? ??if?(mode)
? ? ? ? ? ??OLED_WR_DATA(~Hzk[2*no+1][t]);?//顯示漢字的上半部分
? ? ? ??else
? ? ? ? ? ??OLED_WR_DATA(Hzk[2*no+1][t]);//顯示漢字的上半部分
? ? }
}
/**
?*?@function: void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t * ?BMP,uint8_t Color_Turn)
?*?@description: 在OLED特定區(qū)域顯示BMP圖片
?*?@param?{uint8_t} x0圖像開始顯示橫坐標(biāo) ?x0:0~127
?*?@param?{uint8_t} y0圖像開始顯示縱坐標(biāo) ?y0:0~7
?*?@param?{uint8_t} x1圖像結(jié)束顯示橫坐標(biāo) ?x1:1~128
?*?@param?{uint8_t} y1圖像結(jié)束顯示縱坐標(biāo) ?y1:1~8
?*?@param?{uint8_t} *BMP待顯示的圖像數(shù)據(jù)
?*?@param?{uint8_t} mode 是否反相顯示(1反相、0不反相)
?*?@return?{*}
?*/
voidOLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t * ?BMP, uint8_t mode)
{
? ?uint32_t j =?0;
? ?uint8_t x =?0, y =?0;
??if(y1%8==0)
? ? ? ? y = y1/8;
??else
? ? ? ? y = y1/8?+?1;
? ??for(y=y0;y

字體和圖片取模方案

使用Image2LCD軟件,將目標(biāo)圖片縮放至OLED屏幕尺寸,并保存為BMP格式;

f59b0246-4db8-11f1-90a1-92fbcf53809c.png

將BMP圖片導(dǎo)入PCtoLCD軟件,模式選擇圖像模式,點(diǎn)擊齒輪圖標(biāo)進(jìn)入設(shè)置界面;

f5f3947e-4db8-11f1-90a1-92fbcf53809c.jpg

配置字模選項(xiàng):

f6570220-4db8-11f1-90a1-92fbcf53809c.jpg

生成字模即可;

同理,切換至字體模式,可生成目標(biāo)漢字代碼。

五、效果

按照硬件連接示意圖,連接開發(fā)板和OLED對(duì)應(yīng)引腳;

進(jìn)入調(diào)試模式,或上電復(fù)位運(yùn)行;

f6b99a5c-4db8-11f1-90a1-92fbcf53809c.gif

OLED顯示Renesas圖標(biāo)logo并延時(shí)500毫秒,之后切換至ADC電壓表顯示框架。

六、總結(jié)

本文介紹了瑞薩FPB RA0E2開發(fā)板實(shí)現(xiàn)OLED驅(qū)動(dòng)顯示Renesas圖標(biāo)logo以及ADC電壓表框架的項(xiàng)目設(shè)計(jì),為后續(xù)開發(fā)和實(shí)時(shí)顯示ADC電壓做好鋪墊,也為瑞薩相關(guān)產(chǎn)品的快速開發(fā)和應(yīng)用提供了參考。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • OLED
    +關(guān)注

    關(guān)注

    121

    文章

    6387

    瀏覽量

    234529
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7970

    瀏覽量

    557288
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    26

    文章

    6481

    瀏覽量

    121302
  • 驅(qū)動(dòng)顯示
    +關(guān)注

    關(guān)注

    1

    文章

    5

    瀏覽量

    3653

原文標(biāo)題:瑞薩RA MCU眾測(cè)寶典 | 手把手搞定瑞薩FPB-RA0E2驅(qū)動(dòng)OLED顯示

文章出處:【微信號(hào):瑞薩嵌入式小百科,微信公眾號(hào):瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    FPB-RA0E2開發(fā)板簡(jiǎn)介及環(huán)境搭建指南

    FPB-RA0E2是一款針對(duì)RA0E2系列微控制器(MCU)的快速原型板,旨在幫助用戶無(wú)縫評(píng)估RA0E2 MCU的各項(xiàng)特性,并利用靈活配置軟件包(FSP)和e2studio集成
    的頭像 發(fā)表于 01-29 17:44 ?6464次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>FPB-RA0E2</b><b class='flag-5'>開發(fā)板</b>簡(jiǎn)介及環(huán)境搭建指南

    FPB-RA0E2開發(fā)板的批量加載例程

    RA MCU眾測(cè)寶典”環(huán)境搭建專題再添實(shí)用干貨!上一篇我們搞定了【FPB-RA0E2開發(fā)板的基礎(chǔ)環(huán)境配置,這次將解鎖“批量加載官方例
    的頭像 發(fā)表于 01-29 17:52 ?7224次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>FPB-RA0E2</b><b class='flag-5'>開發(fā)板</b>的批量加載例程

    基于FPB-RA0E2開發(fā)板實(shí)現(xiàn)UART串口打印HELLO WORLD

    本篇文章主要介紹如何使用e2 studio靈活軟件包(FSP)對(duì)FPB-RA0E2單片機(jī)開發(fā)板進(jìn)行UART串口打印HELLO WORLD
    的頭像 發(fā)表于 05-19 11:19 ?119次閱讀
    基于<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>FPB-RA0E2</b><b class='flag-5'>開發(fā)板實(shí)現(xiàn)</b>UART串口打印HELLO WORLD

    RA6E2地奇星開發(fā)板試用】使用`RA6E2`驅(qū)動(dòng) `ESP8266 WiFi模塊`,調(diào)試AT指令。

    ) 5. 工程運(yùn)行效果 6. 總結(jié) 本文介紹了【 RA6E2 地奇星開發(fā)板驅(qū)動(dòng) esp8266 WiFi模塊
    發(fā)表于 12-25 10:08

    FPB-RA6E2試用】【原創(chuàng)】【RA × Zephyr開發(fā)板評(píng)測(cè)】+兩款開發(fā)板之間到底差了啥

    的R7FA6E2BB3CFM。 圖1 FPB-RA6E2開發(fā)板2
    發(fā)表于 01-04 19:27

    FPB-RA6E2試用】在 FPB-RA6E2實(shí)現(xiàn) LED 閃爍(GPIO)

    LED燈。 如果開發(fā)板上有l(wèi)ed,可查看開發(fā)手冊(cè),查看開發(fā)板led引腳配置。 2.1 開發(fā)板引腳配置圖 我目前用的開發(fā)板
    發(fā)表于 01-07 19:13

    FPB-RA6E2試用】【RA × Zephyr開發(fā)板評(píng)測(cè)】難以復(fù)現(xiàn)的OLED顯示驅(qū)動(dòng)

    在地奇星RA6E2開發(fā)板上,以I2C的方式已實(shí)現(xiàn)OLED屏的顯示
    發(fā)表于 01-09 13:48

    RA4系列開發(fā)板體驗(yàn)】10. 我的試用總結(jié)

    KEIL下UART實(shí)現(xiàn)printf與scanf重定向【RA4系列開發(fā)板體驗(yàn)】4. PWM驅(qū)動(dòng)
    發(fā)表于 12-10 22:34

    RA0E1開發(fā)分享之一

    介紹生態(tài)社區(qū)的RA0E1開發(fā)板。
    的頭像 發(fā)表于 05-10 13:57 ?3198次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA0E</b>1<b class='flag-5'>開發(fā)</b>分享之一

    FPB-RA6E2 評(píng)估板入門學(xué)習(xí)

    FPB-RA6E2 評(píng)估板入門學(xué)習(xí)
    的頭像 發(fā)表于 12-11 09:22 ?1859次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b> <b class='flag-5'>FPB-RA6E2</b> 評(píng)估板入門學(xué)習(xí)

    基于RA0E1開發(fā)板的IIC OLED測(cè)試

    基于前面關(guān)于e2 studio開發(fā)軟件的使用,以及工程測(cè)試基礎(chǔ),本文進(jìn)一步探索實(shí)現(xiàn)硬件IIC OLE
    的頭像 發(fā)表于 02-13 13:36 ?1918次閱讀
    基于<b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA0E</b>1<b class='flag-5'>開發(fā)板</b>的IIC <b class='flag-5'>OLED</b>測(cè)試

    Renesas FPB-RA0E2 v1快速原型開發(fā)板使用指南

    Renesas FPB-RA0E2 v1快速原型開發(fā)板使用指南 在嵌入式系統(tǒng)開發(fā)領(lǐng)域,快速原型開發(fā)板是工程師們驗(yàn)證設(shè)計(jì)和開發(fā)應(yīng)用的得力工具。
    的頭像 發(fā)表于 12-26 17:30 ?1597次閱讀

    探索Renesas FPB - RA6E2:快速原型開發(fā)板的深度解析

    探索Renesas FPB - RA6E2:快速原型開發(fā)板的深度解析 在嵌入式系統(tǒng)開發(fā)的領(lǐng)域中,擁有一款高效且功能豐富的快速原型開發(fā)板至關(guān)重
    的頭像 發(fā)表于 12-29 15:15 ?793次閱讀

    探索Renesas FPB - RA2E2快速原型開發(fā)板:硬件設(shè)計(jì)與應(yīng)用指南

    探索Renesas FPB - RA2E2快速原型開發(fā)板:硬件設(shè)計(jì)與應(yīng)用指南 在嵌入式系統(tǒng)開發(fā)的世界里,擁有一款高效且功能豐富的快速原型開發(fā)板
    的頭像 發(fā)表于 12-29 16:30 ?1256次閱讀

    RA MCU眾測(cè)寶典 | 環(huán)境搭建之【FPB-RA0E2開發(fā)環(huán)境搭建

    RA生態(tài)工作室關(guān)注我們“RAMCU眾測(cè)寶典”環(huán)境搭建專題更新啦!這次我們聚焦【FPB-RA0E2開發(fā)板,一步步打通開發(fā)“第一關(guān)”,為后續(xù)功能開發(fā)
    的頭像 發(fā)表于 03-11 16:33 ?1600次閱讀
    <b class='flag-5'>RA</b> MCU眾測(cè)寶典 | 環(huán)境搭建之【<b class='flag-5'>FPB-RA0E2</b>】<b class='flag-5'>開發(fā)</b>環(huán)境搭建
    镇巴县| 罗山县| 师宗县| 高邑县| 万山特区| 吉林省| 微博| 雷波县| 巫溪县| 新沂市| 西乌珠穆沁旗| 邯郸县| 晋宁县| 沈阳市| 新密市| 巴林左旗| 台江县| 嵊泗县| 姚安县| 资溪县| 江城| 吴桥县| 灌云县| 措美县| 富平县| 尼玛县| 德格县| 永德县| 陆良县| 田东县| 黄龙县| 丰顺县| 巴楚县| 日土县| 应城市| 永泰县| 潞城市| 靖安县| 扎囊县| 琼中| 阳高县|