查看: 777|回复: 0

【MCXC444分享】i2c1驱动OLED显示屏

[复制链接]
  • TA的每日心情
    开心
    昨天 21:09
  • 签到天数: 1511 天

    连续签到: 13 天

    [LV.Master]伴坛终老

    152

    主题

    3192

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8761
    最后登录
    2025-9-1
    发表于 2024-11-15 00:13:50 | 显示全部楼层 |阅读模式
    本帖最后由 TLLED 于 2024-11-15 08:07 编辑

    测试i2c1接口驱动OLED显示屏。

    一、硬件接口部分图

    测试用到了I2C1的PTE0和PTE1引脚
    001.png

    二、程序部分

    2.1、oled.c
    1. #include "pin_mux.h"
    2. #include "fsl_debug_console.h"
    3. #include "fsl_i2c.h"
    4. #include "i2c/bsp_i2c.h"
    5. #include "systick/systick.h"
    6. #include "oled/oled.h"
    7. #include "oled/codetab.h"

    8. #define I2C_OLED_BASEADDR                           I2C1
    9. #define I2C_OLED_CLOCK_FREQ                         CLOCK_GetFreq(I2C1_CLK_SRC)


    10. void init_oled(void)
    11. {
    12.         BOARD_I2C1_ReleaseBus();
    13.         init_i2c1_pins();
    14.         I2C_Init(I2C_OLED_BASEADDR, I2C_OLED_CLOCK_FREQ);
    15.         
    16.         OLED_Init();
    17. }

    18. void I2C_WriteByte(uint8_t addr, uint8_t dat)
    19. {
    20.                 I2C_Send(I2C_OLED_BASEADDR, OLED_ADDRESS>>1, addr, 1, &dat, 1);
    21. }


    22. void WriteCmd(unsigned char I2C_Command)
    23. {
    24.     I2C_WriteByte(0x00, I2C_Command);
    25. }

    26. void WriteDat(unsigned char I2C_Data)
    27. {
    28.     I2C_WriteByte(0x40, I2C_Data);
    29. }

    30. void OLED_WrCmd(unsigned char IIC_Command)
    31. {
    32.         WriteCmd(IIC_Command);
    33. }

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

    66. void OLED_SetPos(unsigned char x, unsigned char y)
    67. {
    68.         WriteCmd(0xb0+y);
    69.         WriteCmd(((x&0xf0)>>4)|0x10);
    70.         WriteCmd((x&0x0f)|0x01);
    71. }

    72. void OLED_Fill(unsigned char fill_Data)//全屏填充
    73. {
    74.         unsigned char m,n;
    75.         for(m=0;m<8;m++)
    76.         {
    77.                 WriteCmd(0xb0+m);                //page0-page1
    78.                 WriteCmd(0x00);                //low column start address
    79.                 WriteCmd(0x10);                //high column start address
    80.                 for(n=0;n<128;n++)
    81.                         {
    82.                                 WriteDat(fill_Data);
    83.                         }
    84.         }
    85. }

    86. void OLED_CLS(void)//清屏
    87. {
    88.         OLED_Fill(0xff);
    89. }

    90. void OLED_ON(void)
    91. {
    92.         WriteCmd(0X8D);  //设置电荷泵
    93.         WriteCmd(0X14);  //开启电荷泵
    94.         WriteCmd(0XAF);  //OLED唤醒
    95. }

    96. void OLED_OFF(void)
    97. {
    98.         WriteCmd(0X8D);  //设置电荷泵
    99.         WriteCmd(0X10);  //关闭电荷泵
    100.         WriteCmd(0XAE);  //OLED休眠
    101. }

    102. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
    103. {
    104.         unsigned char c = 0,i = 0,j = 0;
    105.         switch(TextSize)
    106.         {
    107.                 case 1:
    108.                 {
    109.                         while(ch[j] != '\0')
    110.                         {
    111.                                 c = ch[j] - 32;
    112.                                 if(x > 126)
    113.                                 {
    114.                                         x = 0;
    115.                                         y++;
    116.                                 }
    117.                                 OLED_SetPos(x,y);
    118.                                 for(i=0;i<6;i++)
    119.                                         WriteDat(F6x8[c][i]);
    120.                                 x += 6;
    121.                                 j++;
    122.                         }
    123.                 }break;
    124.                 case 2:
    125.                 {
    126.                         while(ch[j] != '\0')
    127.                         {
    128.                                 c = ch[j] - 32;
    129.                                 if(x > 120)
    130.                                 {
    131.                                         x = 0;
    132.                                         y++;
    133.                                 }
    134.                                 OLED_SetPos(x,y);
    135.                                 for(i=0;i<8;i++)
    136.                                         WriteDat(F8X16[c*16+i]);
    137.                                 OLED_SetPos(x,y+1);
    138.                                 for(i=0;i<8;i++)
    139.                                         WriteDat(F8X16[c*16+i+8]);
    140.                                 x += 8;
    141.                                 j++;
    142.                         }
    143.                 }break;
    144.         }
    145. }

    146. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
    147. {
    148.         unsigned char wm=0;
    149.         unsigned int  adder=32*N;
    150.         OLED_SetPos(x , y);
    151.         for(wm = 0;wm < 16;wm++)
    152.         {
    153.                 WriteDat(F16x16[adder]);
    154.                 adder += 1;
    155.         }
    156.         OLED_SetPos(x,y + 1);
    157.         for(wm = 0;wm < 16;wm++)
    158.         {
    159.                 WriteDat(F16x16[adder]);
    160.                 adder += 1;
    161.         }
    162. }

    163. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
    164. {
    165.         unsigned int j=0;
    166.         unsigned char x,y;

    167.   if(y1%8==0)
    168.                 y = y1/8;
    169.   else
    170.                 y = y1/8 + 1;
    171.         for(y=y0;y<y1;y++)
    172.         {
    173.                 OLED_SetPos(x0,y);
    174.     for(x=x0;x<x1;x++)
    175.                 {
    176.                         WriteDat(BMP[j++]);
    177.                 }
    178.         }
    179. }

    180. void oled_test(void)
    181. {
    182.         OLED_Init();
    183.         OLED_Fill(0x00);
    184.         OLED_ShowStr(0,0,"MCX_C444",2);
    185.         OLED_ShowStr(0,2,"I2C OLED TEST",2);        
    186. }
    复制代码

    2.2、oled.h
    1. #ifndef __OLED_I2C_H
    2. #define        __OLED_I2C_H

    3. #define OLED_ADDRESS        0x78

    4. void OLED_Init(void);
    5. void OLED_SetPos(unsigned char x, unsigned char y);
    6. void OLED_Fill(unsigned char fill_Data);
    7. void OLED_CLS(void);
    8. void OLED_ON(void);
    9. void OLED_OFF(void);
    10. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize);
    11. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N);
    12. void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);

    13. void init_oled(void);
    14. void oled_test(void);

    15. #endif
    复制代码

    2.3、main.c
    1. #include "pin_mux.h"
    2. #include "clock_config.h"
    3. #include "board.h"
    4. #include "fsl_debug_console.h"
    5. #include "fsl_gpio.h"
    6. #include "slcd/slcd.h"
    7. #include "led/led.h"
    8. #include "systick/systick.h"
    9. #include "slcd_engine.h"
    10. //#include "key/key.h"
    11. #include "adc/adc.h"
    12. #include "i2c/eeprom.h"
    13. #include "i2c/fxls8974.h"
    14. #include "i2c/at24cxx.h"
    15. #include "oled/oled.h"
    16. #include "fsl_uart.h"
    17. #include "stdio.h"

    18. void init_board(void)
    19. {
    20.         SysTick_Init();
    21.         BOARD_InitPins();
    22.         BOARD_BootClockRUN();
    23.         BOARD_InitDebugConsole();
    24.         init_oled();
    25. }

    26. int main(void)
    27. {
    28.         init_board();
    29.         
    30.         oled_test();
    31.         while (1)
    32.         {
    33.                 SysTick_Delay_ms(1000);
    34.         }
    35. }
    复制代码

    三、程序运行

    下载程序后,OLED显示如下:
    oled.jpg

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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-2 05:53 , Processed in 0.082075 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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