#include "oled.h" #include "OLED_Font.h" /*引脚初始化*/ void OLED_I2C_Init(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD; GPIO_Init(GPIOB,&GPIO_InitStructure); I2C_DeInit(I2C2); I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1=0x30; I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed=400000; I2C_Cmd(I2C2,ENABLE); I2C_Init(I2C2,&I2C_InitStructure); } void OLED_I2C_WriteByte(uint8_t addr,uint8_t data) { while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C2,ENABLE); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C2,OLED_ADDRESS,I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C2,addr); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C2,data); while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C2,ENABLE); } /** * @brief OLED写命令 * @param Command 要写入的命令 * @retval 无 */ void OLED_WriteCommand(uint8_t Command) { OLED_I2C_WriteByte(0x00,Command); } /** * @brief OLED写数据 * @param Data 要写入的数据 * @retval 无 */ void OLED_WriteData(uint8_t Data) { OLED_I2C_WriteByte(0x40,Data); } /** * @brief OLED设置光标位置 * @param Y 以左上角为原点,向下方向的坐标,范围:0~7 * @param X 以左上角为原点,向右方向的坐标,范围:0~127 * @retval 无 */ void OLED_SetCursor(uint8_t Y,uint8_t X) { OLED_WriteCommand(0xB0|Y); //设置Y位置 OLED_WriteCommand(0x10|((X&0xF0)>>4)); //设置X位置高4位 OLED_WriteCommand(0x00|(X&0x0F)); //设置X位置低4位 } /** * @brief OLED清屏 * @param 无 * @retval 无 */ void OLED_Clear(void) { uint8_t i,j; for(j=0;j<8;j++) { OLED_SetCursor(j,0); for(i=0;i<128;i++) { OLED_WriteData(0x00); } } } /** * @brief OLED显示一个字符 * @param Line 行位置,范围:1~4 * @param Column 列位置,范围:1~16 * @param Char 要显示的一个字符,范围:ASCII可见字符 * @retval 无 */ void OLED_ShowChar(uint8_t Line,uint8_t Column,char Char) { uint8_t i; OLED_SetCursor((Line-1)*2,(Column-1)*8); //设置光标位置在上半部分 for(i=0;i<8;i++) { OLED_WriteData(OLED_F8x16[Char-' '][i]); //显示上半部分内容 } OLED_SetCursor((Line-1)*2+1,(Column-1)*8); //设置光标位置在下半部分 for(i=0;i<8;i++) { OLED_WriteData(OLED_F8x16[Char-' '][i+8]); //显示下半部分内容 } } /** * @brief OLED显示字符串 * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串,范围:ASCII可见字符 * @retval 无 */ void OLED_ShowString(uint8_t Line, uint8_t Column, char *String) { uint8_t i; for(i=0;String[i]!='\0';i++) { OLED_ShowChar(Line,Column+i,String[i]); } } void OLED_ShowLineString(uint8_t Line, uint8_t Column, char *String) { uint8_t i; for(i=0;i<16;i++) { OLED_ShowChar(Line,Column+i,String[i]); } } /** * @brief OLED次方函数 * @retval 返回值等于X的Y次方 */ uint32_t OLED_Pow(uint32_t X,uint32_t Y) { uint32_t Result=1; while(Y--) { Result*=X; } return Result; } /** * @brief OLED显示数字(十进制,正数) * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~4294967295 * @param Length 要显示数字的长度,范围:1~10 * @retval 无 */ void OLED_ShowNum(uint8_t Line,uint8_t Column,uint32_t Number,uint8_t Length) { uint8_t i; for(i=0;i=0) { OLED_ShowChar(Line,Column,'+'); Number1=Number; } else { OLED_ShowChar(Line,Column,'-'); Number1=-Number; } for(i=0;i