本文轉(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 |
示意圖

三、工程創(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格式;

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

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

生成字模即可;
同理,切換至字體模式,可生成目標(biāo)漢字代碼。
五、效果
按照硬件連接示意圖,連接開發(fā)板和OLED對(duì)應(yīng)引腳;
進(jìn)入調(diào)試模式,或上電復(fù)位運(yùn)行;

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)用提供了參考。
-
OLED
+關(guān)注
關(guān)注
121文章
6387瀏覽量
234529 -
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
瑞薩FPB-RA0E2開發(fā)板簡(jiǎn)介及環(huán)境搭建指南
瑞薩FPB-RA0E2開發(fā)板的批量加載例程
基于瑞薩FPB-RA0E2開發(fā)板實(shí)現(xiàn)UART串口打印HELLO WORLD
【瑞薩RA6E2地奇星開發(fā)板試用】使用`RA6E2`驅(qū)動(dòng) `ESP8266 WiFi模塊`,調(diào)試AT指令。
【瑞薩FPB-RA6E2試用】【原創(chuàng)】【瑞薩RA × Zephyr開發(fā)板評(píng)測(cè)】+兩款開發(fā)板之間到底差了啥
【瑞薩FPB-RA6E2試用】在 FPB-RA6E2 上實(shí)現(xiàn) LED 閃爍(GPIO)
【瑞薩FPB-RA6E2試用】【瑞薩RA × Zephyr開發(fā)板評(píng)測(cè)】難以復(fù)現(xiàn)的OLED屏顯示驅(qū)動(dòng)
【瑞薩RA4系列開發(fā)板體驗(yàn)】10. 我的試用總結(jié)
基于瑞薩RA0E1開發(fā)板的IIC OLED測(cè)試
Renesas FPB-RA0E2 v1快速原型開發(fā)板使用指南
探索Renesas FPB - RA6E2:快速原型開發(fā)板的深度解析
探索Renesas FPB - RA2E2快速原型開發(fā)板:硬件設(shè)計(jì)與應(yīng)用指南
RA MCU眾測(cè)寶典 | 環(huán)境搭建之【FPB-RA0E2】開發(fā)環(huán)境搭建
基于瑞薩FPB-RA0E2開發(fā)板實(shí)現(xiàn)OLED驅(qū)動(dòng)顯示
評(píng)論