查看: 2276|回复: 1

[分享] 【MCX先手尝鲜】 硬件I2C驱动OLED

[复制链接]
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 1481 天

    连续签到: 1 天

    [LV.10]以坛为家III

    152

    主题

    3146

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8652
    最后登录
    2025-7-27
    发表于 2024-1-23 21:38:00 | 显示全部楼层 |阅读模式
    测试下I2C驱动OLED显示屏显示汉字。


    一、硬件电路


    测试使用FC2_I2C端口
    001.jpg


    二、程序部分


    2.1、oled.c
    1. #include "main.h"
    2. #include "oled/codetab.h"

    3. void I2C_WriteByte(uint8_t addr, uint8_t dat)
    4. {
    5.         LPI2C_MasterStart(EXAMPLE_I2C_MASTER, OLED_ADDRESS>>1, kLPI2C_Write);
    6.         LPI2C_MasterSend(EXAMPLE_I2C_MASTER, &addr, 1);
    7.         LPI2C_MasterSend(EXAMPLE_I2C_MASTER, &dat, 1);
    8.         LPI2C_MasterStop(EXAMPLE_I2C_MASTER);
    9. }


    10. void WriteCmd(unsigned char I2C_Command)
    11. {
    12.     I2C_WriteByte(0x00, I2C_Command);
    13. }

    14. void WriteDat(unsigned char I2C_Data)
    15. {
    16.     I2C_WriteByte(0x40, I2C_Data);
    17. }

    18. void OLED_WrCmd(unsigned char IIC_Command)
    19. {
    20.         WriteCmd(IIC_Command);
    21. }

    22. void OLED_Init(void)
    23. {
    24.         SysTick_Delay_ms(100);
    25.         WriteCmd(0xAE); //display off
    26.         WriteCmd(0x20);        //Set Memory Addressing Mode       
    27.         WriteCmd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
    28.         WriteCmd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
    29.         WriteCmd(0xc8);        //Set COM Output Scan Direction
    30.         WriteCmd(0x00); //---set low column address
    31.         WriteCmd(0x10); //---set high column address
    32.         WriteCmd(0x40); //--set start line address
    33.         WriteCmd(0x81); //--set contrast control register
    34.         WriteCmd(0xff); //亮度调节 0x00~0xff
    35.         WriteCmd(0xa1); //--set segment re-map 0 to 127
    36.         WriteCmd(0xa6); //--set normal display
    37.         WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
    38.         WriteCmd(0x3F); //
    39.         WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
    40.         WriteCmd(0xd3); //-set display offset
    41.         WriteCmd(0x00); //-not offset
    42.         WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
    43.         WriteCmd(0xf0); //--set divide ratio
    44.         WriteCmd(0xd9); //--set pre-charge period
    45.         WriteCmd(0x22); //
    46.         WriteCmd(0xda); //--set com pins hardware configuration
    47.         WriteCmd(0x12);
    48.         WriteCmd(0xdb); //--set vcomh
    49.         WriteCmd(0x40); //0x20,0.77xVcc
    50.         WriteCmd(0x8d); //--set DC-DC enable
    51.         WriteCmd(0x14); //
    52.         WriteCmd(0xaf); //--turn on oled panel
    53. }

    54. void OLED_SetPos(unsigned char x, unsigned char y)
    55. {
    56.         WriteCmd(0xb0+y);
    57.         WriteCmd(((x&0xf0)>>4)|0x10);
    58.         WriteCmd((x&0x0f)|0x01);
    59. }

    60. void OLED_Fill(unsigned char fill_Data)//全屏填充
    61. {
    62.         unsigned char m,n;
    63.         for(m=0;m<8;m++)
    64.         {
    65.                 WriteCmd(0xb0+m);                //page0-page1
    66.                 WriteCmd(0x00);                //low column start address
    67.                 WriteCmd(0x10);                //high column start address
    68.                 for(n=0;n<128;n++)
    69.                         {
    70.                                 WriteDat(fill_Data);
    71.                         }
    72.         }
    73. }

    74. void OLED_CLS(void)//清屏
    75. {
    76.         OLED_Fill(0xff);
    77. }

    78. void OLED_ON(void)
    79. {
    80.         WriteCmd(0X8D);  //设置电荷泵
    81.         WriteCmd(0X14);  //开启电荷泵
    82.         WriteCmd(0XAF);  //OLED唤醒
    83. }

    84. void OLED_OFF(void)
    85. {
    86.         WriteCmd(0X8D);  //设置电荷泵
    87.         WriteCmd(0X10);  //关闭电荷泵
    88.         WriteCmd(0XAE);  //OLED休眠
    89. }

    90. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
    91. {
    92.         unsigned char c = 0,i = 0,j = 0;
    93.         switch(TextSize)
    94.         {
    95.                 case 1:
    96.                 {
    97.                         while(ch[j] != '\0')
    98.                         {
    99.                                 c = ch[j] - 32;
    100.                                 if(x > 126)
    101.                                 {
    102.                                         x = 0;
    103.                                         y++;
    104.                                 }
    105.                                 OLED_SetPos(x,y);
    106.                                 for(i=0;i<6;i++)
    107.                                         WriteDat(F6x8[c][i]);
    108.                                 x += 6;
    109.                                 j++;
    110.                         }
    111.                 }break;
    112.                 case 2:
    113.                 {
    114.                         while(ch[j] != '\0')
    115.                         {
    116.                                 c = ch[j] - 32;
    117.                                 if(x > 120)
    118.                                 {
    119.                                         x = 0;
    120.                                         y++;
    121.                                 }
    122.                                 OLED_SetPos(x,y);
    123.                                 for(i=0;i<8;i++)
    124.                                         WriteDat(F8X16[c*16+i]);
    125.                                 OLED_SetPos(x,y+1);
    126.                                 for(i=0;i<8;i++)
    127.                                         WriteDat(F8X16[c*16+i+8]);
    128.                                 x += 8;
    129.                                 j++;
    130.                         }
    131.                 }break;
    132.         }
    133. }

    134. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
    135. {
    136.         unsigned char wm=0;
    137.         unsigned int  adder=32*N;
    138.         OLED_SetPos(x , y);
    139.         for(wm = 0;wm < 16;wm++)
    140.         {
    141.                 WriteDat(F16x16[adder]);
    142.                 adder += 1;
    143.         }
    144.         OLED_SetPos(x,y + 1);
    145.         for(wm = 0;wm < 16;wm++)
    146.         {
    147.                 WriteDat(F16x16[adder]);
    148.                 adder += 1;
    149.         }
    150. }

    151. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
    152. {
    153.         unsigned int j=0;
    154.         unsigned char x,y;

    155.   if(y1%8==0)
    156.                 y = y1/8;
    157.   else
    158.                 y = y1/8 + 1;
    159.         for(y=y0;y<y1;y++)
    160.         {
    161.                 OLED_SetPos(x0,y);
    162.     for(x=x0;x<x1;x++)
    163.                 {
    164.                         WriteDat(BMP[j++]);
    165.                 }
    166.         }
    167. }

    168. void oled_test(void)
    169. {
    170.         OLED_Init();
    171.         OLED_Fill(0x00);
    172.         OLED_ShowStr(0,0,"MCX_N947",2);
    173.         OLED_ShowStr(0,2,"I2C OLED TEST",2);       
    174. }
    复制代码


    2.2、main.c
    1. #include "main.h"

    2. int main(void)
    3. {
    4.     /* Board pin, clock, debug console init */
    5.     /* attach FRO 12M to FLEXCOMM4 (debug console) */
    6.     CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
    7.     CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    8.        
    9.                 /* attach FRO 12M to FLEXCOMM2 */
    10.     CLOCK_SetClkDiv(kCLOCK_DivFlexcom2Clk, 1u);
    11.     CLOCK_AttachClk(kFRO12M_to_FLEXCOMM2);

    12.    

    13.     BOARD_InitPins();
    14.     BOARD_PowerMode_OD();
    15.     BOARD_InitBootClocks();
    16.     BOARD_InitDebugConsole();
    17.        
    18.                 init_led();
    19.                 init_i2c();
    20.                 SysTick_Init();
    21.                 OLED_Init();
    22.                 oled_test();
    23.                
    24.     while (1)
    25.     {
    26.                         led_red_tog();
    27.                         SysTick_Delay_ms(100);
    28.     }
    29. }
    复制代码



    三、程序运行


    下载程序后,复位开发板,OLED显示
    oled.jpg

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 528 天

    连续签到: 23 天

    [LV.9]以坛为家II

    21

    主题

    854

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2317
    最后登录
    2025-7-27
    发表于 2024-1-24 07:38:03 | 显示全部楼层
    66666,分享太精彩了!
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-27 12:24 , Processed in 0.081521 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表