用RP2040-Touch-LCD-1.28制作一个手表

博主使用自带液晶显示屏的开发板制作设定时间的电子表,分享了开发过程。包括开发板库下载体验,调试时遇到烧录问题及解决办法,还对LCD函数进行研究并解决冲突、变量类型、延时等问题,最后介绍了手表基本功能及后续优化方向。

买了个自带液晶显示屏的开发板,很好玩。
在这里插入图片描述
这是广告图片效果。
在这里插入图片描述
这是我改程序改出来的效果。

参考链接
https://www.waveshare.net/wiki/RP2040-Touch-LCD-1.28
这个arduino下载开发板库,感觉很快。比espressif快多了。

调试记录
样例程序很好,陀螺仪的,还有触摸画点的功能演示。所以我想做一个能设置时间的电子表,看起来没有WIFI模块,所以就不整网络授时了。
使用时遇到了些问题,烧录不进去了。一直报错,我以为是坏了,烧不进去别的程序了。后来推断是因为我乱改程序,在LOOP函数里头添加了好多分配内存回收内存的程序。烧进去一遍以后,就烧不进去了。所以我问了客服怎么解决,同时我又找了些资料,有没有强制烧录的办法,我先当这个板子没坏。。。。果然有办法。
就是断电,按住BOOT键,再上电,再松手,就能烧录了。之后把程序LOOP函数里全删除就好了。

LCD函数研究
1、看起来这个提供的样例,没有那种像操作TFTLCD那种,即时性的,单点修改的函数。就是它需要预先生成个矩阵 BlackImage,在这个矩阵里编辑完了,在一次性输入到lcd上,LCD_1IN28_Display(BlackImage);这就很费劲。
BlackImage是个在setup函数里的局部变量,那我在回调函数Touch_INT_callback里咋用?所以我就把BlackImage改成全局变量。

2、回调函数可以让LCD显示内容,但是setup里头的while里头画LCD与其会发生冲突阻塞,导致黑屏。。。。所以我又删掉了回调函数里的LCD绘制。

3、对于时分秒的变量,我本来用的uint16_t但是发现小于0就变成了255,所以变量改成int了。

4、延时是个问题,绘制其实会消耗很多毫秒,如果直接绘制完 DEV_Delay_ms(1000)那看起来像是两秒。所以用了 LTIMSE=millis(); uint32_t pp=millis(); DEV_Delay_ms(1000-pp+LTIMSE); 这样比较近似,结果验证了一个晚上,也差不出几秒,用一个月就难说了。

5、这个显示屏说是240x240的分辨率,其实要砍掉四个角。比对像素时候比较费劲。程序自带的字体也比较少,16、24像素的,字体取模程序很好用。

程序

#include "LCD_Test.h"
void Touch_INT_callback();
uint8_t flag = 0;
int Hour = 0;
int Min = 12;
int Sec = 30;
uint32_t LTIMSE = 0;
UWORD *BlackImage;
int Mode_0Over_1Hou_2Min_3Sec = 0;
void setup() {
   
   
  // put your setup code here, to run once:
  if (DEV_Module_Init() != 0)
    Serial.println("GPIO Init Fail!");
  else
    Serial.println("GPIO Init successful!");
  LCD_1IN28_Init(HORIZONTAL);
  DEV_SET_PWM(0);
  LCD_1IN28_Clear(WHITE);
  DEV_SET_PWM(100);
  UDOUBLE Imagesize = LCD_1IN28_HEIGHT * LCD_1IN28_WIDTH * 2;
  //UWORD *BlackImage;
  if ((BlackImage = (UWORD *)malloc(Imagesize)) == NULL) {
   
   
    Serial.println("Failed to apply for black memory...");
    exit(0);
  }
  // /*1.Create a new image cache named IMAGE_RGB and fill it with white*/
  Paint_NewImage((UBYTE *)BlackImage, LCD_1IN28.WIDTH, LCD_1IN28.HEIGHT, 0, WHITE);
  Paint_SetScale(65);
  Paint_Clear(WHITE);
  Paint_SetRotate(ROTATE_0);
  Paint_Clear(WHITE);

  // /* GUI */
  Serial.println("drawing...\r\n");
  // /*2.Drawing on the image*/
#if 1
  //Paint_DrawPoint(50, 41, BLACK, DOT_PIXEL_1X1, DOT_FILL_RIGHTUP);  // 240 240
  // Paint_DrawPoint(50, 46, BLACK, DOT_PIXEL_2X2, DOT_FILL_RIGHTUP);
  // Paint_DrawPoint(50, 51, BLACK, DOT_PIXEL_3X3, DOT_FILL_RIGHTUP);
  //Paint_DrawPoint(50, 56, BLACK, DOT_PIXEL_4X4, DOT_FILL_RIGHTUP);
  //Paint_DrawPoint(50, 61, BLACK, DOT_PIXEL_5X5, DOT_FILL_RIGHTUP);

  //Paint_DrawLine(60, 40, 90, 70, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);
  //Paint_DrawLine(60, 70, 90, 40, MAGENTA, DOT_PIXEL_2X2, LINE_STYLE_SOLID);

  //Paint_DrawRectangle(60, 40, 90, 70, RED, DOT_PIXEL_2X2, DRAW_FILL_EMPTY);
  //Paint_DrawRectangle(100, 40, 130, 70, BLUE, DOT_PIXEL_2X2, DRAW_FILL_FULL);

  //Paint_DrawLine(135, 55, 165, 55, CYAN, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);
  //Paint_DrawLine(150, 40, 150, 70, CYAN, DOT_PIXEL_1X1, LINE_STYLE_DOTTED);

  //Paint_DrawCircle(150, 55, 15, GREEN, DOT_PIXEL_1X1, DRAW_FILL_EMPTY);
  //Paint_DrawCircle(185, 55, 15, GREEN, DOT_PIXEL_1X1, DRAW_FILL_FULL);

  //Paint_DrawNum(50, 80, 9.87654321, &Font20, 3, WHITE, BLACK);

  Paint_DrawLine(35, 35, 205, 35, MAGENTA, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  Paint_DrawLine(205, 35, 205, 205, MAGENTA, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  Paint_DrawLine(35, 205, 205, 205, MAGENTA, DOT_PIXEL_1X1, LINE_STYLE_SOLID);
  Paint_DrawLine
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胸毛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值