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;
 | 
						||
    }
 | 
						||
}
 |