极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 41146|回复: 21

编个可显示中文的TFT程序

[复制链接]
发表于 2013-12-28 15:19:33 | 显示全部楼层 |阅读模式
      近几个月有点空闲时间,看到Arduino比较好玩,就开始学习,近来想做个数控电源,想用Arduino  por  mini做主控,TFT屏做显示,找到一个ILI9341的库,但该库只支持英文字符显示,搜了很久,也许本人比较笨,英文很差,没找到合用的库,又想显示汉字,实在没办法,只好自已照冬瓜画葫芦乱编了一个,请各位高人指点指点。TFT屏为2.2吋SPI接口,刷屏比较慢,有明显的闪烁,本来用5V的,但出现白屏,只好改为3.3V。本程序只解决中文显示,其他东西还没时间编。


[pre lang="arduino" line="1" file="ILI9341"]/*  
本程序是在TFT2.h库的基础上,参考库文件中ASCII字符显示一段胡乱而编----chbhbgtx;

*/

#include <stdint.h>
#include <TFTv2.h>
#include <SPI.h>

int inPin_A = 0;
int inPin_B = 1;

/******汉字字库**********/
static const byte hanzi24x24[][72]={
//"0 数",
      {0x00,0x40,0x42,0x4C,0x58,0xC0,0xFF,0xFE,
      0x62,0x58,0x4E,0x64,0x44,0x00,0xF0,0xFF,
      0x4E,0x42,0xC0,0xC0,0x60,0x60,0x40,0x00,
      0x00,0x48,0x48,0x44,0xC3,0xE1,0x7F,0x57,
      0x41,0xC3,0xE6,0x48,0x04,0x03,0x3F,0xE0,
      0x00,0x80,0xFF,0x3F,0x00,0x00,0x00,0x00,
      0x00,0x40,0x40,0x62,0x23,0x35,0x14,0x08,
      0x0E,0x1F,0xB1,0x80,0x40,0x20,0x30,0x1D,
      0x0F,0x0F,0x18,0x30,0x70,0x20,0x20,0x00},

//"1 控",
      {0x00,0x40,0x40,0x40,0xFF,0xFE,0x42,0x60,
      0x00,0xC0,0xF8,0x10,0x90,0x11,0x13,0x1E,
      0x14,0x90,0x10,0x50,0x30,0x38,0x10,0x00,
      0x00,0x20,0x60,0x30,0xFF,0xFF,0x08,0x08,
      0x24,0x50,0x4C,0x46,0x43,0x41,0xC1,0xC0,
      0x40,0x40,0x61,0x67,0x4E,0x1C,0x00,0x00,
      0x00,0x20,0x20,0xE0,0x7F,0x3F,0x00,0x00,
      0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x3F,
      0x20,0x20,0x20,0x20,0x30,0x30,0x20,0x00},

//"2 电",
      {0x00,0x00,0x00,0xF0,0xE0,0x20,0x20,0x20,
      0x20,0x20,0xFF,0xFE,0x22,0x20,0x20,0x20,
      0x20,0xF0,0xF0,0x20,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0xFF,0xFF,0x84,0x84,0x84,
      0x84,0x84,0xFF,0xFF,0x84,0x84,0x84,0x84,
      0x84,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x00,
      0x00,0x00,0x3F,0x7F,0x60,0x60,0x60,0x60,
      0x60,0x61,0x60,0x60,0x60,0x7E,0x30,0x00},

//"3 源",
      {0x00,0x40,0xC0,0x86,0x1C,0x08,0xC0,0x00,
      0xFE,0xFC,0x04,0x04,0xE4,0xC4,0x44,0x7C,
      0x54,0x44,0x44,0xE4,0xE6,0x46,0x04,0x00,
      0x00,0x80,0x83,0xC1,0xF0,0x0F,0x00,0x80,
      0xFF,0x7F,0x00,0x00,0xBF,0x1F,0x12,0xF2,
      0xF2,0x12,0x12,0x7F,0x3F,0x00,0x00,0x00,
      0x00,0x00,0x00,0x1F,0x3F,0x40,0x38,0x0F,
      0x23,0x10,0x18,0x0E,0x23,0x21,0xE0,0x7F,
      0x3F,0x00,0x01,0x02,0x06,0x1C,0x38,0x00},

// "4 压",
      {0x00,0x00,0x00,0x00,0xFC,0xF8,0x08,0x08,
      0x08,0x08,0x08,0x08,0xE8,0xC8,0x48,0x08,
      0x08,0x08,0x08,0x0C,0x0C,0x08,0x00,0x00,
      0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x08,
      0x08,0x08,0x08,0x08,0xFF,0xFF,0x08,0x08,
      0x48,0xC8,0x8C,0x0C,0x08,0x00,0x00,0x00,
      0x00,0x40,0x30,0x1E,0x07,0x21,0x20,0x20,
      0x20,0x20,0x20,0x20,0x3F,0x3F,0x20,0x20,
      0x20,0x21,0x27,0x23,0x30,0x30,0x20,0x00},

//"5 流",
      {0x00,0x80,0x00,0x04,0x0C,0x38,0x10,0xC0,
      0x10,0x10,0x10,0xD0,0x71,0x36,0x1E,0x14,
      0x50,0x90,0x90,0x18,0x18,0x10,0x00,0x00,
      0x00,0x01,0x07,0x8E,0xC0,0x38,0x07,0x00,
      0x02,0xF6,0xE7,0x26,0x02,0xF2,0xE2,0x22,
      0x02,0xF2,0xE3,0x27,0x0E,0x00,0x00,0x00,
      0x00,0x01,0x01,0x3F,0x7F,0x80,0x40,0x20,
      0x1E,0x0F,0x01,0x00,0x00,0x7F,0x3F,0x00,
      0x00,0x3F,0x7F,0x60,0x60,0x7E,0x30,0x00},

//"6 设",
      {0x00,0x00,0x00,0x02,0x06,0x1C,0x38,0x00,
      0x00,0x00,0x80,0xFE,0x7C,0x04,0x04,0x04,
      0x04,0xFE,0xFE,0x84,0x80,0xC0,0x80,0x00,
      0x00,0x02,0x02,0x02,0xFF,0xFF,0x02,0x00,
      0x02,0x09,0x89,0x38,0xC8,0x08,0x08,0x08,
      0xC8,0xF8,0x3D,0x0D,0x09,0x01,0x00,0x00,
      0x00,0x00,0x00,0x10,0x3F,0x9F,0x8C,0x44,
      0x42,0x21,0x20,0x10,0x19,0x0F,0x06,0x0F,
      0x19,0x30,0x30,0x60,0x60,0x20,0x20,0x00},

//"7 置",
      {0x00,0x00,0x00,0x00,0x7F,0x3E,0x22,0x22,
      0x22,0x3E,0x3E,0xE2,0xE2,0x3E,0x3E,0x22,
      0x22,0x22,0x7F,0x3F,0x82,0x80,0x00,0x00,
      0x00,0x01,0x01,0x01,0x01,0x01,0xFD,0xF9,
      0x49,0x49,0x4F,0x4F,0x49,0x49,0x49,0x49,
      0xFD,0xFD,0x09,0x01,0x01,0x01,0x01,0x00,
      0x00,0x40,0x40,0x40,0x40,0x40,0x7F,0x7F,
      0x49,0x49,0x49,0x49,0x49,0x49,0x49,0x49,
      0x7F,0x7F,0x40,0x40,0x60,0x60,0x40,0x00},

//"8 测",
      {0x00,0x40,0xC2,0x86,0x1C,0xCC,0x00,0xFC,
      0x08,0x08,0xE8,0x48,0x08,0xFC,0xFC,0x08,
      0x00,0xF8,0x10,0x00,0xFE,0xFC,0x04,0x00,
      0x00,0x80,0x83,0xE1,0x1C,0x03,0x00,0xFF,
      0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,
      0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,
      0x00,0x00,0x3F,0x7F,0x00,0x80,0x40,0x23,
      0x18,0x0C,0x07,0x00,0x04,0x1B,0x31,0x60,
      0x00,0x23,0x20,0xE0,0x7F,0x3F,0x00,0x00},

//"9 定",
      {0x00,0x00,0xC0,0xFC,0x10,0x10,0x10,0x10,
      0x10,0x10,0x11,0x13,0x1E,0x14,0x10,0x10,
      0x10,0x90,0x50,0x70,0x38,0x18,0x10,0x00,
      0x00,0x00,0x00,0x02,0x02,0xF2,0xE2,0x22,
      0x02,0x02,0x02,0xFE,0xFE,0x82,0x82,0x82,
      0x82,0xC2,0xC2,0x83,0x03,0x02,0x00,0x00,
      0x00,0x40,0x20,0x18,0x0E,0x07,0x03,0x0C,
      0x18,0x30,0x60,0x7F,0x7F,0x60,0x60,0x60,
      0x60,0x60,0x60,0x60,0x60,0x20,0x20,0x00}
        
};

/********** 24x24点 汉字显示 ************/
/*
   hanzi:汉字在字库中位置;poX, poY:显示坐标;size :汉字大小;fgcolor:颜色
   下面一段是我照冬瓜画葫芦乱编的,其实有些语句我自已都不是很明白,见笑,请高手注释。
*/
void TFT_write_hanzi(INT8U hanzi, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
{
   for (int i =0; i<24; i++ )
    {
        INT8U temp = hanzi24x24[hanzi];
        for(INT8U j=0;j<8;j++)
        {
             if((temp>>j)&0x01)
            {
               Tft.fillRectangle(poX+i*size, poY+j*size, size, size, fgcolor);
            }
            }
    }
   
    for (int i =24; i<48; i++ )
    {
        INT8U temp = hanzi24x24[hanzi];
        for(INT8U j=0;j<8;j++)
        {
             if((temp>>j)&0x01)
            {
               Tft.fillRectangle(poX+(i-24)*size, poY+8*size+j*size, size, size, fgcolor);
            }
            }
    }
   
    for (int i =48; i<72; i++ )
    {
        INT8U temp = hanzi24x24[hanzi];
        for(INT8U j=0;j<8;j++)
        {
             if((temp>>j)&0x01)
            {
               Tft.fillRectangle(poX+(i-48)*size, poY+8*size*2+j*size, size, size, fgcolor);
            }
         }
    }
}

void setup()
{
    TFT_BL_ON;             // turn on the background light
    Tft.TFTinit();             //init TFT library

                                            
   //"数控电源"
   INT16U poX_1 = 20;
   INT16U poY_1 = 5;
   INT16U size_1 = 2;
   TFT_write_hanzi(0, poX_1, poY_1,size_1, GREEN);
   TFT_write_hanzi(1, poX_1+24*size_1*1+4, poY_1,size_1, GREEN);
   TFT_write_hanzi(2, poX_1+24*size_1*2+4, poY_1,size_1, GREEN);
   TFT_write_hanzi(3, poX_1+24*size_1*3+4, poY_1,size_1, GREEN);
   
    //"测定电压"
   INT16U poX_2 = 5;
   INT16U poY_2 = 65;
   INT16U size_2 = 1;
   TFT_write_hanzi(8, poX_2, poY_2,size_2, GREEN);
   TFT_write_hanzi(9, poX_2+24*size_2*1+4, poY_2,size_2, GREEN);
   TFT_write_hanzi(2, poX_2+24*size_2*2+4, poY_2,size_2, GREEN);
   TFT_write_hanzi(4, poX_2+24*size_2*3+4, poY_2,size_2, GREEN);
   
    Tft.drawString("V",215,110,3,YELLOW);
   
   //"设定电压"
   INT16U poX_4 = 5;
   INT16U poY_4 = 155;
   INT16U size_4 = 1;
   TFT_write_hanzi(6, poX_4, poY_4,size_2, GREEN);
   TFT_write_hanzi(9, poX_4+24*size_4*1+4, poY_4,size_4, GREEN);
   TFT_write_hanzi(2, poX_4+24*size_4*2+4, poY_4,size_4, GREEN);
   TFT_write_hanzi(4, poX_4+24*size_4*3+4, poY_4,size_4, GREEN);
   
    Tft.drawString("15.17",110,157,3,CYAN);
    Tft.drawString("V",215,157,3,YELLOW);
   
   //"测定电流"
   INT16U poX_6 = 5;
   INT16U poY_6 = 190;
   INT16U size_6 = 1;
   TFT_write_hanzi(8, poX_6, poY_6,size_2, GREEN);
   TFT_write_hanzi(9, poX_6+24*size_6*1+4, poY_6,size_6, GREEN);
   TFT_write_hanzi(2, poX_6+24*size_6*2+4, poY_6,size_6, GREEN);
   TFT_write_hanzi(5, poX_6+24*size_6*3+4, poY_6,size_6, GREEN);
   
    Tft.drawString("A",215,240,3,YELLOW);
   
   //"设定电流"
   INT16U poX_8 = 5;
   INT16U poY_8 = 290;
   INT16U size_8 = 1;
   TFT_write_hanzi(6, poX_8, poY_8,size_2, GREEN);
   TFT_write_hanzi(9, poX_8+24*size_8*1+4, poY_8,size_8, GREEN);
   TFT_write_hanzi(2, poX_8+24*size_8*2+4, poY_8,size_8, GREEN);
   TFT_write_hanzi(5, poX_8+24*size_8*3+4, poY_8,size_8, GREEN);
     
    Tft.drawString("1.345",115,290,3,CYAN);
    Tft.drawString("A",215,290,3,YELLOW);
   
}

void loop()

{
  
  float vol_1B = 0;
  float vol_2B = 0;
  for (int i = 0 ;i < 256; i ++)
  {
  int reading_A = analogRead(inPin_A);
  float vol_1A = 3.25 * ( reading_A / 1023.0) ;
  vol_1B =  vol_1B + vol_1A;
  
  int reading_B = analogRead(inPin_B);
  float vol_2A = 2 * ( reading_B / 1023.0) ;
  vol_2B =  vol_2B + vol_2A;
  }
  float vol_1 = vol_1B / 256;
  float vol_2 = vol_2B / 256;
   
  Tft.fillScreen(45,200,90,150,BLACK);
  Tft.fillScreen(45,200,225,280,BLACK);
  
  if (vol_1 < 10.0)
  {
  Tft.drawFloat(vol_1,2,75,95,5,GREEN);//显示测定电压
  }
  else
  {
  Tft.drawFloat(vol_1,2,45,95,5,GREEN);//显示测定电压
  }
  Tft.drawFloat(vol_2,3,45,230,5,GREEN);//显示测定电流
  
  delay(500);
  
}
[/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-12-28 16:15:50 | 显示全部楼层
程序好长啊!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-28 16:38:16 | 显示全部楼层
philhoo 发表于 2013-12-28 16:15
程序好长啊!

其实关键的东西在132--169之间,其他的只是怎样显示。
回复 支持 反对

使用道具 举报

发表于 2013-12-28 20:49:21 | 显示全部楼层
很好啊,不错~
回复 支持 反对

使用道具 举报

发表于 2013-12-28 21:31:26 | 显示全部楼层
什么型号的显示器???驱动麻烦吗???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-28 23:31:13 | 显示全部楼层
学慧放弃 发表于 2013-12-28 21:31
什么型号的显示器???驱动麻烦吗???

在某宝上用ili9341搜一下,2.2吋不到30元。驱动很简单,可显示字符、字符串、数字、浮点数、画线圈框等,主要是有颜色,比12864单色好看多了,分辩率又高点240X320。
回复 支持 反对

使用道具 举报

发表于 2013-12-29 12:03:29 | 显示全部楼层
不错啊,学习,给力
回复 支持 反对

使用道具 举报

发表于 2013-12-31 08:57:01 | 显示全部楼层
淘宝搜索“闪耀液晶” 有出售这款  26元
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-31 21:46:37 | 显示全部楼层
  1. /*
  2. 1  VDD 2.7—5.5V
  3. D9   2  CS   片选
  4. D13  3  SCK  时钟
  5. D11  4  SDI  数据输入
  6. 5  LDAC  接地就行
  7. 6  Vout-B 以后用于恒流电流调节
  8. 7  Vss 接地
  9. 8  Vout-A以后用于恒压电压调节
  10. */

  11. #include <SPI.h>
  12. #include <MCPDAC.h>


  13. void setup()
  14.    
  15.     // 初始化,并设D9为CS.
  16.     MCPDAC.begin(9);
  17.   
  18.     // 设gain 为 "HIGH" mode – 可输出0 to 4096mV.
  19.     MCPDAC.setGain(CHANNEL_A,GAIN_HIGH);
  20.     MCPDAC.setGain(CHANNEL_B,GAIN_HIGH);
  21.     // 打开通道A、B
  22.     MCPDAC.shutdown(CHANNEL_A,false);
  23.     MCPDAC.shutdown(CHANNEL_B,false);
  24.    
  25. void loop()
  26. {
  27.     // 每隔0.5S 通道A、B输出电压分别增加100mV
  28.   static unsigned int volts ;
  29.     MCPDAC.setVoltage(CHANNEL_A,volts);
  30.     MCPDAC.setVoltage(CHANNEL_B,volts);
  31.    
  32.     delay(500);
  33.     volts+=100;
  34. }
复制代码
今天有空,试验了一个数模转换电路,采用MCP4822集成块,MCP4822为十二位数模转换器,內部自带2.048V基准电压,可以输出4096mV电压,分辨率1mV,详细可百度。在http://www.arduino.cc/上搜了一个库,很简单。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-1-1 18:59:43 | 显示全部楼层
chbhbgtx 发表于 2013-12-28 23:31
在某宝上用ili9341搜一下,2.2吋不到30元。驱动很简单,可显示字符、字符串、数字、浮点数、画线圈框等, ...

12864很麻烦,而且我搞了好几天没任何反应,那个库是可以直接arduinoIDE上面编译对吧??能够显示中文和字符还有数字就够了,楼主感觉这液晶用来做遥控器液晶显示麻烦不???占用单片机资源大吗??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-1 21:08:10 | 显示全部楼层
学慧放弃 发表于 2014-1-1 18:59
12864很麻烦,而且我搞了好几天没任何反应,那个库是可以直接arduinoIDE上面编译对吧??能够显示中文和字 ...

这个库可以直接在arduinoIDE1.0.4上面编译通过。原库不能显示汉字,要显示汉字要加入第一个程序中汉字显示函数。我觉得用来做显示很简单,但由于SPI限制,刷屏有点慢,我把前面两个程序合在一起编释大概10k左右。

Tft.drawChar(INT8U ascii,INT16U poX, INT16U poY,INT16U size, INT16U fgcolor);//显示字符("单个字符",x位置,y位置,尺寸大小,颜色)
例:Tft. drawChar("A",100,50,3,RED);

Tft.drawString(char *string,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
//显示字符串("字符串",x位置,y位置,尺寸大小,颜色)
例:Tft.drawString("ABC",100,50,3,RED);

Tft.drawNumber(long long_num,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
例:Tft.drawFloat(3456,  100,  50,  2,  RED);//显示浮点数(长整型数3456,x位置100,y位置50,字符尺寸大小2,颜色:红)       

Tft.drawFloat(float floatNumber,INT8U decimal,INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
例:  Tft.drawFloat(3.123,  3, 100,  50,  2, RED);//显示浮点数(浮点数据3.123,小数点3位,x位置100,y位置50,字符尺寸大小2,颜色:红)       

Tft.drawFloat(float floatNumber, INT16U poX, INT16U poY,INT16U size,INT16U fgcolor);
例:Tft.drawFloat(3.12, 100,  50,  2, RED);//显示浮点数(浮点数据3.12,x位置100,y位置50,字符尺寸大小2,颜色:红)此方式只显示小数点2位
回复 支持 反对

使用道具 举报

发表于 2014-1-2 18:38:25 | 显示全部楼层
chbhbgtx 发表于 2014-1-1 21:08
这个库可以直接在arduinoIDE1.0.4上面编译通过。原库不能显示汉字,要显示汉字要加入第一个程序中汉字显示 ...

感觉不错,刷屏应该比1602液晶快吧????性价比高,也不难
回复 支持 反对

使用道具 举报

发表于 2014-2-8 13:11:11 | 显示全部楼层
我只有一个2560,接了对应的SPI口,50/51/52,但是没反应,只有LCD背光是亮的,哪位大侠给点建议?谢谢
ILI9341, 320*240液晶
回复 支持 反对

使用道具 举报

发表于 2014-2-11 18:57:16 来自手机 | 显示全部楼层
跟楼上一样2560,没任何反应。
回复 支持 反对

使用道具 举报

发表于 2014-2-20 08:21:39 | 显示全部楼层
同问,和楼主同样的屏幕用楼主的代码和接线顺序,还是白屏无显示,求解
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 07:46 , Processed in 0.048414 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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