188 lines
4.4 KiB
C
188 lines
4.4 KiB
C
#include "oled.h"
|
||
#include "i2c.h"
|
||
#include "oledfont.h" //头文件
|
||
|
||
uint8_t CMD_Data[] = {
|
||
0xAE,
|
||
0x00,
|
||
0x10,
|
||
0x40,
|
||
0xB0,
|
||
0x81,
|
||
0xFF,
|
||
0xA1,
|
||
0xA6,
|
||
0xA8,
|
||
0x3F,
|
||
0xC8,
|
||
0xD3,
|
||
0x00,
|
||
0xD5,
|
||
0x80,
|
||
0xD8,
|
||
0x05,
|
||
0xD9,
|
||
0xF1,
|
||
0xDA,
|
||
0x12,
|
||
0xD8,
|
||
0x30,
|
||
0x8D,
|
||
0x14,
|
||
0xAF
|
||
}; //初始化命令
|
||
|
||
|
||
void WriteCmd(void) {
|
||
uint8_t i = 0;
|
||
for (i = 0; i < 27; i++) {
|
||
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00,I2C_MEMADD_SIZE_8BIT, CMD_Data + i, 1, 0x100);
|
||
}
|
||
}
|
||
|
||
//向设备写控制命令
|
||
void OLED_WR_CMD(uint8_t cmd) {
|
||
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00,I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0x100);
|
||
}
|
||
|
||
//向设备写数据
|
||
void OLED_WR_DATA(uint8_t data) {
|
||
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40,I2C_MEMADD_SIZE_8BIT, &data, 1, 0x100);
|
||
}
|
||
|
||
//初始化oled屏幕
|
||
void OLED_Init(void) {
|
||
HAL_Delay(200);
|
||
|
||
WriteCmd();
|
||
}
|
||
|
||
//清屏
|
||
void OLED_Clear(void) {
|
||
uint8_t i, n;
|
||
for (i = 0; i < 8; i++) {
|
||
OLED_WR_CMD(0xb0 + i); //设置页地址(0~7)
|
||
OLED_WR_CMD(0x00); //设置显示位置—列低地址
|
||
OLED_WR_CMD(0x10); //设置显示位置—列高地址
|
||
for (n = 0; n < 128; n++)
|
||
OLED_WR_DATA(0); //更新显示
|
||
}
|
||
}
|
||
|
||
//开启OLED显示
|
||
void OLED_Display_On(void) {
|
||
OLED_WR_CMD(0X8D); //SET DCDC命令
|
||
OLED_WR_CMD(0X14); //DCDC ON
|
||
OLED_WR_CMD(0XAF); //DISPLAY ON
|
||
}
|
||
|
||
//关闭OLED显示
|
||
void OLED_Display_Off(void) {
|
||
OLED_WR_CMD(0X8D); //SET DCDC命令
|
||
OLED_WR_CMD(0X10); //DCDC OFF
|
||
OLED_WR_CMD(0XAE); //DISPLAY OFF
|
||
}
|
||
|
||
//坐标设置
|
||
void OLED_Set_Pos(uint8_t x, uint8_t y) {
|
||
OLED_WR_CMD(0xb0 + y);
|
||
OLED_WR_CMD(((x & 0xf0) >> 4) | 0x10);
|
||
OLED_WR_CMD(x & 0x0f);
|
||
}
|
||
|
||
void OLED_On(void) {
|
||
uint8_t i, n;
|
||
for (i = 0; i < 8; i++) {
|
||
OLED_WR_CMD(0xb0 + i); //设置页地址(0~7)
|
||
OLED_WR_CMD(0x00); //设置显示位置—列低地址
|
||
OLED_WR_CMD(0x10); //设置显示位置—列高地址
|
||
for (n = 0; n < 128; n++)
|
||
OLED_WR_DATA(1);
|
||
} //更新显示
|
||
}
|
||
|
||
unsigned int oled_pow(uint8_t m, uint8_t n) {
|
||
unsigned int result = 1;
|
||
while (n--)result *= m;
|
||
return result;
|
||
}
|
||
|
||
//显示2个数字
|
||
//x,y :起点坐标
|
||
//len :数字的位数
|
||
//size:字体大小
|
||
//mode:模式 0,填充模式;1,叠加模式
|
||
//num:数值(0~4294967295);
|
||
void OLED_ShowNum(uint8_t x, uint8_t y, unsigned int num, uint8_t len, uint8_t size2) {
|
||
uint8_t t, temp;
|
||
uint8_t enshow = 0;
|
||
for (t = 0; t < len; t++) {
|
||
temp = (num / oled_pow(10, len - t - 1)) % 10;
|
||
if (enshow == 0 && t < (len - 1)) {
|
||
if (temp == 0) {
|
||
OLED_ShowChar(x + (size2 / 2) * t, y, ' ', size2);
|
||
continue;
|
||
} else enshow = 1;
|
||
}
|
||
OLED_ShowChar(x + (size2 / 2) * t, y, temp + '0', size2);
|
||
}
|
||
}
|
||
|
||
//在指定位置显示一个字符,包括部分字符
|
||
//x:0~127
|
||
//y:0~63
|
||
//mode:0,反白显示;1,正常显示
|
||
//size:选择字体 16/12
|
||
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size) {
|
||
unsigned char c = 0, i = 0;
|
||
c = chr - ' '; //得到偏移后的值
|
||
if (x > 128 - 1) {
|
||
x = 0;
|
||
y = y + 2;
|
||
}
|
||
if (Char_Size == 16) {
|
||
OLED_Set_Pos(x, y);
|
||
for (i = 0; i < 8; i++)
|
||
OLED_WR_DATA(F8X16[c * 16 + i]);
|
||
OLED_Set_Pos(x, y + 1);
|
||
for (i = 0; i < 8; i++)
|
||
OLED_WR_DATA(F8X16[c * 16 + i + 8]);
|
||
} else {
|
||
OLED_Set_Pos(x, y);
|
||
for (i = 0; i < 6; i++)
|
||
OLED_WR_DATA(F6x8[c][i]);
|
||
}
|
||
}
|
||
|
||
//显示一个字符号串
|
||
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size) {
|
||
unsigned char j = 0;
|
||
while (chr[j] != '\0') {
|
||
OLED_ShowChar(x, y, chr[j], Char_Size); //一次显示一个字符
|
||
x += 8;
|
||
if (x > 120) {
|
||
x = 0;
|
||
y += 2;
|
||
}
|
||
j++;
|
||
}
|
||
}
|
||
|
||
//显示汉字
|
||
//hzk 用取模软件得出的数组
|
||
void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t no) {
|
||
uint8_t t, adder = 0;
|
||
//定位(0xbx,x为第几行。0x1x ,x为列地址 高四位;0x0x,x为列地址第4位。
|
||
//比如你想定 位到第3行,第126(0x7e)列,就要写WrCmd(0xb3);WrCmd(0x17);WrCmd(0x0e);)
|
||
OLED_Set_Pos(x, y);
|
||
for (t = 0; t < 16; t++) {
|
||
OLED_WR_DATA(Hzk[2 * no][t]);
|
||
adder += 1;
|
||
}
|
||
OLED_Set_Pos(x, y + 1);
|
||
for (t = 0; t < 16; t++) {
|
||
OLED_WR_DATA(Hzk[2 * no + 1][t]);
|
||
adder += 1;
|
||
}
|
||
}
|