历史上的今天
返回首页

历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2020年09月23日 | 单片机中不带字库LCD液晶屏显示少量汉字

2020-09-23 来源:eefocus

单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中。


第一种方式最方便,带字库的液晶屏价格稍贵,第二种方式电路复杂价格也不便宜,第三种方法可以存储少量必要的汉字,经济实用。将汉字字模数据存储到大数组中,通过偏移值来取出需要的汉字显示。



typedef struct _GB16  // 汉字字模数据结构

{

  char Index[2];  // 汉字内码索引

  char Msk[32];             // 点阵码数据

}GB16_Typedef;



const GB16_Typedef GB16x16[] = {//创建字库,阴码,顺向,逐行式取模


  {"天",0x00,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,

        0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,

        0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,

        0x08,0x20,0x10,0x10,0x20,0x08,0xC0,0x06},


  {"地",0x10,0x20,0x10,0x20,0x10,0x20,0x11,0x20,

        0x11,0x2C,0xFD,0x34,0x11,0x64,0x13,0xA4,

        0x11,0x24,0x11,0x34,0x11,0x28,0x1D,0x22,

        0xE1,0x22,0x41,0x02,0x00,0xFE,0x00,0x00},


  {"不",0x00,0x00,0x7F,0xFC,0x00,0x80,0x00,0x80,

        0x01,0x00,0x01,0x00,0x03,0x40,0x05,0x20,

        0x09,0x10,0x11,0x08,0x21,0x04,0x41,0x04,

        0x81,0x00,0x01,0x00,0x01,0x00,0x01,0x00},


  {"仁",0x08,0x00,0x08,0x00,0x08,0x00,0x13,0xFC,

        0x10,0x00,0x30,0x00,0x30,0x00,0x50,0x00,

        0x90,0x00,0x10,0x00,0x10,0x00,0x10,0x00,

        0x17,0xFE,0x10,0x00,0x10,0x00,0x10,0x00},


}


/*

其中定义的汉字结构体元素中Index[2]存放汉字,而Msk用于存放点阵码。

具体程序如下:

*/


void show_chinese(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t pointColor, uint16_t backColor)

{

  

  uint8_t bit_cnt, byte_cnt, wordNum;

  uint16_t color, word_index;

  const GB16_Typedef* p_tab;

  

  p_tab = GB16x16; 

  wordNum = sizeof(GB24x24) / sizeof(GB24_Typedef);//汉字的个数


  while(*pstr != '')

  {

    for(word_index=0; word_index    {

      if(*pstr==p_tab[word_index].Index[0] && *(pstr+1)==p_tab[word_index].Index[1])

      { 

        tft_set_window(x, y, x+15, y+15);//设置要操作的窗口范围

         

        for(byte_cnt=0; byte_cnt<32; byte_cnt++)

        {

          uint8_t color = p_tab[word_index].Msk[byte_cnt];

          for (bit_cnt=0; bit_cnt<8; bit_cnt++) 

          {

            if((color&0x80) == 0x80)

            {

              tft_wrdat(pointColor);//LCD写数据

            } 

            else

            {

              tft_wrdat(backColor);//LCD写数据

            } 

            color = color<<1;

          }

         

        }

        pstr+=2;

        x += 16;

        if(x > 225)   

        {

          x = 0;

          y += 16; 

        }

      } 

    }

  }

}




int main()

  TFT_Init();  //TFT彩屏初始化 

  LED_Init();  //LED初始化

  tft_clear_screen(BLACK); //清屏

  show_chinese(6, 20, "天地不仁", MAGENTA, YELLOW);//YELLOW

  

  while(1)

  { 

    KeyTask();//按键扫描

  } 


}


推荐阅读

史海拾趣

Andersen Laboratories Inc公司的发展小趣事

自1997年成立以来,AnalogicTech便致力于技术创新,不断推动电子行业的发展。公司总部位于硅谷,设计中心则分布在圣塔克拉拉和上海,汇聚了全球顶尖的研发人才。凭借深厚的技术底蕴和创新能力,AnalogicTech成功研发出一系列具有颠覆性的产品,为当今最具创造性的消费品提供了强大的技术支持。

Fanstel公司的发展小趣事

在市场竞争日益激烈的情况下,Fanstel公司意识到市场拓展的重要性。公司制定了一套精准的市场营销策略,针对不同行业和地区的客户需求,推出了定制化的产品和解决方案。同时,Fanstel还积极开拓国际市场,通过参加国际展会、建立海外销售网络等方式,成功将产品打入全球市场。这些举措不仅提升了公司的知名度,也大大增加了公司的销售额。

全志(Allwinner)公司的发展小趣事

全志科技在早期以电源管理IC AXP系列和多媒体解码F系列芯片为核心技术,成功挖掘了第一桶金。特别是在播放器等中小企业需求市场中,全志的产品获得了广泛认可。这种对市场需求的敏锐洞察和扎实的技术研发能力,使得全志在激烈的市场竞争中脱颖而出。

Engelking Elektronik GmbH公司的发展小趣事

Engelking Elektronik GmbH公司成立于20世纪90年代初,最初只是一家小型电子产品制造商。在创始人Engelking先生的领导下,公司专注于生产高质量的电子元件和模块。随着技术的不断进步和市场的扩大,Engelking Elektronik开始将产品范围扩展到更复杂的电子系统。通过持续的研发投入和严格的质量控制,公司逐渐在电子行业中树立了专业可靠的声誉。

Digi International公司的发展小趣事

Digi International与UR集团达成了战略协议,共同关注铁路、公共汽车和智慧城市等领域的发展。这一合作不仅为公司带来了新的市场机会,也促进了其在智能交通系统领域的业务拓展。通过与UR集团的紧密合作,Digi International的智能铁路解决方案在英国市场上得到了广泛应用,提高了铁路运输的效率和安全性。

Bomar公司的发展小趣事

随着电子行业的快速发展,Bomar公司逐渐意识到,仅仅依靠石英晶振产品已经无法满足市场的多样化需求。于是,在1988年,公司开始积极建立OEM客户群,将业务范围拓展至电信、计算机、医疗、安全、商业和工业等多个领域。通过与这些客户的紧密合作,Bomar公司不仅成功推出了时钟振荡器、VCXOs和TCXOs等新产品,还根据客户需求重新设计了制造流程,提升了产品性能和生产效率。

问答坊 | AI 解惑

mp3播放器在wince下播放歌曲时,暂停后无法继续播放

   mp3的播放器采用标准的wince api函数来编写的,在wince环境下,能够正常播放、暂停和停止播放,但是在暂停后无法继续播放。具体原因是在暂停后,无法获取暂停时MP3播放的位置。在IMediaSeeking类中,GetCurrentPosition函数获取的播放 ...…

查看全部问答>

一个很邪门的问题

我帮别人做个读IO口,然后通过串口发出去的程序,用PC调试正常,怎么试怎么好,但是将单片机接到终端设备上去,终端收到的数据出错,但是如果将这个数据发给一台pc,单片机将数据发给pc,然后pc用相同的串口设置将收到数据发给设备,则设备接收数据 ...…

查看全部问答>

mov eax,cr0

我在DOS下怎么一: MOV EAX,CR0 OR EAX,1 MOV CR0,EAX 就重启呢?…

查看全部问答>

不想看文档了,直接在这问了...

偶的STM32 RAM只有20KB,现在想直接用数组的方式分批将150KB的数据存到SPI flash中.用的IAR的开发环境,,直接用的大部分ST程序都在用的.xlf文件作为存储配置文件,程序是烧到flash里的.第一批数组的大小约为2KB左右,没有仔细算,,现在一 ...…

查看全部问答>

2530 + 2591的硬件设计

TI的参考设计中2591的三个电源端都有TLIN inductor,这个TLIN inductor可以不要的吗?还有就是这个TLIN不知道什么意思。…

查看全部问答>

430循迹程序

#include #define TR_1_H        P1IN|=BIT1      //P1.1 #define TR_1_L        P1IN&=~BIT1     //P1.1 #define TR_2_H   & ...…

查看全部问答>

2路温度设定-2路输出-1路超温报警

2路温度设定-2路输出-1路超温报警 [ 本帖最后由 用心思考 于 2012-10-7 08:45 编辑 ]…

查看全部问答>

TIVA C Launchpad第六周的心得---LM Flash programmer

程序内容:如何烧录编译好的bin文件。TI 提供了一个可以支持多种方式烧录的程序 LM Flash Programmer。 首先在CCS项目文件中编译源程序产生一个bin文件,具体设置如下: 我使用的CCS V5.5版本,选择相应的Project并右键选择Properties打开,如图 ...…

查看全部问答>

用TI官方的ccdebuger能调试CC430单片机吗

在官网上看到这个 但SmartRF里有cc430 …

查看全部问答>