waveshare_epaper

Waveshare e-paper display shenanigans
git clone git://bsandro.tech/waveshare_epaper
Log | Files | Refs | README

EPD_2in13bc.c (9619B)


      1 /*****************************************************************************
      2 * | File      	:   EPD_2in13bc.c
      3 * | Author      :   Waveshare team
      4 * | Function    :   2.13inch e-paper b&c
      5 * | Info        :
      6 *----------------
      7 * |	This version:   V3.0
      8 * | Date        :   2019-06-13
      9 * | Info        :
     10 * -----------------------------------------------------------------------------
     11 * V3.0(2019-06-13):
     12 * 1.Change:
     13 *    EPD_Reset() => EPD_2IN13BC_Reset()
     14 *    EPD_SendCommand() => EPD_2IN13BC_SendCommand()
     15 *    EPD_SendData() => EPD_2IN13BC_SendData()
     16 *    EPD_WaitUntilIdle() => EPD_2IN13BC_ReadBusy()
     17 *    EPD_Init() => EPD_2IN13BC_Init()
     18 *    EPD_Clear() => EPD_2IN13BC_Clear()
     19 *    EPD_Display() => EPD_2IN13BC_Display()
     20 *    EPD_Sleep() => EPD_2IN13BC_Sleep()
     21 * 2.remove commands define:
     22 *    #define PANEL_SETTING                               0x00
     23 *    #define POWER_SETTING                               0x01
     24 *    #define POWER_OFF                                   0x02
     25 *    #define POWER_OFF_SEQUENCE_SETTING                  0x03
     26 *    #define POWER_ON                                    0x04
     27 *    #define POWER_ON_MEASURE                            0x05
     28 *    #define BOOSTER_SOFT_START                          0x06
     29 *    #define DEEP_SLEEP                                  0x07
     30 *    #define DATA_START_TRANSMISSION_1                   0x10
     31 *    #define DATA_STOP                                   0x11
     32 *    #define DISPLAY_REFRESH                             0x12
     33 *    #define DATA_START_TRANSMISSION_2                   0x13
     34 *    #define VCOM_LUT                                    0x20
     35 *    #define W2W_LUT                                     0x21
     36 *    #define B2W_LUT                                     0x22
     37 *    #define W2B_LUT                                     0x23
     38 *    #define B2B_LUT                                     0x24
     39 *    #define PLL_CONTROL                                 0x30
     40 *    #define TEMPERATURE_SENSOR_CALIBRATION              0x40
     41 *    #define TEMPERATURE_SENSOR_SELECTION                0x41
     42 *    #define TEMPERATURE_SENSOR_WRITE                    0x42
     43 *    #define TEMPERATURE_SENSOR_READ                     0x43
     44 *    #define VCOM_AND_DATA_INTERVAL_SETTING              0x50
     45 *    #define LOW_POWER_DETECTION                         0x51
     46 *    #define TCON_SETTING                                0x60
     47 *    #define RESOLUTION_SETTING                          0x61
     48 *    #define GET_STATUS                                  0x71
     49 *    #define AUTO_MEASURE_VCOM                           0x80
     50 *    #define READ_VCOM_VALUE                             0x81
     51 *    #define VCM_DC_SETTING                              0x82
     52 *    #define PARTIAL_WINDOW                              0x90
     53 *    #define PARTIAL_IN                                  0x91
     54 *    #define PARTIAL_OUT                                 0x92
     55 *    #define PROGRAM_MODE                                0xA0
     56 *    #define ACTIVE_PROGRAM                              0xA1
     57 *    #define READ_OTP_DATA                               0xA2
     58 *    #define POWER_SAVING                                0xE3
     59 * V2.0(2018-11-13): 
     60 * 1.Remove:ImageBuff[EPD_HEIGHT * EPD_WIDTH / 8]
     61 * 2.Change:EPD_Display(UBYTE *Image)
     62 *   Need to pass parameters: pointer to cached data
     63 #
     64 # Permission is hereby granted, free of charge, to any person obtaining a copy
     65 # of this software and associated documnetation files (the "Software"), to deal
     66 # in the Software without restriction, including without limitation the rights
     67 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     68 # copies of the Software, and to permit persons to  whom the Software is
     69 # furished to do so, subject to the following conditions:
     70 #
     71 # The above copyright notice and this permission notice shall be included in
     72 # all copies or substantial portions of the Software.
     73 #
     74 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     75 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     76 # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     77 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     78 # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     79 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     80 # THE SOFTWARE.
     81 #
     82 ******************************************************************************/
     83 #include "EPD_2in13bc.h"
     84 #include "Debug.h"
     85 
     86 /******************************************************************************
     87 function :	Software reset
     88 parameter:
     89 ******************************************************************************/
     90 static void EPD_2IN13BC_Reset(void)
     91 {
     92     DEV_Digital_Write(EPD_RST_PIN, 1);
     93     DEV_Delay_ms(200);
     94     DEV_Digital_Write(EPD_RST_PIN, 0);
     95     DEV_Delay_ms(200);
     96     DEV_Digital_Write(EPD_RST_PIN, 1);
     97     DEV_Delay_ms(200);
     98 }
     99 
    100 /******************************************************************************
    101 function :	send command
    102 parameter:
    103      Reg : Command register
    104 ******************************************************************************/
    105 static void EPD_2IN13BC_SendCommand(UBYTE Reg)
    106 {
    107     DEV_Digital_Write(EPD_DC_PIN, 0);
    108     DEV_Digital_Write(EPD_CS_PIN, 0);
    109     DEV_SPI_WriteByte(Reg);
    110     DEV_Digital_Write(EPD_CS_PIN, 1);
    111 }
    112 
    113 /******************************************************************************
    114 function :	send data
    115 parameter:
    116     Data : Write data
    117 ******************************************************************************/
    118 static void EPD_2IN13BC_SendData(UBYTE Data)
    119 {
    120     DEV_Digital_Write(EPD_DC_PIN, 1);
    121     DEV_Digital_Write(EPD_CS_PIN, 0);
    122     DEV_SPI_WriteByte(Data);
    123     DEV_Digital_Write(EPD_CS_PIN, 1);
    124 }
    125 
    126 /******************************************************************************
    127 function :	Wait until the busy_pin goes LOW
    128 parameter:
    129 ******************************************************************************/
    130 void EPD_2IN13BC_ReadBusy(void)
    131 {
    132     Debug("e-Paper busy\r\n");
    133     while(DEV_Digital_Read(EPD_BUSY_PIN) == 0) {
    134         DEV_Delay_ms(100);
    135     }
    136     Debug("e-Paper busy release\r\n");
    137 }
    138 
    139 /******************************************************************************
    140 function :	Turn On Display
    141 parameter:
    142 ******************************************************************************/
    143 static void EPD_2IN13BC_TurnOnDisplay(void)
    144 {
    145     EPD_2IN13BC_SendCommand(0x12);		 //DISPLAY REFRESH
    146     DEV_Delay_ms(10);
    147 
    148     EPD_2IN13BC_ReadBusy();
    149 }
    150 
    151 /******************************************************************************
    152 function :	Initialize the e-Paper register
    153 parameter:
    154 ******************************************************************************/
    155 void EPD_2IN13BC_Init(void)
    156 {
    157     EPD_2IN13BC_Reset();
    158 
    159     EPD_2IN13BC_SendCommand(0x06); // BOOSTER_SOFT_START
    160     EPD_2IN13BC_SendData(0x17);
    161     EPD_2IN13BC_SendData(0x17);
    162     EPD_2IN13BC_SendData(0x17);
    163 	
    164     EPD_2IN13BC_SendCommand(0x04); // POWER_ON
    165     EPD_2IN13BC_ReadBusy();
    166 	
    167     EPD_2IN13BC_SendCommand(0x00); // PANEL_SETTING
    168     EPD_2IN13BC_SendData(0x8F);
    169 	
    170     EPD_2IN13BC_SendCommand(0x50); // VCOM_AND_DATA_INTERVAL_SETTING
    171     EPD_2IN13BC_SendData(0xF0);
    172     EPD_2IN13BC_SendCommand(0x61); // RESOLUTION_SETTING
    173     EPD_2IN13BC_SendData(EPD_2IN13BC_WIDTH); // width: 104
    174     EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT >> 8); // height: 212
    175     EPD_2IN13BC_SendData(EPD_2IN13BC_HEIGHT & 0xFF);
    176 }
    177 
    178 /******************************************************************************
    179 function :	Clear screen
    180 parameter:
    181 ******************************************************************************/
    182 void EPD_2IN13BC_Clear(void)
    183 {
    184     UWORD Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1);
    185     UWORD Height = EPD_2IN13BC_HEIGHT;
    186     
    187     //send black data
    188     EPD_2IN13BC_SendCommand(0x10);
    189     for (UWORD j = 0; j < Height; j++) {
    190         for (UWORD i = 0; i < Width; i++) {
    191             EPD_2IN13BC_SendData(0xFF);
    192         }
    193     }
    194     EPD_2IN13BC_SendCommand(0x92); 
    195 
    196     //send red data
    197     EPD_2IN13BC_SendCommand(0x13);
    198     for (UWORD j = 0; j < Height; j++) {
    199         for (UWORD i = 0; i < Width; i++) {
    200             EPD_2IN13BC_SendData(0xFF);
    201         }
    202     }
    203     EPD_2IN13BC_SendCommand(0x92); 
    204     
    205     EPD_2IN13BC_TurnOnDisplay();
    206 }
    207 
    208 /******************************************************************************
    209 function :	Sends the image buffer in RAM to e-Paper and displays
    210 parameter:
    211 ******************************************************************************/
    212 void EPD_2IN13BC_Display(const UBYTE *blackimage, const UBYTE *ryimage)
    213 {
    214     UWORD Width, Height;
    215     Width = (EPD_2IN13BC_WIDTH % 8 == 0)? (EPD_2IN13BC_WIDTH / 8 ): (EPD_2IN13BC_WIDTH / 8 + 1);
    216     Height = EPD_2IN13BC_HEIGHT;
    217     
    218     EPD_2IN13BC_SendCommand(0x10);
    219     for (UWORD j = 0; j < Height; j++) {
    220         for (UWORD i = 0; i < Width; i++) {
    221             EPD_2IN13BC_SendData(blackimage[i + j * Width]);
    222         }
    223     }
    224     EPD_2IN13BC_SendCommand(0x92); 
    225     
    226     EPD_2IN13BC_SendCommand(0x13);
    227     for (UWORD j = 0; j < Height; j++) {
    228         for (UWORD i = 0; i < Width; i++) {
    229             EPD_2IN13BC_SendData(ryimage[i + j * Width]);
    230         }
    231     }
    232     EPD_2IN13BC_SendCommand(0x92); 
    233     
    234     EPD_2IN13BC_TurnOnDisplay();
    235 }
    236 
    237 /******************************************************************************
    238 function :	Enter sleep mode
    239 parameter:
    240 ******************************************************************************/
    241 void EPD_2IN13BC_Sleep(void)
    242 {
    243     EPD_2IN13BC_SendCommand(0x02); // POWER_OFF
    244     EPD_2IN13BC_ReadBusy();
    245     EPD_2IN13BC_SendCommand(0x07); // DEEP_SLEEP
    246     EPD_2IN13BC_SendData(0xA5); // check code
    247 }