#ifndef __MYLCD_H
#define __MYLCD_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

#define MAX_COLUMN_COUNT  192
#define MAX_PAGE_COUNT  12

typedef enum{
    IM_NOMALE = 0,    //
    IM_INVERSE = 1,   //
}inverseMode_te;
typedef enum{
    IMG_SRC_VOLLGO = 0,    //
}imageSrc_te;
typedef enum{
    CMDT_EXT_CMD1 = 0x30,    //
    CMDT_EXT_CMD2 = 0x31,   //
    CMDT_EXT_CMD3 = 0x38,   //
    CMDT_EXT_CMD4 = 0x39,   //
}commandType_te;
typedef enum{
    HORIZONTAL_LEFT = 0x101,    //
    HORIZONTAL_CENTER = 0x102,    //
    HORIZONTAL_RIGHT = 0x103,    //
}displayHorizontalMode_te;
typedef enum{
    VERTICAL_LEFT = 0x101,    //
    VERTICAL_CENTER = 0x102,    //
    VERTICAL_RIGHT = 0x103,    //
}displayVerticalMode_te;
typedef struct 
{
    uint16_t width;
    uint16_t heigth;
    uint8_t *imageSrc;
}imageParams_ts;

/**
 *  ����ָ�� 0 һ��Ҫ���� @CMDT_EXT_CMD1 ��������չָ�� 0
*/
#define LCD_CMD_DISPLAY_ON  0XAF
#define LCD_CMD_DISPLAY_OFF  0XAE
#define LCD_CMD_INVERSE_DISPLAY_ON  0XA7
#define LCD_CMD_INVERSE_DISPLAY_OFF  0XA6
#define LCD_CMD_ALL_PIXEL_ON  0X23
#define LCD_CMD_ALL_PIXEL_OFF  0X22
#define LCD_CMD_DISPLAY_CONTROL  0XCA
            //BYTE1������ CL ����Ƶ�ʣ� CLD=0
            //BYTE2����ձȣ�Duty=128
            //BYTE3��֡����
#define LCD_CMD_POWER_SAVE_OFF  0X94
#define LCD_CMD_POWER_SAVE_ON  0X95
#define LCD_CMD_PAGE_ADDR_SETTING  0X75
            //BYTE1����ʼҳ��ַ,00h�Q YS�Q 28h
            //BYTE2������ҳ��ַ,YS�Q YE�Q 28hÿ 4 ��Ϊ 1 ҳ
#define LCD_CMD_CLUMN_ADDR_SETTING  0X15
            //BYTE1����ʼ�е�ַ 00h�Q XS�Q FFh
            //BYTE2�������е�ַ XS�Q XE�Q FFh
#define LCD_CMD_SCAN_DIRECTION  0XBC
            //BYTE1��0X00��MX��MY=Normal
#define LCD_CMD_WRITE_DISPLAY_DATA  0X5C
            //BYTE1��8 λ��ʾ����
#define LCD_CMD_READ_DISPLAY_DATA  0X5D
            //BYTE1��8 λ��ʾ����
#define LCD_CMD_PARTIAL_DISPLAY  0XA8
            //BYTE1����ʼ�����ַ��00h��PTS��A1h
            //BYTE2�����������ַ��00h��PTE��A1h
#define LCD_CMD_PARTIAL_DISPLAY_OFF  0XA9
#define LCD_CMD_READ_CHANGE_WRITE_ENABLE  0XE0
#define LCD_CMD_READ_CHANGE_WRITE_DISABLE  0XEE
#define LCD_CMD_SCROLL_AREA_DISPLAY  0XAA   //������������
            //BYTE1��TL[7:0]:��ʼ�����ַ
            //BYTE2��BL[7:0]:���������ַ
            //BYTE3��NSL[7:0]:ָ������
            //BYTE4��SCM[1:0]:��ʾģʽ
typedef enum{
    SDM_MODE_CENTER = 0,    //
    SDM_MODE_TOP = 1,    //
    SDM_MODE_BOTTOM = 2,    //
    SDM_MODE_WHOLE = 3,    //
}scrollDisplayMode_te;
#define LCD_CMD_SCROLL_AREA_DISPLAY_INIT  0XAB  //������ʼ��ʼ������
            //BYTE1��00h��SL��A1h
#define LCD_CMD_OSCIL_CIRCUL_ON  0XD1   //���ڲ��񵴵�·
#define LCD_CMD_OSCIL_CIRCUL_OFF  0XD1  //���ڲ��񵴵�·
#define LCD_CMD_POWER_CONTROL  0X20  //��Դ����
            //BYTE1��0X0B�� VB��VF��VR=1
#define LCD_CMD_SET_VOP  0X81  //���öԱȶ�
            //BYTE1��OX26:΢���Աȶ�,��Χ OX00-OXFF
            //BYTE2��OX04:�ֵ��Աȶ�,��Χ OX00-0X07��΢���ٴֵ���˳���ܱ�
#define LCD_CMD_VOP_CONTROL_INC0_04  0XD6  //Һ���ڲ���ѹ����,VOP ÿ������ 0.04V
#define LCD_CMD_VOP_CONTROL_DEC0_04  0XD7  //Һ���ڲ���ѹ����,VOP ÿ����� 0.04V
#define LCD_CMD_READ_REG_VALUE_05  0X7C  //���Ĵ���ֵ Vop[5:0]
#define LCD_CMD_READ_REG_VALUE_68  0X7D  //���Ĵ���ֵ Vop[8:6]
#define LCD_CMD_NOP  0X25  //�ղ���
// #define LCD_CMD_READ_STATUS_REG  0X--  //��״̬�ֽ�
// #define LCD_CMD_READ_STATUS_REG  0X--  //��״̬�ֽ�
#define LCD_CMD_DATA_FORMAT_D7_D0  0X08  //���ݸ�ʽѡ��,���� D7��D0
#define LCD_CMD_DATA_FORMAT_D0_D7  0X0C  //���ݸ�ʽѡ��,���� D0��D7
#define LCD_CMD_DISPLAY_MODE  0XF0  //��ʾģʽ
typedef enum{
    DM_MONO_MODE = 0x10,    //�ڰ�ģʽ
    DM_4GRAY_MODE = 0x11,   //�Ҽ���ģʽ
}displayMode_te;

#define LCD_CMD_ICON_RAM_ENABLE  0X77  //���� ICON RAM
#define LCD_CMD_ICON_RAM_DISABLE  0X76  //���� ICON RAM
#define LCD_CMD_SET_DIVCE_ROLE_MASTER  0X6E  //��ģʽ(ʹ����ģʽ)
#define LCD_CMD_SET_DIVCE_ROLE_SLAVER  0X6F  // ��ģʽ
/**
 *  ����ָ�� 1 һ��Ҫ���� @CMDT_EXT_CMD2 ��������չָ�� 1
*/
#define LCD_CMD_SET_GRAY_LEVEL  0X20
            //BYTE1��
            //...
            //BYTE16��
#define LCD_CMD_SET_LCD_OFFSET_VOL  0X32
            //BYTE1��
            //BYTE2��BE0,BE1,0X01�� ��ѹ����Ƶ��
            //BYTE3��BS0,BS1,BS1,0X02�� ƫѹ�ȣ�BIAS=1/12
#define LCD_CMD_BOOSTER_LEVEL  0X51 //�ڽ���ѹ��������
            //BYTE1��0X7B:10 ��
#define LCD_CMD_VOLTAGE_SELECT_INT  0X41 //LCD �ڲ���ѹ
// #define LCD_CMD_VOLTAGE_SELECT_XXX  0X40 //δ֪
// #define LCD_CMD_AUTO_READ  0XD7 //δ֪
#define LCD_CMD_SET_OTP_RW  0XE0 //����OTP��д
            //BYTE1��0x00,WR/RD=0��ʹ�� OTP ��
            //       0x20,WR/RD=1��ʹ�� OTP д
#define LCD_CMD_SET_OTP_OUT  0XE1 //���� OTP ��
#define LCD_CMD_SET_OTP_WRITE  0XE2 //д OTP
#define LCD_CMD_SET_OTP_READ  0XE3 //�� OTP
#define LCD_CMD_SET_OTP_SELECT  0XE4 //OTP ѡ�����
            //BYTE1��Ctrl=1�� 0xc9�� ��ʹ�� OTP
            //       Ctrl=0�� 0x89�� ʹ�� OTP

void myLCD_init(void);
void myLCD_setSdaMode(GPIOMode_TypeDef GPIO_Mode);
void myLCD_resetLcd(void);
void myLCD_setGrayLevel(uint8_t level_b, uint8_t level_d);
void myLCD_setVop(uint16_t value);

void myLCD_displayDot(int x, int y);
void myLCD_clearFull(void);
void myLCD_displayBlock(int x,int y);
void myLCD_8x16(inverseMode_te inverseMode, int column, int page, char *text);
void myLCD_str8x16(inverseMode_te inverseMode, int column, int page, char *fmt, ...);
void myLCD_16x16(inverseMode_te inverseMode, uint8_t column, uint8_t page, char *text);
void myLCD_displayImage(inverseMode_te inverseMode, int x, int y, imageSrc_te index);
void myLCD_scroll(scrollDisplayMode_te mode, uint8_t startAddr, uint8_t endAddr, uint8_t pages);
void myLCD_scrollLine(uint8_t pages);

int SHT3X_getPresentValue(int *pTemp, int *pHumit, unsigned char decimalPlaces);
#endif