#ifndef __OLED_H__
#define __OLED_H__

#include "type.h"

#define OLED_ADDRESS				0x78					/* 设备地址 */
#define OLED_WRITE_CMD_REG  		0x00	                /* 写命令 */
#define OLED_WRITE_DATA_REG 		0x40	                /* 写数据 */

#define OLED_CMD  0	                                        /* 写命令 */
#define OLED_DATA 1	                                        /* 写数据 */

/**
 * @brief OLED初始化函数
 */
void oled_init(void);                                       /* OLED初始化函数 */

/**
 * @brief 设置OLED的显示位置
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 */
void oled_set_pos(uint8_t x, uint8_t y);

/**
 * @brief OLED图片显示
 * 
 * @param  x0	x坐标
 * @param  y0	y坐标
 * @param  x1	y坐标
 * @param  x1	y坐标
 * @param  bmp	显示的数组
 */
void oled_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t bmp[]);

/**
 * @brief 向缓存中写入BMP
 * 
 * @param  x0	x坐标
 * @param  y0	y坐标
 * @param  x1	y坐标
 * @param  x1	y坐标
 * @param  bmp	显示的数组
 */
void oled_buff_show_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t bmp[]); 

/**
 * @brief 开启OLED显示
 */
void oled_display_on(void); 

/**
 * @brief 关闭OLED显示
 */
void oled_display_off(void);

/**
 * @brief OLED缓存清理
 * @attention 追加一条oled_buff_show函数实现清屏
 */
void oled_buff_clear(void); 

/**
 * @brief OLED刷新显示
 */
void oled_buff_show(void);                

/**
 * @brief OLED显示一个8*16字符
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 * @param  asc	字符
 * @param  mode	0-正显	1-返显
 */
void oled_buff_show_char(uint8_t x, uint8_t y, char asc, uint8_t mode);

/**
 * @brief OLED显示汉字
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 * @param  gbk	汉字
 * @param  mode	0-正显	1-返显
 * @attention 数据将会被写入在缓存中，需要追加一条oled_buff_show在OLED上显示
 */
void oled_buff_show_GBK(uint8_t x, uint8_t y, char* gbk, uint8_t mode);

/**
 * @brief OLED显示字符串，汉字字符均可
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 * @param  s	字符串
 * @param  mode	0-正显	1-返显
 * @attention 数据将会被写入在缓存中，需要追加一条oled_buff_show在OLED上显示
 */
void oled_buff_show_string(uint8_t x, uint8_t y, char* s, uint8_t mode);

/**
 * @brief OLED显示整型变量
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 * @param  num	整型变量
 * @param  mode	0-正显	1-返显
 * @attention 数据将会被写入在缓存中，需要追加一条oled_buff_show在OLED上显示
 */
void oled_buff_show_num(uint8_t x, uint8_t y, long num, uint8_t mode);

/**
 * @brief OLED显示两位小数的变量
 * 
 * @param  x	x坐标
 * @param  y	y坐标
 * @param  num	变量
 * @param  mode	0-正显	1-返显
 * @attention 数据将会被写入在缓存中，需要追加一条oled_buff_show在OLED上显示
 */
void oled_buff_show_num02F(uint8_t x, uint8_t y, float num, uint8_t mode);



#endif
