600 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			600 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <EPD_SPI.h>
 | |
| #include "EPD.h"
 | |
| 
 | |
| //Delay Functions
 | |
| void delay_xms(unsigned int xms)
 | |
| {
 | |
|    delay(xms);
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////E-paper demo//////////////////////////////////////////////////////////
 | |
| //Busy function
 | |
| void Epaper_READBUSY(void)
 | |
| { 
 | |
|   while(1)
 | |
|   {  //=1 BUSY
 | |
|      if(isEPD_W21_BUSY==0) break;
 | |
|   }  
 | |
| }
 | |
| //Full screen update initialization
 | |
| void EPD_HW_Init(void)
 | |
| {
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay 
 | |
|   
 | |
|   Epaper_READBUSY();   
 | |
|   EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
|   Epaper_READBUSY();   
 | |
|     
 | |
|   EPD_W21_WriteCMD(0x01); //Driver output control      
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x11); //data entry mode       
 | |
|   EPD_W21_WriteDATA(0x01);
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x44); //set Ram-X address start/end position   
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(EPD_WIDTH/8-1);   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x45); //set Ram-Y address start/end position          
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(0x00); 
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom
 | |
|   EPD_W21_WriteDATA(0x05);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x21); //  Display update control
 | |
|   EPD_W21_WriteDATA(0x00);    
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x4E);   // set RAM x address count to 0;
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteCMD(0x4F);   // set RAM y address count to 0X199;    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);   
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   Epaper_READBUSY();
 | |
|   
 | |
| }
 | |
| //Fast update initialization
 | |
| void EPD_HW_Init_Fast(void)
 | |
| {
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay 
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
|   Epaper_READBUSY();   
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|       
 | |
|   EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
|   EPD_W21_WriteDATA(0xB1);    
 | |
|   EPD_W21_WriteCMD(0x20); 
 | |
|   Epaper_READBUSY();   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x1A); // Write to temperature register
 | |
|   EPD_W21_WriteDATA(0x64);    
 | |
|   EPD_W21_WriteDATA(0x00);  
 | |
|             
 | |
|   EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
|   EPD_W21_WriteDATA(0x91);    
 | |
|   EPD_W21_WriteCMD(0x20); 
 | |
|   Epaper_READBUSY();   
 | |
| }
 | |
| 
 | |
| 
 | |
| //////////////////////////////Display Update Function///////////////////////////////////////////////////////
 | |
| //Full screen update function
 | |
| void EPD_Update(void)
 | |
| {   
 | |
|   EPD_W21_WriteCMD(0x22); //Display Update Control
 | |
|   EPD_W21_WriteDATA(0xF7);   
 | |
|   EPD_W21_WriteCMD(0x20); //Activate Display Update Sequence
 | |
|   Epaper_READBUSY();   
 | |
| 
 | |
| }
 | |
| //Fast update update function
 | |
| void EPD_Update_Fast(void)
 | |
| {   
 | |
|   EPD_W21_WriteCMD(0x22); //Display Update Control
 | |
|   EPD_W21_WriteDATA(0xC7);   
 | |
|   EPD_W21_WriteCMD(0x20); //Activate Display Update Sequence
 | |
|   Epaper_READBUSY();   
 | |
| 
 | |
| }
 | |
| //Partial update function
 | |
| void EPD_Part_Update(void)
 | |
| {
 | |
|   EPD_W21_WriteCMD(0x22); //Display Update Control
 | |
|   EPD_W21_WriteDATA(0xFF);   
 | |
|   EPD_W21_WriteCMD(0x20); //Activate Display Update Sequence
 | |
|   Epaper_READBUSY();      
 | |
| }
 | |
| //////////////////////////////Display Data Transfer Function////////////////////////////////////////////
 | |
| //Full screen update display function
 | |
| void EPD_WhiteScreen_ALL(const unsigned char *datas)
 | |
| {
 | |
|    unsigned int i;  
 | |
|   EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
|   for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    }
 | |
|    EPD_Update();   
 | |
| }
 | |
| //Fast update display function
 | |
| void EPD_WhiteScreen_ALL_Fast(const unsigned char *datas)
 | |
| {
 | |
|    unsigned int i;  
 | |
|   EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
|    for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    } 
 | |
|    
 | |
|    EPD_Update_Fast();  
 | |
| }
 | |
| 
 | |
| //Clear screen display
 | |
| void EPD_WhiteScreen_White(void)
 | |
| {
 | |
|  unsigned int i;
 | |
|  EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
|  for(i=0;i<EPD_ARRAY;i++)
 | |
|  {
 | |
|     EPD_W21_WriteDATA(0xff);
 | |
|   }
 | |
|   EPD_Update();
 | |
| }
 | |
| //Display all black
 | |
| void EPD_WhiteScreen_Black(void)
 | |
| {
 | |
|  unsigned int i;
 | |
|  EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
|  for(i=0;i<EPD_ARRAY;i++)
 | |
|  {
 | |
|     EPD_W21_WriteDATA(0x00);
 | |
|   }
 | |
|   EPD_Update();
 | |
| }
 | |
| //Partial update of background display, this function is necessary, please do not delete it!!!
 | |
| void EPD_SetRAMValue_BaseMap( const unsigned char * datas)
 | |
| {
 | |
|   unsigned int i;     
 | |
|   EPD_W21_WriteCMD(0x24);   //Write Black and White image to RAM
 | |
|   for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    }
 | |
|   EPD_W21_WriteCMD(0x26);   //Write Black and White image to RAM
 | |
|   for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    }
 | |
|    EPD_Update();     
 | |
|    
 | |
| }
 | |
| //Partial update display
 | |
| void EPD_Dis_Part(unsigned int x_start,unsigned int y_start,const unsigned char * datas,unsigned int PART_COLUMN,unsigned int PART_LINE)
 | |
| {
 | |
|   unsigned int i;  
 | |
|   unsigned int x_end,y_end;
 | |
|   
 | |
|   x_start=x_start/8; //x address start
 | |
|   x_end=x_start+PART_LINE/8-1; //x address end
 | |
|   y_start=y_start; //Y address start
 | |
|   y_end=y_start+PART_COLUMN-1; //Y address end
 | |
|   
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay  
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom,
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x44);       // set RAM x address start/end
 | |
|   EPD_W21_WriteDATA(x_start);  //x address start
 | |
|   EPD_W21_WriteDATA(x_end);   //y address end   
 | |
|   EPD_W21_WriteCMD(0x45);    // set RAM y address start/end
 | |
|   EPD_W21_WriteDATA(y_start%256);  //y address start2 
 | |
|   EPD_W21_WriteDATA(y_start/256); //y address start1 
 | |
|   EPD_W21_WriteDATA(y_end%256);  //y address end2 
 | |
|   EPD_W21_WriteDATA(y_end/256); //y address end1   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x4E);        // set RAM x address count to 0;
 | |
|   EPD_W21_WriteDATA(x_start);   //x start address
 | |
|   EPD_W21_WriteCMD(0x4F);      // set RAM y address count to 0X127;    
 | |
|   EPD_W21_WriteDATA(y_start%256);//y address start2
 | |
|   EPD_W21_WriteDATA(y_start/256);//y address start1
 | |
|   
 | |
|   
 | |
|    EPD_W21_WriteCMD(0x24);   //Write Black and White image to RAM
 | |
|    for(i=0;i<PART_COLUMN*PART_LINE/8;i++)
 | |
|    {                         
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    } 
 | |
|    EPD_Part_Update();
 | |
| 
 | |
| }
 | |
| //Full screen partial update display
 | |
| void EPD_Dis_PartAll(const unsigned char * datas)
 | |
| {
 | |
|   unsigned int i;  
 | |
|   unsigned int PART_COLUMN, PART_LINE;
 | |
|   PART_COLUMN=EPD_HEIGHT,PART_LINE=EPD_WIDTH;
 | |
| 
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10); //At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay  
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom,
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
| 
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x24);   //Write Black and White image to RAM
 | |
|    for(i=0;i<PART_COLUMN*PART_LINE/8;i++)
 | |
|    {                         
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    } 
 | |
|    EPD_Part_Update();
 | |
| 
 | |
| }
 | |
| //Deep sleep function
 | |
| void EPD_DeepSleep(void)
 | |
| {   
 | |
|   EPD_W21_WriteCMD(0x10); //Enter deep sleep
 | |
|   EPD_W21_WriteDATA(0x01); 
 | |
|   delay(100);
 | |
| }
 | |
| 
 | |
| //Partial update write address and data
 | |
| void EPD_Dis_Part_RAM(unsigned int x_start,unsigned int y_start,const unsigned char * datas,unsigned int PART_COLUMN,unsigned int PART_LINE)
 | |
| {
 | |
|   unsigned int i;  
 | |
|   unsigned int x_end,y_end;
 | |
|   
 | |
|   x_start=x_start/8; //x address start
 | |
|   x_end=x_start+PART_LINE/8-1; //x address end
 | |
|   
 | |
|   y_start=y_start-1; //Y address start
 | |
|   y_end=y_start+PART_COLUMN-1; //Y address end
 | |
|   
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay  
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom,
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x44);       // set RAM x address start/end
 | |
|   EPD_W21_WriteDATA(x_start);  //x address start
 | |
|   EPD_W21_WriteDATA(x_end);   //y address end   
 | |
|   EPD_W21_WriteCMD(0x45);     // set RAM y address start/end
 | |
|   EPD_W21_WriteDATA(y_start%256);  //y address start2 
 | |
|   EPD_W21_WriteDATA(y_start/256); //y address start1 
 | |
|   EPD_W21_WriteDATA(y_end%256);  //y address end2 
 | |
|   EPD_W21_WriteDATA(y_end/256); //y address end1   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x4E);   // set RAM x address count to 0;
 | |
|   EPD_W21_WriteDATA(x_start);   //x start address
 | |
|   EPD_W21_WriteCMD(0x4F);   // set RAM y address count to 0X127;    
 | |
|   EPD_W21_WriteDATA(y_start%256); //y address start2
 | |
|   EPD_W21_WriteDATA(y_start/256); //y address start1
 | |
|     
 | |
|   EPD_W21_WriteCMD(0x24);   //Write Black and White image to RAM
 | |
|   for(i=0;i<PART_COLUMN*PART_LINE/8;i++)
 | |
|    {                         
 | |
|      EPD_W21_WriteDATA(datas[i]);
 | |
|    } 
 | |
| }
 | |
| //Clock display
 | |
| void EPD_Dis_Part_Time(unsigned int x_startA,unsigned int y_startA,const unsigned char * datasA,
 | |
|                          unsigned int x_startB,unsigned int y_startB,const unsigned char * datasB,
 | |
|                          unsigned int x_startC,unsigned int y_startC,const unsigned char * datasC,
 | |
|                          unsigned int x_startD,unsigned int y_startD,const unsigned char * datasD,
 | |
|                          unsigned int x_startE,unsigned int y_startE,const unsigned char * datasE,
 | |
|                          unsigned int PART_COLUMN,unsigned int PART_LINE
 | |
|                         )
 | |
| {
 | |
|   EPD_Dis_Part_RAM(x_startA,y_startA,datasA,PART_COLUMN,PART_LINE);
 | |
|   EPD_Dis_Part_RAM(x_startB,y_startB,datasB,PART_COLUMN,PART_LINE);
 | |
|   EPD_Dis_Part_RAM(x_startC,y_startC,datasC,PART_COLUMN,PART_LINE);
 | |
|   EPD_Dis_Part_RAM(x_startD,y_startD,datasD,PART_COLUMN,PART_LINE);
 | |
|   EPD_Dis_Part_RAM(x_startE,y_startE,datasE,PART_COLUMN,PART_LINE);
 | |
|   EPD_Part_Update();
 | |
| }                        
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| ////////////////////////////////Other newly added functions////////////////////////////////////////////
 | |
| //Display rotation 180 degrees initialization
 | |
| void EPD_HW_Init_180(void)
 | |
| {
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10); //At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay 
 | |
|   
 | |
|   Epaper_READBUSY();   
 | |
|   EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
|   Epaper_READBUSY();   
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom
 | |
|   EPD_W21_WriteDATA(0x05);
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x01); //Driver output control      
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   EPD_W21_WriteDATA(0x00); 
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x11); //data entry mode       
 | |
|   EPD_W21_WriteDATA(0x02);
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x44); //set Ram-X address start/end position   
 | |
|   EPD_W21_WriteDATA(EPD_WIDTH/8-1);   
 | |
|   EPD_W21_WriteDATA(0x00);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x45); //set Ram-Y address start/end position          
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(0x00); 
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);  
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x21); //  Display update control
 | |
|   EPD_W21_WriteDATA(0x00);    
 | |
|   EPD_W21_WriteDATA(0x00);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x4E);   // set RAM x address count to 0;
 | |
|   EPD_W21_WriteDATA(EPD_WIDTH/8-1);    
 | |
|   EPD_W21_WriteCMD(0x4F);   // set RAM y address count to 0X199;    
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   Epaper_READBUSY();
 | |
| }
 | |
| 
 | |
| 
 | |
| //Fast update 2 initialization
 | |
| void EPD_HW_Init_Fast2(void)
 | |
| {
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay 
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
|   Epaper_READBUSY();   
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|       
 | |
|   EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
|   EPD_W21_WriteDATA(0xB1);    
 | |
|   EPD_W21_WriteCMD(0x20); 
 | |
|   Epaper_READBUSY();   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x1A); // Write to temperature register
 | |
|   EPD_W21_WriteDATA(0x5A);    
 | |
|   EPD_W21_WriteDATA(0x00);  
 | |
|             
 | |
|   EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
|   EPD_W21_WriteDATA(0x91);    
 | |
|   EPD_W21_WriteCMD(0x20); 
 | |
|   Epaper_READBUSY();   
 | |
| }
 | |
| //Fast 2 display
 | |
| void EPD_WhiteScreen_ALL_Fast2(const unsigned char *datas)
 | |
| {
 | |
|   unsigned int i; 
 | |
|   EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
|   for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(*datas);
 | |
|       datas++;
 | |
|    }  
 | |
|   EPD_W21_WriteCMD(0x26);   //write RAM for black(0)/white (1)
 | |
|   for(i=0;i<EPD_ARRAY;i++)
 | |
|    {               
 | |
|      EPD_W21_WriteDATA(0x00);
 | |
|    }   
 | |
|    EPD_Update_Fast();  
 | |
| }
 | |
| // GUI initialization
 | |
| void EPD_HW_Init_GUI(void)
 | |
| {
 | |
|   EPD_W21_RST_0;  // Module reset   
 | |
|   delay(10);//At least 10ms delay 
 | |
|   EPD_W21_RST_1;
 | |
|   delay(10); //At least 10ms delay 
 | |
|   
 | |
|   Epaper_READBUSY();   
 | |
|   EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
|   Epaper_READBUSY();   
 | |
|     
 | |
|   EPD_W21_WriteCMD(0x01); //Driver output control      
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   EPD_W21_WriteDATA(0x01); //mirror
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x11); //data entry mode       
 | |
|   EPD_W21_WriteDATA(0x01);
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x44); //set Ram-X address start/end position   
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(EPD_WIDTH/8-1);   
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x45); //set Ram-Y address start/end position          
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteDATA(0x00); 
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x3C); //BorderWavefrom
 | |
|   EPD_W21_WriteDATA(0x05);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x21); //  Display update control
 | |
|   EPD_W21_WriteDATA(0x00);    
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
|   
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
|   EPD_W21_WriteDATA(0x80);  
 | |
| 
 | |
|   EPD_W21_WriteCMD(0x4E);   // set RAM x address count to 0;
 | |
|   EPD_W21_WriteDATA(0x00);
 | |
|   EPD_W21_WriteCMD(0x4F);   // set RAM y address count to 0X199;    
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)%256);   
 | |
|   EPD_W21_WriteDATA((EPD_HEIGHT-1)/256);
 | |
|   Epaper_READBUSY();
 | |
| 	
 | |
| }
 | |
| 
 | |
| //GUI display
 | |
| void EPD_Display(unsigned char *Image)
 | |
| {
 | |
| 	unsigned int Width, Height,i,j;
 | |
| 	Width = (EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1);
 | |
| 	Height = EPD_HEIGHT;
 | |
| 
 | |
| 	EPD_W21_WriteCMD(0x24);
 | |
| 	for ( j = 0; j < Height; j++) {
 | |
| 			for ( i = 0; i < Width; i++) {
 | |
| 				 EPD_W21_WriteDATA(Image[i + j * Width]);
 | |
| 			}
 | |
| 	}
 | |
| 	EPD_Update();		 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| //4 Gray update initialization
 | |
| void EPD_HW_Init_4G(void)
 | |
| {
 | |
| 	EPD_W21_RST_0;  // Module reset   
 | |
| 	delay_xms(10);//At least 10ms delay 
 | |
| 	EPD_W21_RST_1;
 | |
| 	delay_xms(10); //At least 10ms delay 
 | |
|   
 | |
| 	EPD_W21_WriteCMD(0x12);  //SWRESET
 | |
| 	Epaper_READBUSY();   
 | |
|  	
 | |
|   EPD_W21_WriteCMD(0x18); //Read built-in temperature sensor
 | |
| 	EPD_W21_WriteDATA(0x80);	
 | |
| 	  	
 | |
| 	EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
| 	EPD_W21_WriteDATA(0xB1);		
 | |
|   EPD_W21_WriteCMD(0x20);	
 | |
|   Epaper_READBUSY();   
 | |
| 
 | |
| 	EPD_W21_WriteCMD(0x1A); // Write to temperature register
 | |
| 	EPD_W21_WriteDATA(0x5A);		
 | |
|   EPD_W21_WriteDATA(0x00);	
 | |
| 				  	
 | |
| 	EPD_W21_WriteCMD(0x22); // Load temperature value
 | |
| 	EPD_W21_WriteDATA(0x91);		
 | |
|   EPD_W21_WriteCMD(0x20);	
 | |
| 	Epaper_READBUSY();   
 | |
| }
 | |
| //4 Gray display
 | |
| unsigned char In2bytes_Out1byte_RAM1(unsigned char data1,unsigned char data2)
 | |
| {
 | |
|   unsigned int i; 
 | |
| 	unsigned char TempData1,TempData2;
 | |
| 	unsigned char outdata=0x00;
 | |
| 	TempData1=data1;
 | |
| 	TempData2=data2;
 | |
| 	
 | |
|     for(i=0;i<4;i++)
 | |
|      { 
 | |
|         outdata=outdata<<1;
 | |
|         if( ((TempData1&0xC0)==0xC0) || ((TempData1&0xC0)==0x40))
 | |
|            outdata=outdata|0x01;
 | |
|         else 
 | |
|           outdata=outdata|0x00;
 | |
| 
 | |
|         TempData1=TempData1<<2;
 | |
|      }
 | |
| 
 | |
|     for(i=0;i<4;i++)
 | |
|      { 
 | |
|         outdata=outdata<<1;
 | |
|          if((TempData2&0xC0)==0xC0||(TempData2&0xC0)==0x40)
 | |
|            outdata=outdata|0x01;
 | |
|         else 
 | |
|           outdata=outdata|0x00;
 | |
| 
 | |
|         TempData2=TempData2<<2;
 | |
| 
 | |
|        // delay_us(5) ; 
 | |
|      }
 | |
| 		 return outdata;
 | |
| }
 | |
| unsigned char In2bytes_Out1byte_RAM2(unsigned char data1,unsigned char data2)
 | |
| {
 | |
|   unsigned int i; 
 | |
|   unsigned char TempData1,TempData2;
 | |
| 	unsigned char outdata=0x00;
 | |
| 	TempData1=data1;
 | |
| 	TempData2=data2;
 | |
| 
 | |
| 	for(i=0;i<4;i++)
 | |
| 	{ 
 | |
| 		outdata=outdata<<1;
 | |
| 		if( ((TempData1&0xC0)==0xC0) || ((TempData1&0xC0)==0x80))
 | |
| 			 outdata=outdata|0x01;
 | |
| 		else 
 | |
| 			outdata=outdata|0x00;
 | |
| 
 | |
| 		TempData1=TempData1<<2;
 | |
| 	}
 | |
| 
 | |
| 	for(i=0;i<4;i++)
 | |
| 	{ 
 | |
| 		outdata=outdata<<1;
 | |
| 		 if((TempData2&0xC0)==0xC0||(TempData2&0xC0)==0x80)
 | |
| 			 outdata=outdata|0x01;
 | |
| 		else 
 | |
| 			outdata=outdata|0x00;
 | |
| 
 | |
| 		TempData2=TempData2<<2;
 | |
| 	}
 | |
| 	return outdata;
 | |
| }
 | |
| void EPD_WhiteScreen_ALL_4G(const unsigned char *datas)
 | |
| {
 | |
| 	unsigned int i;
 | |
| 	unsigned char tempOriginal;   
 | |
| 
 | |
| 	EPD_W21_WriteCMD(0x24);   //write RAM for black(0)/white (1)
 | |
| 	for(i=0;i<EPD_ARRAY*2;i+=2)
 | |
| 	{               
 | |
| 		tempOriginal= In2bytes_Out1byte_RAM1( *(datas+i),*(datas+i+1));
 | |
| 		EPD_W21_WriteDATA(~tempOriginal); 
 | |
| 	}
 | |
| 
 | |
| 	EPD_W21_WriteCMD(0x26);   //write RAM for black(0)/white (1)
 | |
| 	for(i=0;i<EPD_ARRAY*2;i+=2)
 | |
| 	{               
 | |
| 		tempOriginal= In2bytes_Out1byte_RAM2( *(datas+i),*(datas+i+1));
 | |
| 		EPD_W21_WriteDATA(~tempOriginal); 
 | |
| 	}
 | |
| 	EPD_Update_Fast();	 
 | |
| }
 | |
| /***********************************************************
 | |
|             end file
 | |
| ***********************************************************/
 | |
| 
 |