薄膜压力按键控制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的源代码中
#墨水屏驱动一般厂商会给
#墨水屏小了,二维码会识别不到
#柔性墨水屏尽量向外折,向里面折也会有黑线