极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12085|回复: 3

【TFT屏】求助,同一位置写屏会重叠

[复制链接]
发表于 2014-5-1 12:28:44 | 显示全部楼层 |阅读模式
本帖最后由 maxims 于 2014-5-2 01:22 编辑

有一个2.2寸的屏,芯片是iLi9341,网络上有一个arduino库

比方说,在同一个位置,写入0-9的数字,这些数字会重叠在一起,导致啥都看不清楚。

库里边没有处理这个情况的函数,谁能帮我解决一下问题啊~
链接:http://pan.baidu.com/s/1c0teWFI 密码:iuy2
回复

使用道具 举报

 楼主| 发表于 2014-5-2 01:22:24 | 显示全部楼层
这么多人看,没有人理我吗?
回复 支持 反对

使用道具 举报

发表于 2014-5-2 09:37:46 | 显示全部楼层
朋友, 不是不想幫, 而是要幫也不容易.

你問的是硬件問題, 而且不是普通的硬件.  TFT 已不是很多人有, 而 TFT 亦有不同的芯片, 庫也不一樣.  

我並沒有TFT, 但曾寫過 OLED 的庫, 或多或少也猜到問題所在, 你可以嘗試自己修改.

首先, 文字一般只用 0 1 的把有色的地方儲存在字庫中, 在顯示時有不同的方式.
以 OLED 為例, 由於每個點只有黑白 (或者是有顯不或沒有顯示) 兩個可能, 要顯示一個 6x8 的字, 就乾脆把 6x8 的地方都用直接填上就可以了 (程式上直接 overwrite).  但如果要保留原有的底圖, 就只可以在該字需要顯示的地方才蓋上 (程式上用 OR 的方式, 但必須先記下之前的資料, 要動用一些記憶體).

而 TFT 跟 OLED 不同, 是多色的, 同一個點不是單單只有兩個選擇.  顯示時就要分開 直接把 6x8 的地方都蓋了 (overwrite), 還是只在有顥的地方才蓋上 (由於 TFT 是單點操控, 不是 OR, 而是把沒顯的地方跳過就可以了).  前者是你想要的, 後者 是你現在碰到的.
要做到前者, 在 TFT 會有一定的問題, 因為不是 0 / 1 的分別, 比如背景可能是一幅多色的圖畫, 直接蓋上就會出現一塊塊的方格.  所以在 TFT 選用後者比較適合, 寫庫的人, 也不知沒顯示的點應該填上什麼, 除非是用家提供.

如果你的庫沒有提供前者的功能, 你也最少有兩個方法:
1) 直接改庫, 在顥示時, 把字庫中沒顯的地方都顯示為黑色 (或其他你喜歡的顏色)
2) 在顯示文字時, 先自行把背景地方填上一個你想要的背景, 相信這個不會太難攪

由於我沒有你的 TFT, 我只可以提供原理, 你嘗試自己做吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-2 18:58:08 | 显示全部楼层
本帖最后由 maxims 于 2014-5-3 09:42 编辑
Super169 发表于 2014-5-2 09:37
朋友, 不是不想幫, 而是要幫也不容易.

你問的是硬件問題, 而且不是普通的硬件.  TFT 已不是很多人有, 而 ...


已经搞定了,是我自己思路出现了一个小的偏差
  1. void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
  2. {
  3.     if((ascii>=32)&&(ascii<=127))
  4.     {
  5.         ;
  6.     }
  7.     else
  8.     {
  9.         ascii = '?'-32;
  10.     }

  11.      for (int i =0; i<FONT_X; i++ ) {
  12.         INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);//ascii-0x20
  13.         INT8U eraes = pgm_read_byte(&simpleFont[0x20][i]);//@我用不到这个@字符,所以把这个字符变成方块也就是全FF,然后在这里读取它
  14.         for(INT8U f=0;f<8;f++)
  15.         {
  16.             if((eraes>>f)&0x01)
  17.             {
  18.                 fillRectangle(poX+i*size, poY+f*size, size, size, 0x0000);//每次写屏前,先在这里把黑方块写一次。
  19.             }
  20.             if((temp>>f)&0x01)
  21.             {
  22.                 fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);//然后这里才写需要的字符。
  23.             }

  24.         }

  25.     }
  26. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 04:20 , Processed in 0.042200 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表