新聞中心

EEPW首頁 > 光電顯示 > 設(shè)計應(yīng)用 > 瑞薩RA0單片機(jī)連載?OLED面向?qū)ο箫@示字符串

瑞薩RA0單片機(jī)連載?OLED面向?qū)ο箫@示字符串

作者:lulugl 時間:2025-04-19 來源:EEPW 收藏


本文引用地址:http://2s4d.com/article/202504/469576.htm

在前一篇我們驅(qū)動了OLED,這一篇將重構(gòu)顯示buff 、全屏更新OLED 顯存。并添加顯示字符串功能。

1.拷貝一個字符文件到工程中:

1745016583571526.png

2.新建一個結(jié)構(gòu)體,用于顯示與命令的存放:

view plaincopy to clipboardprint?

1. static struct OLED_all_buff _t{

2. uint8_t cmd;

3. uint8_t data[1024]; // 顯存

4. } OLED_all_buff ;

3.修改向OLED 寫入整個顯存的函數(shù)如下:

view plaincopy to clipboardprint?

1. static void OLED_Display(struct DisplayDevice*

ptDev)

2. {

3.

4. OLED_all_buff .cmd = 0x40; // 寫數(shù)據(jù)

5. // 以下為修改為頁尋址模式

6. OLEDDrvWriteReg(0x20);

7. OLEDDrvWriteReg(0x00);

8. OLEDDrvWriteReg(0x21);

9. OLEDDrvWriteReg(0x00);

10. OLEDDrvWriteReg(127);

11. OLEDDrvWriteReg(0x22);

12. OLEDDrvWriteReg(0x00);

13. OLEDDrvWriteReg(7);

14. // 向OLED 寫入整屏

15. R_SAU_I2C_Write(&g_sau_i2c_master_ctrl, &

OLED_all_buff , 1025, true);

16. // 等待發(fā)送結(jié)束

17. I2C1WaitTxCplt();

18. }

4.修改畫點的函數(shù),將畫點修改為向顯示緩存修改數(shù)據(jù):

view plaincopy to clipboardprint?

1. static int OLEDDrvSetPixel(struct DisplayDevice

* ptDev, unsigned short wX, unsigned short wY, u

nsigned short wColor)

2. {

3. if(NULL == ptDev->name) return -1;

4.

5. unsigned char *buf = ptDev->FBBase;

6. int page;

7. unsigned char *byte;

8. int bit;

9.

10. if (wX >= ptDev->wXres || wY >= ptDev->wYres)

11. return -1;

12. if(wColor) {

13. buf[(wY/8)*128+wX]|= (1<<(wY%8))&0xff ;

14. } else {

15. buf[(wY/8)*128+wX]&= ~((1<<(wY%8))

&0xff);

16. }

17. }

5.添加字符顯示函數(shù):

view plaincopy to clipboardprint?

1. static void OLED_ShowChar(struct DisplayDev

ice* ptDev,uint8_t x,uint8_t y,uint8_t chr,uint8_

t Char_Size,uint8_t mode) {

2. if(NULL == ptDev->name) return;

3. unsigned char c=0,i=0,tmp,j=0;

4. c=chr-’ ‘;// 轉(zhuǎn)換為字庫里的序號

5. if(x>ptDev->wXres-1){x=0;y=y+2;}

6. if(Char_Size ==16) {

7. for(i=0;i<16;i++) {

8. if(mode) {

9. tmp = F8X16[c*16+i];

10. } else {

11. tmp = ~(F8X16[c*16+i]);

12. }

13. for(j=0;j<8;j++) {

14. if(tmp&(0x80>>j)) {

15. ptDev->SetPixel(ptDev,x+j, y+i,1);

16. } else {

17. ptDev->SetPixel(ptDev,x+j, y+i,0);

18. }

19. }

20. }

21. } else if(Char_Size==8) {

22. for(i=0;i<8;i++) {

23. if(mode) {

24. tmp = F6x8[c][i];

25. } else {

26. tmp = ~(F6x8[c][i]);

27. }

28. for(j=0;j<8;j++) {

29. if(tmp&(0x80>>j)) {

30. ptDev->SetPixel(ptDev,x+j, y+i,1);

31. } else {

32. ptDev->SetPixel(ptDev,x+j, y+i,0);

33. }

34. }

35. }

36. } else {

37. return;

38. }

39. }

6.添加顯示字符串的函數(shù)如下:

view plaincopy to clipboardprint?

1. static void OLED_ShowString(struct DisplayDev

ice* ptDev,uint8_t x,uint8_t y,uint8_t *chr,uint8_

t Char_Size,uint8_t mode) {

2. unsigned char j=0,csize;

3. if(Char_Size == 16) {

4. csize = Char_Size/2;

5. } else if(Char_Size == 8) {

6. csize = Char_Size/2+2;

7. } else {

8. return;

9. }

10.

11. while (chr[j]!=’?’) {

12. OLED_ShowChar(ptDev,x,y,chr[j],Char_

Size,mode);

13. x+=csize;

14. if(x>120) {

15. x=0;

16. y+=Char_Size;

17. }

18. j++;

19. }

20. //OLED_Display();

21. }

7.將上面的函數(shù)更新到LCD 驅(qū)動里面,

view plaincopy to clipboardprint?

1. static DisplayDevice gOledDev = {

2. .name = “OLED”,

3. .FBBase = OLED_all_buff.data,

4. .wXres = 128,

5. .wYres = 64,

6. .wBpp = 1,

7. .dwSize = 128*64*1/8,

8. .Init = OLEDDrvinit,

9. .DisplayON = OLEDDrvDispON,

10. .DisplayOFF = OLEDDrvDispOFF,

11. .SetDisplayWindow = OLEDDrvSetDispWindow,

12. .SetPixel = OLEDDrvSetPixel,

13. .GUI_DrawPoint = OLED_DrawPoint, // 畫點

14. .GUI_ShowChar = OLED_ShowChar, // 畫字符

15. .GUI_ShowString = OLED_ShowString, // 顯示字符串

16. .GUI_Display = OLED_Display, // 更新顯存

17. };

8.這樣,我們在主函數(shù)里實例化OLED 對象,就可以用他的方法來顯示字符或者字符串了,在主函數(shù)中加入測試函數(shù)如下:

view plaincopy to clipboardprint?

1. void led_blink(void)

2. {

3. uint32_t cnt;

4. UartDevicesRegister();

5.

6. DisplayDevice *ptDispDev = OLEDGetDevice();

7. if(ptDispDev == NULL)

8. {

9. printf("Failed to get OLED Display Device!rn");

10. return;

11. }

12.

13. ptDispDev->Init(ptDispDev);

14. while(1)

15. {

16. ptDispDev->GUI_Fill(ptDispDev,0); //清理顯存

17. ptDispDev->GUI_ShowString(ptDispDev,0,0, (uint8_t *)”HELLO WORLD”,16,1); //顯示字符串

18. ptDispDev->GUI_ShowString(ptDispDev,10,

16, (uint8_t *)”HELLO EEPW”,16,1);

19. ptDispDev->GUI_Display(ptDispDev); //刷新數(shù)據(jù)到OLED

20. HAL_Delay(2);

21.

22. }

23. }

1   實現(xiàn)效果

image.png

2   總結(jié)

對于面向象對象的編程,我們可以方便的實現(xiàn)模塊化的編程。方便在不同的MCU 之間的移植。

(本文來源于《EEPW》



關(guān)鍵詞: 202504

評論


技術(shù)專區(qū)

關(guān)閉