技能梳理18@stm32+柔性墨水屏+薄膜按键+二维码
薄膜压力按键控制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 initfull_display(pic_display_white); //pic_whitedriver_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); //pic1else if(yel_b%3 == 2)full_display(pic_display2); //pic2else if(yel_b%3 == 0)full_display(pic_display3); //pic3HAL_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; //128VRES_byte1=0x01; //296VRES_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 startEPD_W21_WriteDATA (0x17); //AEPD_W21_WriteDATA (0x17); //BEPD_W21_WriteDATA (0x17); //C EPD_W21_WriteCMD(0x04); lcd_chkstatus();EPD_W21_WriteCMD(0x00); //panel settingEPD_W21_WriteDATA(0xbf); //LUT from OTP,128x296EPD_W21_WriteDATA(0x0d); //VCOM to 0V fastEPD_W21_WriteCMD(0x30); //PLL settingEPD_W21_WriteDATA (0x3a); // 3a 100HZ 29 150Hz 39 200HZ 31 171HZEPD_W21_WriteCMD(0x61); //resolution settingEPD_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(); //picturelut(); //Power settingsEPD_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 modeEPD_W21_WriteCMD(0x90); //resolution settingEPD_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-endEPD_W21_WriteDATA (0x28); EPD_W21_WriteCMD(0x10); //writes Old data to SRAM for programmingpartial_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 offEPD_W21_WriteCMD(0X07); //deep sleepEPD_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的源代码中
#墨水屏驱动一般厂商会给
#墨水屏小了,二维码会识别不到
#柔性墨水屏尽量向外折,向里面折也会有黑线
完整可运行项目地址
技能梳理18@stm32+柔性墨水屏+薄膜按键+二维码相关推荐
- 77、基于STM32单片机的超市餐饮二维码/条形码摄像头识别结账扫码系统设计
毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序源码 七.资料包括 摘要 二维码识别系统是集数据采集,识别,以及显示 ...
- 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器
技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器 1.项目简介 2.实现逻辑 3.应用场景 #主从机有线控制 #开关操作 4.核心代码梳理 //根据按下的按键执行相应的操作 void h ...
- 基于stm32的墨水屏开发
基于stm32的墨水屏开发 接下来将从以下几个方面介绍 墨水屏原理 墨水屏开发 总结 墨水屏原理 墨水屏在生活中最常见的就是kindle,本质上就是屏幕中存在墨水,通过屏幕芯片将墨水打到不同的位置,从 ...
- 基于MCU的二维码生成及在墨水屏上进行二维码显示
墨水屏相比其他LCD屏幕在低功耗方面有着显著优势,特别适合纽扣电池甚至是无电池的nfc价签的应用场合.价签经常要显示二维码,因此网上找了下找到了一个合适的适合在mcu上进行使用的二维码生成库. Git ...
- openmv和stm32串口通信完成二维码识别
openmv和stm32串口通信完成二维码识别 文章目录 前言 一.所用的硬件: 二.openmv端 2.stm32端 总结 前言 注:我只是个大一的小白,本文只完成基本功能,希望能帮助有困惑的人(我 ...
- STM32开发板动态二维码显示
业务场景需要扫码互动,咨询了小熊派官方,并没有提供案例,之前出厂时屏幕可以显示的二维码只是一个固定图片,显然不适合.到网上找了一些资料,解说的不算完整,不能直接应用.根据这些前人的提醒,自己迁移一份. ...
- 用STC单片机在TFT屏上显示二维码
用STC8A单片机在TFT屏上显示二维码 概述 最近项目需要用单片机在TFT屏上显示二维码,将C++下显示二维码的代码经过改造,移值到C代码的单片机,成功运行,经多次测试能稳定运行,TFT屏显示部分, ...
- 解决Android二维码扫描ZXing竖屏拉伸变长闪退扫描区域小等问题
Android 基于google Zxing实现二维码.条形码扫描,仿微信二维码扫描效果 这篇文章写的不错,但是按照这篇文章使用二维码的话会出现竖屏扫描图像拉伸变长的问题(有一个地方计算错误),解决拉 ...
- IOS手机全屏长按识别二维码HTML代码
代码段作用讲解: 1. 二维码的全屏样式, opacity: 0; 透明样式, touch-callout: none; -webkit-touch-callout: none; -ms-touch- ...
最新文章
- IOT物联网观察之三大运营商物联网发展进入规模商用阶段
- jQuery UI在Server 2008 IE8下DatePicker问题修复
- 数据库 sqlite 进阶
- Windows Azure Cloud Service (41) 修改云服务IIS托管管道模式为4.0经典模式
- 面向对象程序设计——基于JML的地铁系统
- 手把手教你阅读开源代码【附Python开源项目包】
- 单片机驱动DM9000网卡芯片
- 微信官方:刚刚拆散一桩19万元的姻缘
- Ubuntu使用火狐浏览器下载安装AdobeFlashPlayer
- linux uefi iso,支持UEFI启动的GRUB2 ISO光盘镜像的制作
- css hr标签 各种样式
- AMiner论文推荐:
- jieba结巴分词加入自定义词典
- 个人计算机市场排行,2017中国市场50款笔记本电脑排行榜
- 外挂制作之思路总结和基址与偏移量
- Linux常用指令(命令)超级无敌全合集加图文说明
- coffeescript语法入门
- P7 | spur-suppression PLL (TCAS II-2007-08)
- 人工智能chatgpt的国内的稳定镜像
- 在线html5视频播放器,分享10款最棒的免费HTML5视频播放器
热门文章
- 浅谈网络流的基本算法
- “最敬业变脸”值得点赞
- 周期性行业是什么意思_什么是周期性行业及周期性股票
- 感觉还有用,骚年,当你还很弱的时候,此时应该专心练剑。临渊羡鱼,不如退而结网。
- [成都银行网点]交通银行成都网点地址,电话,成都银行分布,位置(总是找不到银行的支行名字,火大!来个全收录,有不对的地方帮忙评论指出哈)
- ssi整合,即spring、springmvc、mybatis终极整合,包括一些优化
- JS canvas绘制进度条
- java veloce 2017_新品速递:JAVA双雄耀世登场
- 资料一下很不错的下载站,有大量的书籍:快乐无极
- 中兴W815/W615无线瘦AP改成家用无线路由器配置方法