|
本帖最后由 xujun 于 2020-6-20 08:15 编辑
根据硬汉的例子去掉了emwin,修改为littlevgl,由于bsp_tft_429.c内没有提供通过DMA绘制矩形图片函数,仅提供了DMA绘制单色矩形,增加了一个函数通过DMA绘制图片
- void LCD429_FillRect1(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth, uint16_t *_usColor)
- {
- uint32_t timeout=0;
- /* 使用DMA2D硬件填充矩形 */
- DMA2D_InitTypeDef DMA2D_InitStruct;
- DMA2D_FG_InitTypeDef DMA2D_FG_InitStruct;
- uint32_t Xaddress = 0;
- uint16_t OutputOffset;
- uint16_t NumberOfLine;
- uint16_t PixelPerLine;
-
- if (g_LcdDirection == 0) /* 横屏 */
- {
- Xaddress = s_CurrentFrameBuffer + 2* (g_LcdWidth * _usY + _usX);
- OutputOffset = g_LcdWidth-(_usHeight-_usX+1);
- NumberOfLine = _usHeight-_usX+1;
- PixelPerLine = _usWidth-_usY+1;
- }
- else if (g_LcdDirection == 2) /* 竖屏 */
- {
- Xaddress = s_CurrentFrameBuffer + 2 * (g_LcdHeight * (g_LcdWidth - _usX - _usWidth) + _usY);
- OutputOffset = g_LcdHeight - _usHeight;
- NumberOfLine = _usWidth;
- PixelPerLine = _usHeight;
- }
- /* 配置 DMA2D */
- DMA2D->CR&=~(DMA2D_CR_START); //先停止DMA2D
- DMA2D->CR=DMA2D_M2M; //存储器到存储器模式
- DMA2D->FGPFCCR=DMA2D_RGB565; //设置颜色格式
- DMA2D->FGOR=0; //前景层行偏移为0
- DMA2D->OOR=OutputOffset; //设置行偏移
- DMA2D->FGMAR=(u32)_usColor; //源地址
- DMA2D->OMAR=Xaddress; //输出存储器地址
- DMA2D->NLR=(PixelPerLine)|(NumberOfLine<<16); //设定行数寄存器
- DMA2D->CR|=DMA2D_CR_START; //启动DMA2D
- while((DMA2D->ISR&(DMA2D_FLAG_TC))==0) //等待传输完成
- {
- timeout++;
- if(timeout>0X1FFFFF)break; //超时退出
- }
- DMA2D->IFCR|=DMA2D_FLAG_TC; //清除传输完成标志
- }
复制代码 需要的可以自己在整理一下程序的结构,目前粗糙,但刷新速度不错。
littlevgl_demo.rar
(18.35 MB, 下载次数: 169)
eab3de2fafbbf5acee6df6cb05a8a040.mp4
(1.69 MB, 下载次数: 327)
修复触摸不灵敏问题,修改10ms调用一次读取触摸屏函数GT811_OnePiontScan
内部增加读取后提交到数据队列,程序如下:增加了TOUCH_PutKey提交数据
- void GT811_OnePiontScan(void)
- {
- uint8_t buf[6];
- static uint8_t s_tp_down = 0;
- uint16_t x, y;
-
- /* 读取寄存器:0x721 R TouchpointFlag Sensor_ID key tp4 tp3 tp2 tp1 tp0 */
- GT811_ReadReg(GT811_READ_XY_REG, buf, 1);
-
- /* 判断是否按下,没有按下,直接退出 */
- if ((buf[0] & 0x01) == 0)
- {
- if (s_tp_down == 1)
- {
- /* State.x和State.y的数值无需更新,State是全局变量,保存的就是最近一次的数值 */
- s_tp_down = 0;
- // State.Pressed = 0;
- // GUI_PID_StoreState(&State);
- }
- return;
- }
-
- /* 读取第一个触摸点0 */
- GT811_ReadReg(GT811_READ_XY_REG + 1, &buf[1], 5);
-
- /*
- 0x721 R TouchpointFlag Sensor_ID key tp4 tp3 tp2 tp1 tp0
- 0x722 R Touchkeystate 0 0 0 0 key4 key3 key2 key1
- 0x723 R Point0Xh 触摸点 0,X 坐标高 8 位
- 0x724 R Point0Xl 触摸点 0,X 坐标低 8 位
- 0x725 R Point0Yh 触摸点 0,Y 坐标高 8 位
- 0x726 R Point0Yl 触摸点 0,Y 坐标低 8 位
- 0x727 R Point0Pressure 触摸点 0,触摸压力
- */
- g_GT811.TouchpointFlag = buf[0];
- g_GT811.Touchkeystate = buf[1];
-
- g_GT811.X0 = ((uint16_t)buf[2] << 8) + buf[3];
- g_GT811.Y0 = ((uint16_t)buf[4] << 8) + buf[5];
-
- /* 检测按下 */
- /* 坐标转换 :
- 电容触摸板左下角是 (0,0); 右上角是 (479,799)
- 需要转到LCD的像素坐标 (左上角是 (0,0), 右下角是 (799,479)
- */
- x = g_GT811.Y0;
- y = 479 - g_GT811.X0;
-
- if (s_tp_down == 0)
- {
- s_tp_down = 1;
- TOUCH_PutKey(TOUCH_DOWN, x, y); }
- else
- {
- TOUCH_PutKey(TOUCH_DOWN, x, y);
- }
-
- }
复制代码
配置littlevgl读取触摸周期为20ms,因为从队列取数据,缩短周期影响不是很大。整理程序的结构,删减不用的部分,仅保留了GT811触摸驱动,littlevgl接口按照官方文档整理,使用体验更顺畅。
littlevgl_demo20200620.rar
(18.32 MB, 下载次数: 376)
|
评分
-
查看全部评分
|