技能梳理18@stm32+柔性墨水屏+薄膜按键+二维码

322 阅读5分钟

薄膜压力按键控制mos开关,切换给柔性墨水屏vcc供电方式,单片机控制vcc切换图像,其中有可以扫描的二维码

1、项目简介

在这里插入图片描述

2、实现逻辑

#有两个薄膜按键,一个控制墨水屏供电方式(其实就是一个继电器),一个切换图像

3、应用场景

#墨水屏手表
#省电墨水屏广告牌

4、核心代码梳理

/* USER CODE BEGIN 0 */
void driver_delay_us(unsigned int xus)
{
	for(;xus>1;xus--);
}

void driver_delay_xms(unsigned long xms)	
{	
    unsigned long i = 0 , j=0;

    for(j=0;j<xms;j++)
	{
        for(i=0; i<256; i++);
    }
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
uint8_t red_a, red_b, yel_a, yel_b;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	HAL_GPIO_WritePin(GPIOB, LOW_GND_Pin, GPIO_PIN_RESET);
  EPD_display_init(); //EPD init
//	full_display(pic_display1); //pic1
//	driver_delay_xms(50000);
//	full_display(pic_display2); //pic2
//	driver_delay_xms(50000);
  EPD_W21_WriteCMD(0X50);
	EPD_W21_WriteDATA(0xf7);	
//	partial_display(0,32,0,64, partial00, partial01); //partial display 0 1
//	driver_delay_xms(10000);
	/******screen clear*****/
  EPD_display_init(); //EPD init
	full_display(pic_display_white); //pic_white
	driver_delay_xms(2000);
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(20);
		if(!HAL_GPIO_ReadPin(GPIOA, RED_BUT_Pin))
			red_a++;
		else 
			red_a = 0;
		
		if(!HAL_GPIO_ReadPin(GPIOA, YEL_BUT_Pin))
			yel_a++;
		else 
			yel_a = 0;
		
		if(red_a==5)
			red_b++;
		if(yel_a==5)
		{
			yel_b++;
			if(yel_b%3 == 1)
				full_display(pic_display1); //pic1
	  	else if(yel_b%3 == 2)
				full_display(pic_display2); //pic2
			else if(yel_b%3 == 0)
				full_display(pic_display3); //pic3
			
			HAL_Delay(500);
		}

		if(red_b%2)
		{
			HAL_GPIO_WritePin(MOS_CTR_GPIO_Port, MOS_CTR_Pin, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
		}
		else 
		{
			HAL_GPIO_WritePin(MOS_CTR_GPIO_Port, MOS_CTR_Pin, GPIO_PIN_SET);
			HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
		}
		
//		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
//		full_display(pic_display1); //pic1
//		HAL_Delay(4000);
//		full_display(pic_display2); //pic2	
//		deep_sleep(); //Enter deep sleep modes
  }
  /* USER CODE END 3 */
}

///extern function/

/***************** full screen display picture*************************/
void pic_display_white(void)
{
	unsigned int i;
		EPD_W21_WriteCMD(0x10);
		for(i=0;i<4736;i++)	     
		{
				EPD_W21_WriteDATA(0x00);  
		}  
		driver_delay_xms(2);

		EPD_W21_WriteCMD(0x13);
		for(i=0;i<4736;i++)	     
		{
				EPD_W21_WriteDATA(0xff);  
		}  
		driver_delay_xms(2);		 
}
void pic_display1(void)
{
	unsigned int i;
		EPD_W21_WriteCMD(0x10);
		for(i=0;i<4736;i++)	     
		{
				EPD_W21_WriteDATA(0x00);  
		}  
		driver_delay_xms(2);

		EPD_W21_WriteCMD(0x13);
		for(i=0;i<4736;i++)	     
		{
				EPD_W21_WriteDATA(gImage_1[i]);  
		}  
		driver_delay_xms(2);	 	 
}

void pic_display2(void)
{
	unsigned int i;
	EPD_W21_WriteCMD(0x10);
	for(i=0;i<4736;i++)	     
	{
		EPD_W21_WriteDATA(0x00);  
	}  

	EPD_W21_WriteCMD(0x13);	  	
	for(i=0;i<4736;i++)	     
	{
   EPD_W21_WriteDATA(gImage_2[i]);  

	}  
}

void pic_display3(void)
{
	unsigned int i;
	EPD_W21_WriteCMD(0x10);
	for(i=0;i<4736;i++)	     
	{
		EPD_W21_WriteDATA(0x00);  
	}  

	EPD_W21_WriteCMD(0x13);	  	
	for(i=0;i<4736;i++)	     
	{
   EPD_W21_WriteDATA(gImage_3[i]);  

	}  
}


/***************** partial full screen display picture*************************/
void partial_full00(void)
{
	unsigned int i;
	for(i=0;i<4736;i++)	     
	{
			EPD_W21_WriteDATA(0x00);  
	}  
}
void partial_full01(void)
{
	unsigned int i;
	for(i=0;i<4736;i++)	     
	{
			EPD_W21_WriteDATA(~gImage_1[i]);  
	}  
}
void partial_full02(void)
{
	unsigned int i;
	for(i=0;i<4736;i++)	     
	{
			EPD_W21_WriteDATA(~gImage_2[i]);  
	}  
}
void partial_full03(void)
{
	unsigned int i;
	for(i=0;i<4736;i++)	     
	{
			EPD_W21_WriteDATA(~gImage_3[i]);  
	}  
}

/***************** partial display 0~9 picture*************************/
void partial00(void)
{
	unsigned int i;
	for(i=0;i<256;i++)	     
	{
			EPD_W21_WriteDATA(0x00);  
	}  
}

void partial01(void)
{
	unsigned int i;

		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num1[i]);
			driver_delay_xms(2);  
			}	
	}
void partial02(void)
{
  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num2[i]);
			driver_delay_xms(2);  
			}	
	}
void partial03(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num3[i]);
			driver_delay_xms(2);  
			}	
	}
void partial04(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num4[i]);
			driver_delay_xms(2);  
			}	
	}
void partial05(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num5[i]);
			driver_delay_xms(2);  
			}	
	}
void partial06(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num6[i]);
			driver_delay_xms(2);  
			}	
	}
void partial07(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num7[i]);
			driver_delay_xms(2);  
			}	
	}
void partial08(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num8[i]);
			driver_delay_xms(2);  
			}	
	}
void partial09(void)
{
	  unsigned int i;
		for(i=0;i<256;i++)	     
			{
			EPD_W21_WriteDATA (~gImage_num9[i]);
			driver_delay_xms(2);  
			}	
	}
/*************************EPD display init function******************************************************/
void EPD_display_init(void)
{
	  HRES=0x80;						//128
	  VRES_byte1=0x01;			//296
	  VRES_byte2=0x28;
	  EPD_W21_Init();
		EPD_W21_WriteCMD(0x01);			//POWER SETTING 
		EPD_W21_WriteDATA (0x03);	          
		EPD_W21_WriteDATA (0x00);
		EPD_W21_WriteDATA (0x2b);
		EPD_W21_WriteDATA (0x2b);
		EPD_W21_WriteDATA (0x03);

		EPD_W21_WriteCMD(0x06);         //boost soft start
		EPD_W21_WriteDATA (0x17);		//A
		EPD_W21_WriteDATA (0x17);		//B
		EPD_W21_WriteDATA (0x17);		//C       

		EPD_W21_WriteCMD(0x04);  
		lcd_chkstatus();

		EPD_W21_WriteCMD(0x00);			//panel setting
		EPD_W21_WriteDATA(0xbf);		//LUT from OTP,128x296
		EPD_W21_WriteDATA(0x0d);		//VCOM to 0V fast
		
		EPD_W21_WriteCMD(0x30);			//PLL setting
    EPD_W21_WriteDATA (0x3a);   // 3a 100HZ   29 150Hz 39 200HZ	31 171HZ

		EPD_W21_WriteCMD(0x61);			//resolution setting
		EPD_W21_WriteDATA (HRES);        	 
		EPD_W21_WriteDATA (VRES_byte1);		
		EPD_W21_WriteDATA (VRES_byte2);
		
		EPD_W21_WriteCMD(0x82);			//vcom_DC setting  	
    EPD_W21_WriteDATA (0x28);	

		EPD_W21_WriteCMD(0X50);			//VCOM AND DATA INTERVAL SETTING			
		EPD_W21_WriteDATA(0x97);		//WBmode:VBDF 17|D7 VBDW 97 VBDB 57		WBRmode:VBDF F7 VBDW 77 VBDB 37  VBDR B7
	}
/***************************full display function*************************************/
void full_display(void pic_display(void))
{
		pic_display(); //picture
		lut(); //Power settings
		EPD_W21_WriteCMD(0x12);			//DISPLAY REFRESH 	
		driver_delay_xms(100);	    //!!!The delay here is necessary, 200uS at least!!!     
		lcd_chkstatus();
}

/***************************partial display function*************************************/

void partial_display(uint16_t x_start,uint16_t x_end,uint16_t y_start,uint16_t y_end ,void partial_old(void),void partial_new(void)) //partial display
{
	  EPD_W21_WriteCMD(0x82);			//vcom_DC setting  	
    EPD_W21_WriteDATA (0x08);	
		EPD_W21_WriteCMD(0X50);
		EPD_W21_WriteDATA(0x47);		
		lut1();
	  EPD_W21_WriteCMD(0x91);		//This command makes the display enter partial mode
		EPD_W21_WriteCMD(0x90);		//resolution setting
		EPD_W21_WriteDATA (x_start);   //x-start     
		EPD_W21_WriteDATA (x_end-1);	 //x-end	

		EPD_W21_WriteDATA (y_start/256);
		EPD_W21_WriteDATA (y_start%256);   //y-start    
		
		EPD_W21_WriteDATA (y_end/256);		
		EPD_W21_WriteDATA (y_end%256-1);  //y-end
		EPD_W21_WriteDATA (0x28);	

		EPD_W21_WriteCMD(0x10);	       //writes Old data to SRAM for programming
		partial_old();
		EPD_W21_WriteCMD(0x13);				 //writes New data to SRAM.
		partial_new();
    	
		EPD_W21_WriteCMD(0x12);		 //DISPLAY REFRESH 		             
		driver_delay_xms(10);     //!!!The delay here is necessary, 200uS at least!!!     
		lcd_chkstatus();
	  
}
/Enter deep sleep mode
void deep_sleep(void) //Enter deep sleep mode
{
		EPD_W21_WriteCMD(0X50);
		EPD_W21_WriteDATA(0xf7);	
		EPD_W21_WriteCMD(0X02);  	//power off
		EPD_W21_WriteCMD(0X07);  	//deep sleep
		EPD_W21_WriteDATA(0xA5);
}

//LUT download
void lut(void)
{
	unsigned int count;
	EPD_W21_WriteCMD(0x20);
	for(count=0;count<44;count++)	     
		{EPD_W21_WriteDATA(lut_vcomDC[count]);}

	EPD_W21_WriteCMD(0x21);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_ww[count]);}   
	
	EPD_W21_WriteCMD(0x22);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_bw[count]);} 

	EPD_W21_WriteCMD(0x23);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_wb[count]);} 

	EPD_W21_WriteCMD(0x24);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_bb[count]);} 
}

void lut1(void)
{
	unsigned int count;
	EPD_W21_WriteCMD(0x20);
	for(count=0;count<44;count++)	     
		{EPD_W21_WriteDATA(lut_vcom1[count]);}

	EPD_W21_WriteCMD(0x21);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_ww1[count]);}   
	
	EPD_W21_WriteCMD(0x22);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_bw1[count]);} 

	EPD_W21_WriteCMD(0x23);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_wb1[count]);} 

	EPD_W21_WriteCMD(0x24);
	for(count=0;count<42;count++)	     
		{EPD_W21_WriteDATA(lut_bb1[count]);}   
}

//Detection busy
void lcd_chkstatus(void)
{
	unsigned char busy;
	do
	{
		EPD_W21_WriteCMD(0x71);
		busy = isEPD_W21_BUSY;
		busy =!(busy & 0x01);        
	}
	while(busy);   
	driver_delay_xms(200);                       
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	static uint8_t red, yel;
	driver_delay_xms(200);
  
}

5、部分参考资料

在这里插入图片描述

在这里插入图片描述

6、注意事项

#墨水屏是3V供电,相关的接线逻辑见资料包
#需要使用工具将图片转换为源文件格式放到stm32的源代码中
#墨水屏驱动一般厂商会给
#墨水屏小了,二维码会识别不到
#柔性墨水屏尽量向外折,向里面折也会有黑线

完整可运行项目地址