在线时间897 小时
UID3067179
注册时间2014-10-23
NXP金币2790
TA的每日心情 | 开心 昨天 21:09 |
---|
签到天数: 1511 天 连续签到: 13 天 [LV.Master]伴坛终老
版主
  
- 积分
- 8761
- 最后登录
- 2025-9-1
|
本帖最后由 TLLED 于 2024-11-15 08:07 编辑
测试i2c1接口驱动OLED显示屏。
一、硬件接口部分图
测试用到了I2C1的PTE0和PTE1引脚
二、程序部分
2.1、oled.c
- #include "pin_mux.h"
- #include "fsl_debug_console.h"
- #include "fsl_i2c.h"
- #include "i2c/bsp_i2c.h"
- #include "systick/systick.h"
- #include "oled/oled.h"
- #include "oled/codetab.h"
- #define I2C_OLED_BASEADDR I2C1
- #define I2C_OLED_CLOCK_FREQ CLOCK_GetFreq(I2C1_CLK_SRC)
- void init_oled(void)
- {
- BOARD_I2C1_ReleaseBus();
- init_i2c1_pins();
- I2C_Init(I2C_OLED_BASEADDR, I2C_OLED_CLOCK_FREQ);
-
- OLED_Init();
- }
- void I2C_WriteByte(uint8_t addr, uint8_t dat)
- {
- I2C_Send(I2C_OLED_BASEADDR, OLED_ADDRESS>>1, addr, 1, &dat, 1);
- }
- void WriteCmd(unsigned char I2C_Command)
- {
- I2C_WriteByte(0x00, I2C_Command);
- }
- void WriteDat(unsigned char I2C_Data)
- {
- I2C_WriteByte(0x40, I2C_Data);
- }
- void OLED_WrCmd(unsigned char IIC_Command)
- {
- WriteCmd(IIC_Command);
- }
- void OLED_Init(void)
- {
- SysTick_Delay_ms(100);
- WriteCmd(0xAE); //display off
- WriteCmd(0x20); //Set Memory Addressing Mode
- WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
- WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7
- WriteCmd(0xc8); //Set COM Output Scan Direction
- WriteCmd(0x00); //---set low column address
- WriteCmd(0x10); //---set high column address
- WriteCmd(0x40); //--set start line address
- WriteCmd(0x81); //--set contrast control register
- WriteCmd(0xff); //亮度调节 0x00~0xff
- WriteCmd(0xa1); //--set segment re-map 0 to 127
- WriteCmd(0xa6); //--set normal display
- WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
- WriteCmd(0x3F); //
- WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
- WriteCmd(0xd3); //-set display offset
- WriteCmd(0x00); //-not offset
- WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
- WriteCmd(0xf0); //--set divide ratio
- WriteCmd(0xd9); //--set pre-charge period
- WriteCmd(0x22); //
- WriteCmd(0xda); //--set com pins hardware configuration
- WriteCmd(0x12);
- WriteCmd(0xdb); //--set vcomh
- WriteCmd(0x40); //0x20,0.77xVcc
- WriteCmd(0x8d); //--set DC-DC enable
- WriteCmd(0x14); //
- WriteCmd(0xaf); //--turn on oled panel
- }
- void OLED_SetPos(unsigned char x, unsigned char y)
- {
- WriteCmd(0xb0+y);
- WriteCmd(((x&0xf0)>>4)|0x10);
- WriteCmd((x&0x0f)|0x01);
- }
- void OLED_Fill(unsigned char fill_Data)//全屏填充
- {
- unsigned char m,n;
- for(m=0;m<8;m++)
- {
- WriteCmd(0xb0+m); //page0-page1
- WriteCmd(0x00); //low column start address
- WriteCmd(0x10); //high column start address
- for(n=0;n<128;n++)
- {
- WriteDat(fill_Data);
- }
- }
- }
- void OLED_CLS(void)//清屏
- {
- OLED_Fill(0xff);
- }
- void OLED_ON(void)
- {
- WriteCmd(0X8D); //设置电荷泵
- WriteCmd(0X14); //开启电荷泵
- WriteCmd(0XAF); //OLED唤醒
- }
- void OLED_OFF(void)
- {
- WriteCmd(0X8D); //设置电荷泵
- WriteCmd(0X10); //关闭电荷泵
- WriteCmd(0XAE); //OLED休眠
- }
- void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
- {
- unsigned char c = 0,i = 0,j = 0;
- switch(TextSize)
- {
- case 1:
- {
- while(ch[j] != '\0')
- {
- c = ch[j] - 32;
- if(x > 126)
- {
- x = 0;
- y++;
- }
- OLED_SetPos(x,y);
- for(i=0;i<6;i++)
- WriteDat(F6x8[c][i]);
- x += 6;
- j++;
- }
- }break;
- case 2:
- {
- while(ch[j] != '\0')
- {
- c = ch[j] - 32;
- if(x > 120)
- {
- x = 0;
- y++;
- }
- OLED_SetPos(x,y);
- for(i=0;i<8;i++)
- WriteDat(F8X16[c*16+i]);
- OLED_SetPos(x,y+1);
- for(i=0;i<8;i++)
- WriteDat(F8X16[c*16+i+8]);
- x += 8;
- j++;
- }
- }break;
- }
- }
- void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
- {
- unsigned char wm=0;
- unsigned int adder=32*N;
- OLED_SetPos(x , y);
- for(wm = 0;wm < 16;wm++)
- {
- WriteDat(F16x16[adder]);
- adder += 1;
- }
- OLED_SetPos(x,y + 1);
- for(wm = 0;wm < 16;wm++)
- {
- WriteDat(F16x16[adder]);
- adder += 1;
- }
- }
- void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
- {
- unsigned int j=0;
- unsigned char x,y;
- if(y1%8==0)
- y = y1/8;
- else
- y = y1/8 + 1;
- for(y=y0;y<y1;y++)
- {
- OLED_SetPos(x0,y);
- for(x=x0;x<x1;x++)
- {
- WriteDat(BMP[j++]);
- }
- }
- }
- void oled_test(void)
- {
- OLED_Init();
- OLED_Fill(0x00);
- OLED_ShowStr(0,0,"MCX_C444",2);
- OLED_ShowStr(0,2,"I2C OLED TEST",2);
- }
复制代码
2.2、oled.h
- #ifndef __OLED_I2C_H
- #define __OLED_I2C_H
- #define OLED_ADDRESS 0x78
- void OLED_Init(void);
- void OLED_SetPos(unsigned char x, unsigned char y);
- void OLED_Fill(unsigned char fill_Data);
- void OLED_CLS(void);
- void OLED_ON(void);
- void OLED_OFF(void);
- void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize);
- void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N);
- void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]);
- void init_oled(void);
- void oled_test(void);
- #endif
复制代码
2.3、main.c
- #include "pin_mux.h"
- #include "clock_config.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- #include "fsl_gpio.h"
- #include "slcd/slcd.h"
- #include "led/led.h"
- #include "systick/systick.h"
- #include "slcd_engine.h"
- //#include "key/key.h"
- #include "adc/adc.h"
- #include "i2c/eeprom.h"
- #include "i2c/fxls8974.h"
- #include "i2c/at24cxx.h"
- #include "oled/oled.h"
- #include "fsl_uart.h"
- #include "stdio.h"
- void init_board(void)
- {
- SysTick_Init();
- BOARD_InitPins();
- BOARD_BootClockRUN();
- BOARD_InitDebugConsole();
- init_oled();
- }
- int main(void)
- {
- init_board();
-
- oled_test();
- while (1)
- {
- SysTick_Delay_ms(1000);
- }
- }
复制代码
三、程序运行
下载程序后,OLED显示如下:
|
|