澳门1495娱乐数学、计算机经典图书。使用Tslib在触摸屏上显得汉字【转】

 http://download.csdn.net/download/wz619899442/8405297

转自:http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html

算是到了于触摸屏上出示汉字了,真正写代码、测试的光阴是1天,在此之前的成套准备、学习花费大约2周到3周到时。而为拿走触摸屏上亮的图像,花费大概2上。由于网络让已经接近于放弃状态,NFS用无了,只好用U盘来回复制(即使没耐心也得出耐心了)。明明在根本中甄选了支撑NTFS格式的读写,但却非克拿开发板上的文本复制到U盘,而之所以另外一个FAT32格式的另一牌子的U盘,开发板死活认不出来,网上的材料说要修改代码,我以懒得去改。无奈之下,只好格式化那个NTFS的U盘,结果,这首稿子拖到今天才上。

 

慎重说明:

Elements of Information Theory 2nd Edition

正文作者以本文及前的篇章被绝非提及作者的干活内容、工作时间、业余时间及业余生活,因为于这些章中关系那些工作、生活内容是勿明智之。这些文章并没任何迹象表明作者没有工作、没有业余生活,也并无标明作者就在于描绘代码中。

http://coltech.vnu.edu.vn/~thainp/books/Wiley_-_2006_-_Elements_of_Information_Theory_2nd_Ed.pdf

免责声明:

本文是笔者以研究过程中的同一篇稿子,本着互联网共享、自由(free,应该无是“免费”)之精神发布给斯。本文使用的是Tslib中的代码,并以这基础及补偿加好之代码,关于Tslib,作者既写了许多篇相关的文章了,这里公布的光是投机丰富的代码。作者对文中代码没有任何义务,仅为Tslib使用GPL协议,本文作者必须用这个协议。作者才疏学浅,孤陋寡闻,能力简单,文中错误的地方,欢迎在文后留言,趁作者还有激情研究的时,大家一直追,共同学习,天天向上。

再次声明一点,本文作者在S3C2440芯片的开发板上,使用时下载的tslib,使用汉字字库HZK16、HZK24*,通过协调写的代码,在开发板自带的触摸屏上亮汉字。但是,并不曾以外的测试环境、平台下进展测试。

http://aima.cs.berkeley.edu/

有关汉字显示的算法(其实没啥算法)、步骤都于前面的章说了很多了,此处不再提及。

https://www.amazon.com/Convex-Optimization-Algorithms-Dimitri-Bertsekas/dp/1886529280/ref=sr_1_3?ie=UTF8&qid=1424202078&sr=8-3&keywords=Bertsekas+Convex

是因为还从未对autotool进行研讨,而Tslib又利用这个家伙管理代码,因此无懂得什么补充加新文件,如果被新文件为克编译。只好当原本的原本的文件中上加代码了。添加的代码的函数声明在fbutils.h中,函数定义在fbutils.c文件被,测试代码在ts_test.c中。

https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html\#%\_toc\_start

代码修改了大体上三次等,基本上还是一对组织及之调,就未说那些好看的语了。至于真的改变的处,只当极其底部的显示字符的代码修改了几单地方,就是以本来的乘法改呢运动,而针对性其余一些地方的乘法及动测试时,发现没什么区别,因此保留乘法。举无异于条例,如

线性模型与广义线性模型(第3版本)(英文) 平装 –
2015年1月1日

offset = (*ascii – 0x20 ) * 16;

拉奥 (C.Radhakrishna
Rao) (作者)

即便从未变动呢

https://www.amazon.cn/gp/product/B00VSPTTXK/ref=ox_sc_sfl_title_4?ie=UTF8&psc=1&smid=A1AJ19PSB66TGU

offset = (*ascii – 0x20 ) << 4;

矩阵代数(英文) (英语) 平装 –
2017年7月1日

前端更能于人理解这里的ASCII字符在字库数组中据为己有16字节,而不当移4个,的确给丁非晓出啊含义。

J.E.金特尔 (James
E.Gentle) (作者)

已知bug:

https://www.amazon.cn/gp/product/B071F2CSJ1/ref=pd_sim_14_7?ie=UTF8&psc=1&refRID=N3Z41583H5CS8T5X7RGA

1、不以GB2312范围中的字不可知正常显示——这是废话,正而在en_US字符集下显得中文一样。

凸优化(英文) 平装 – 2013年10月1日
鲍迪 (Stephen Boyd) (作者)

2、UCDOS的HZK24*多样字库文件没有中文字符,像“◆ □ ■ △
▲”等当16触及阵下显示正常,而于24碰阵中显示失败(乱码或其它汉字),网上搜寻不顶连完全的汉语字符的字库,另外,不亮用UCDOS的字库算不到底侵权(这些事物还可以网络下载)。

https://www.amazon.cn/gp/product/B00F4NUSJQ/ref=pd_sim_14_6?ie=UTF8&psc=1&refRID=N3Z41583H5CS8T5X7RGA

函数声明:

https://people.eecs.berkeley.edu/~bh/ss-toc2.html

/* new add by Late Lee *//* ascii code */

https://www.amazon.com/Principles-Program-Analysis-Flemming-Nielson/dp/3540654100/ref=pd_bxgy_14_2?_encoding=UTF8&psc=1&refRID=XAZCQ13EAQ88P4M7G659

 

https://www.amazon.com/Modern-Compiler-Design-Dick-Grune/dp/1461446988/ref=pd_sim_14_6?_encoding=UTF8&psc=1&refRID=XAZCQ13EAQ88P4M7G659

void put_string_ascii(int x, int y, char *s, unsigned colidx);

void put_string_center_ascii(int x, int y, char *s, unsigned
colidx);

/* cineses character */

void put_string_hz(FILE *fp, int x, int y, unsigned char *s,
unsigned colidx);

void put_string_center_hz(FILE *fp, int x, int y, unsigned char *s,
unsigned colidx);

/* chineses character & ascii */

void put_font(FILE *fp, int x, int y, unsigned char *s, unsigned
colidx);

void put_font_center(FILE *fp, int x, int y, unsigned char *s,
unsigned colidx);

/* end of new add */

测试代码(ts_test.c):

static FILE *fp;  /* HZK file pointer by Late Lee */#define HZK
“HZK/HZK16″ /* HZK16 or HZK24K/HZK24S */static void refresh_screen ()

 

{

……

/* just a test */

unsigned char incode[] = “▲!ADC■测镕试◎示例”; //
注:“镕”字勿以GB2312范围之内,不克正常显示。

int y = yres/4+50;

put_string_ascii(0, y, “Powered by Late Lee”, 9);

put_string_hz(fp, 0, y+30, “波神留自己看落日听取蛙声一片”, 2);

put_font(fp, 0, y+56, incode, 5);

/* end of the test */

……

}

重要的代码(fbutils.c):

/* new add by Late Lee 2011-05-30*///#define HZK24

 

#ifdef HZK24  /* 24 */

#include “ascii24.h”

#define   ASCII_CODE   ascii24

#define   FONT_SIZE    24                         /* size: 24 */

#else         /* 16 */

#include “ascii16.h”

#define  ASCII_CODE  ascii16

#define  FONT_SIZE    16                         /* size: 16 */

#endif
#define BYTES              
 (FONT_SIZE/8)                   /* for HZ: 3 bytes  2 bytes*/

#define BUF_SIZE          (BYTES * FONT_SIZE)        /* HZ buff 3*24 = 72 bytes 2*16 = 32 bytes */

#define ASCII_BYTES     (BYTES-1)                    /* 2 1*/

#define ASCII_SIZE     
 (FONT_SIZE * ASCII_BYTES)      /* ASCII buffer: 24*2 = 48 bytes 16 *
1 = 16 bytes */

#define ASCII_WIDTH    (FONT_SIZE/2)                      
  /* ASCII: 16*8 24*12 */

/* end here Late Lee*/

/*****************************************************************************

*           new add by Late Lee 2011-05-30

*****************************************************************************/

/**

* __display_ascii – Display an ASCII code on touch screen

* @x: Column

* @y: Row

* @ascii: Which ASCII code to display

* @colidx: Color index(?)

*
This routine display an ASCII code that stored in an array(eg, ASCII_CODE).

*
16×8 ASCII code takes 1 byte, 24*12 ASCII code takes 2 bytes, so we need

* -ASCII_BYTES-.

*/

static void __display_ascii(int x, int y, char *ascii, unsigned colidx)

{

int i, j, k;

unsigned char *p_ascii;

int offset;

offset = (*ascii – 0x20 ) * ASCII_SIZE;  /* find the code in the array */

p_ascii = ASCII_CODE + offset;

for(i=0;i<FONT_SIZE;i++)

for(j=0;j<ASCII_BYTES;j++)

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

if( p_ascii[i*ASCII_BYTES+j] & (0x80>>k) )

//if(*( p_ascii + i*ASCII_BYTES+j) & (0x80>>k))

pixel (x + j*8 + k, y + i, colidx);

}

/**

* put_string_ascii – Display an ASCII string on touch screen

* @x: Column

* @y: Row

* @s: Which string to display

* @colidx: Color index

*/

void put_string_ascii(int x, int y, char *s, unsigned colidx)

{

while (*s != 0) {

__display_ascii(x, y, s, colidx);

x += ASCII_WIDTH;

s++;

}

}

/* not test */

void put_string_center_ascii(int x, int y, char *s, unsigned colidx)

{

size_t sl = strlen (s);

put_string_ascii (x – (sl / 2) * ASCII_WIDTH,

y – FONT_SIZE / 2, s, colidx);

}

/**

*
__display_font_16 – Display a 16×16 (chinese) character on touch screen

* @fp: File pointer points to HZK(ie, HZK16)

* @x: Column

* @y: Row

* @font: Which (chinese) character to display

* @colidx: Color index

* This routine ONLY display 16*16 character.

*
Every character takes two bytes, we show the first 8 bits, then the second 8 bits,

* then the whole world will be shown before us.

*/

static void __display_font_16 (FILE *fp, int x, int y, unsigned char *font, unsigned colidx)

{

int i, j, k;

unsigned char mat[BUF_SIZE]={0};

int qh,wh;

unsigned long offset;

qh = *font   – 0xa0;

wh = *(font+1) – 0xa0;

offset = ( 94*(qh-1) + (wh-1) ) * BUF_SIZE;  /* offset of the character in HZK */

/* read it */

fseek(fp,offset,SEEK_SET);

fread(mat,BUF_SIZE,1,fp);

/* show it */

for(i=0;i<FONT_SIZE;i++)

for(j=0;j<BYTES;j++)

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

if(mat [i*BYTES+j] & (0x80>>k))

pixel (x + j*8 + k, y + i, colidx);

}

/**

*
__display_font_24 – Display a 24×24 (chinese) character on touch screen

* @fp: File pointer points to HZK(ie, HZK24)

* @x: Column

* @y: Row

* @font: Which (chinese) character to display

* @colidx: Color index

*/

static void __display_font_24 (FILE *fp, int x, int y, unsigned char *font, unsigned colidx)

{

unsigned int i, j;

unsigned char mat[FONT_SIZE][BYTES]={{0}};

int qh,wh;

unsigned long offset;

qh = *font   – 0xaf;

wh = *(font+1) – 0xa0;

offset = ( 94*(qh-1) + (wh-1) ) * BUF_SIZE;

fseek(fp,offset,SEEK_SET);

fread(mat,BUF_SIZE,1,fp);

for(i=0;i<FONT_SIZE;i++)

for(j=0;j<FONT_SIZE;j++)

if( mat[j][i>>3] & (0x80>>(i&7)) )

// if ( mat[j][i/8] & (0x80>>i%8) ) /* org */

pixel (x + j, y + i, colidx);

}

/**

*
put_string_hz – Display a (chinese) character string on touch screen

* @fp: File pointer points to HZK(ie, HZK24 or HZK16)

* @x: Column

* @y: Row

* @s: Which string to display(must be ‘unsigned char*’)

* @colidx: Color index

*/

void put_string_hz (FILE *fp, int x, int y, unsigned char *s, unsigned colidx)

{

while (*s != 0) {

#ifdef HZK24

__display_font_24 (fp, x, y, s, colidx);  /* for HZK24 */

#else

__display_font_16 (fp, x, y, s, colidx);

#endif

x += FONT_SIZE;

s += 2;         /* 2 bytes */

}

}

/* not test */

void put_string_center_hz (FILE *fp, int x, int y, unsigned char *s, unsigned colidx)

{

size_t sl = strlen ((char *)s);

put_string_hz (fp, x – (sl/2) * FONT_SIZE, y – FONT_SIZE/2, s, colidx);

}

/**

*
put_font – Display an ASCII or/and (chinese) character string on touch screen

* @fp: File pointer points to HZK(ie, HZK24 or HZK16)

* @x: Column

* @y: Row

* @s: Which string to display

* @colidx: Color index

*/

void put_font(FILE *fp, int x, int y, unsigned char *s, unsigned colidx)

{

while (*s != 0) {

if ( (*s>0xa0) && (*(s+1)>0xa0) ) {

#ifdef HZK24

__display_font_24 (fp, x, y, s, colidx);          /* for HZK24 */

#else

__display_font_16 (fp, x, y, s, colidx);         /* for HZK16 */

#endif

x += FONT_SIZE;

s += 2;         /* 2 bytes */

} else {

__display_ascii (x, y, (char *)s, colidx);

x += ASCII_WIDTH;

s++;         /* 1 byte */

}

}

}

/* not test */

void put_font_center(FILE *fp, int x, int y, unsigned char *s, unsigned colidx)

{

size_t sl = strlen ((char *)s);

put_font (fp, x – (sl/2) * 16, y – 16/2, s, colidx);

}

有关截图:

动fb2png(可由此google搜索“fb2png”,我是异常烦才找到的),交叉编译,在开发板上实施如下命令:

fb2png /dev/fb0 filename.png 5 800 600 24

其实被使的下令为:

fb2png /dev/fb0 filename.png 5 240 320 16

功效图如下(由于图片就产生矣我的芳名,故不由次冲了):

澳门1495娱乐 1

澳门1495娱乐 2

成效图也足瞻仰:

http://www.latelee.org/yetanothertest/display-hz-on-touch-screen.html

现整理的工目录压缩包:

能显得汉字的tslib压缩包

生一样计划是ADC和TS驱动。

 

 

本文固定链接: http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html