From 1105733dc07562240bd061a1d8b0869c8c596805 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Thu, 09 Oct 2025 00:41:09 +0800 Subject: [PATCH] ISL1208 RTC示例程序 --- Core/Src/board/hal_oled.c | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 280 insertions(+), 0 deletions(-) diff --git a/Core/Src/board/hal_oled.c b/Core/Src/board/hal_oled.c new file mode 100644 index 0000000..8f666d0 --- /dev/null +++ b/Core/Src/board/hal_oled.c @@ -0,0 +1,280 @@ +/********************************************************************** +* Copyright: (C)2021 LingYun IoT System Studio <www.weike-iot.com> +* Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292 +* Description: ISKBoard OLED(N091-2832TSWFG02-H14, 128x32) driver +* +* ChangeLog: +* Version Date Author Description +* V1.0.0 2021.08.10 GuoWenxue Release initial version +***********************************************************************/ + +#include "hal_oled.h" + +#define mdelay(ms) HAL_Delay(ms) + +enum +{ + OLED_CMD = 0, + OLED_DATA, +}; + +static void IIC_Write_Command(uint8_t command) +{ + /* Send I2C start signal */ + I2C_StartCondition(); + + /* Send OLED I2C slave write address */ + I2C_SendAddress(I2C_WR); + + /* send command value */ + I2C_WriteByte(0x00); + I2C_WriteByte(command); + + /* Send I2C stop signal */ + I2C_StopCondition(); +} + +static void IIC_Write_Data(uint8_t data) +{ + /* Send I2C start signal */ + I2C_StartCondition(); + + /* Send OLED I2C slave write address */ + I2C_SendAddress(I2C_WR); + + /* send data value */ + I2C_WriteByte(0x40); + I2C_WriteByte(data); + + /* Send I2C stop signal */ + I2C_StopCondition(); +} + + + /* OLED write a byte command data or command */ +void OLED_WR_Byte(uint8_t data, uint8_t type) +{ + if( OLED_CMD==type ) + { + IIC_Write_Command(data); + } + else + { + IIC_Write_Data(data); + } +} + +/* + *+-------------------------------------------------+ + *| OLED initial/control function API | + *+-------------------------------------------------+ + */ + +/* Turn OLED display onʾ */ +void OLED_Display_On(void) +{ + OLED_WR_Byte(0X8D, OLED_CMD); //SET DCDC command + OLED_WR_Byte(0X14, OLED_CMD); //DCDC ON + OLED_WR_Byte(0XAF, OLED_CMD); //DISPLAY ON +} + +/* Turn OLED display off */ +void OLED_Display_Off(void) +{ + OLED_WR_Byte(0X8D, OLED_CMD); //SET DCDC command + OLED_WR_Byte(0X10, OLED_CMD); //DCDC OFF + OLED_WR_Byte(0XAE, OLED_CMD); //DISPLAY OFF +} + +/* Clear OLED, it will be black */ +void OLED_Clear(void) +{ + uint8_t i, j; + + /* update display */ + for(i=0;i<8;i++) + { + OLED_WR_Byte (0xb0+i, OLED_CMD); // set page address: 0~7 + OLED_WR_Byte (0x00, OLED_CMD); // set display address, column address lower bytes;ַ + OLED_WR_Byte (0x10, OLED_CMD); // set display address, column address higher bytes; + + for(j=0; j<128; j++) + OLED_WR_Byte(0, OLED_DATA); + } + + OLED_Set_Pos(0, 0); +} + +void OLED_On(void) +{ + uint8_t i, j; + + /* update display */ + for(i=0; i<8; i++) + { + OLED_WR_Byte (0xb0+i, OLED_CMD); // set page address: 0~7 + OLED_WR_Byte (0x00, OLED_CMD); // set display address, row address lower bytes;ַ + OLED_WR_Byte (0x10, OLED_CMD); // set display address, row address higher bytes; + + for(j=0; j<128; j++) + OLED_WR_Byte(1, OLED_DATA); + } +} + +void OLED_Init(void) +{ + if( i2c_lock(OLED_CHIPADDR) ) + { + return ; + } + + mdelay(10); + + OLED_WR_Byte(0xAE,OLED_CMD); // Disable + + OLED_WR_Byte(0x40,OLED_CMD); //---set low column address + OLED_WR_Byte(0xB0,OLED_CMD); //---set high column address + + OLED_WR_Byte(0xC8,OLED_CMD); + + OLED_WR_Byte(0x81,OLED_CMD); + OLED_WR_Byte(0xff,OLED_CMD); + + OLED_WR_Byte(0xa1,OLED_CMD); + + OLED_WR_Byte(0xa6,OLED_CMD); + + OLED_WR_Byte(0xa8,OLED_CMD); + OLED_WR_Byte(0x1f,OLED_CMD); + + OLED_WR_Byte(0xd3,OLED_CMD); + OLED_WR_Byte(0x00,OLED_CMD); + + OLED_WR_Byte(0xd5,OLED_CMD); + OLED_WR_Byte(0xf0,OLED_CMD); + + OLED_WR_Byte(0xd9,OLED_CMD); + OLED_WR_Byte(0x22,OLED_CMD); + + OLED_WR_Byte(0xda,OLED_CMD); + OLED_WR_Byte(0x02,OLED_CMD); + + OLED_WR_Byte(0xdb,OLED_CMD); + OLED_WR_Byte(0x49,OLED_CMD); + + OLED_WR_Byte(0x8d,OLED_CMD); + OLED_WR_Byte(0x14,OLED_CMD); + + OLED_WR_Byte(0xaf,OLED_CMD); + + OLED_Clear(); +} + +/* + *+-------------------------------------------------+ + *| OLED display function API | + *+-------------------------------------------------+ + */ + +/* set OLED display position */ +void OLED_Set_Pos(uint8_t x, uint8_t y) +{ + OLED_WR_Byte(0xb0+y, OLED_CMD); + OLED_WR_Byte(((x&0xf0)>>4)|0x10, OLED_CMD); + OLED_WR_Byte((x&0x0f), OLED_CMD); +} + +/* show a character on OLED as $Char_Size */ +void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t char_Size) +{ + uint8_t c=0,i=0; + + c=chr-' '; // get offset value + + if( x>X_WIDTH-1 ) + { + x=0; + y=y+2; + } + + if(char_Size ==16) + { + OLED_Set_Pos(x,y); + + for(i=0; i<8; i++) + OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); + + OLED_Set_Pos(x,y+1); + + for(i=0;i<8;i++) + OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); + } + else + { + OLED_Set_Pos(x,y); + for(i=0;i<6;i++) + OLED_WR_Byte(F6x8[c][i],OLED_DATA); + } +} + +/* show a string on OLED */ +void OLED_ShowString(uint8_t x, uint8_t y, char *chr, uint8_t font_size) +{ + uint8_t j=0; + + while( chr[j]!='\0' ) + { + OLED_ShowChar(x, y, chr[j], font_size); + + x+=8; + + if(x>120) + { + x=0; + y+=2; + } + + j++; + } +} + +/* Show Chinese on OLED */ +void OLED_ShowChinese(const uint8_t (*Hzk)[32], uint8_t x, uint8_t y, uint8_t number) +{ + uint8_t t,adder=0; + + OLED_Set_Pos(x, y); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk[2*number][t],OLED_DATA); + adder+=1; + } + + OLED_Set_Pos(x,y+1); + for(t=0;t<16;t++) + { + OLED_WR_Byte(Hzk[2*number+1][t],OLED_DATA); + adder+=1; + } +} + +/* Show BMP images(32) on OLED, x: 0~127 y:0~7 */ +void OLED_DrawBMP(uint8_t x0, uint8_t y0, uint8_t x_width, uint8_t y_width, const uint8_t *bmp) +{ + uint32_t j=0; + uint8_t x,y; + + if( y_width%8==0 ) + y = y_width/8; + else + y = y_width/8+1; + + for(y=y0; y<y_width; y++) + { + OLED_Set_Pos(x0, y); + for(x=x0; x<x_width; x++) + { + OLED_WR_Byte(bmp[j++],OLED_DATA); + } + } +} -- Gitblit v1.9.1