Robot_Bluetooth/App/oled/oled.c

282 lines
7.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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<Length;i++)
{
OLED_ShowChar(Line,Column+i,Number/OLED_Pow(10,Length-i-1)%10+'0');
}
}
/**
* @brief OLED显示数字十进制带符号数
* @param Line 起始行位置范围1~4
* @param Column 起始列位置范围1~16
* @param Number 要显示的数字,范围:-2147483648~2147483647
* @param Length 要显示数字的长度范围1~10
* @retval 无
*/
void OLED_ShowSignedNum(uint8_t Line,uint8_t Column,int32_t Number,uint8_t Length)
{
uint8_t i;
uint32_t Number1;
if(Number>=0)
{
OLED_ShowChar(Line,Column,'+');
Number1=Number;
}
else
{
OLED_ShowChar(Line,Column,'-');
Number1=-Number;
}
for(i=0;i<Length;i++)
{
OLED_ShowChar(Line,Column+i+1,Number1/OLED_Pow(10,Length-i-1)%10+'0');
}
}
/**
* @brief OLED显示数字十六进制正数
* @param Line 起始行位置范围1~4
* @param Column 起始列位置范围1~16
* @param Number 要显示的数字范围0~0xFFFFFFFF
* @param Length 要显示数字的长度范围1~8
* @retval 无
*/
void OLED_ShowHexNum(uint8_t Line,uint8_t Column,uint32_t Number,uint8_t Length)
{
uint8_t i,SingleNumber;
for(i=0;i<Length;i++)
{
SingleNumber=Number/OLED_Pow(16,Length-i-1)%16;
if(SingleNumber<10)
{
OLED_ShowChar(Line,Column+i,SingleNumber+'0');
}
else
{
OLED_ShowChar(Line,Column+i,SingleNumber-10+'A');
}
}
}
/**
* @brief OLED显示数字二进制正数
* @param Line 起始行位置范围1~4
* @param Column 起始列位置范围1~16
* @param Number 要显示的数字范围0~1111 1111 1111 1111
* @param Length 要显示数字的长度范围1~16
* @retval 无
*/
void OLED_ShowBinNum(uint8_t Line,uint8_t Column,uint32_t Number,uint8_t Length)
{
uint8_t i;
for(i=0;i<Length;i++)
{
OLED_ShowChar(Line,Column+i,Number/OLED_Pow(2,Length-i-1)%2+'0');
}
}
/**
* @brief OLED初始化
* @param 无
* @retval 无
*/
void OLED_Init(void)
{
delay_ms(100);
OLED_I2C_Init(); //端口初始化
OLED_WriteCommand(0xAE); //关闭显示
OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8); //设置多路复用率
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3); //设置显示偏移
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40); //设置显示开始行
OLED_WriteCommand(0xA1); //设置左右方向0xA1正常 0xA0左右反置
OLED_WriteCommand(0xC8); //设置上下方向0xC8正常 0xC0上下反置
OLED_WriteCommand(0xDA); //设置COM引脚硬件配置
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81); //设置对比度控制
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9); //设置预充电周期
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4); //设置整个显示打开/关闭
OLED_WriteCommand(0xA6); //设置正常/倒转显示
OLED_WriteCommand(0x8D); //设置充电泵
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF); //开启显示
OLED_Clear(); //OLED清屏
}