如何在tft中显示汉字?

如何在tft中显示汉字?,第1张

TFT汉字显示需要一个个点去显示

一、字库格式是先行后列,以12*12格式为例,字库的前两字节为第一行点阵(第一字节8bit,第二字节的高4bit),共 24 字节为一个汉字的内容。其它字库依此类推

二、显示时从高bit位(bit7)到低bit位(bit0)依次显示,该bit位为1则输出字符颜色,为0则输出背景色

三、下面是一个字符的显示例程,从 8*5,12*6,16*8,24*12,。。。

const unsigned long tab_addr_offset_asc[]=

{

offset_asc_8,offset_asc_12,offset_asc_16,offset_asc_24,offset_asc_32,offset_asc_40,offset_asc_48,offset_asc_56,

offset_asc_64,offset_asc_72,offset_asc_80,offset_asc_96,offset_asc_128,offset_asc_end,

}

const unsigned short tab_len_asc[]=

{

0x08,0x0c,0x10,0x30,0x40,0x78,0x90,0xe0,0x100,0x168,0x190,0x240,0x400,

}

const unsigned char tab_xw_asc[]=

{

0x04,0x05,0x07,0x0b,0x0f,0x13,0x17,0x1b,0x1f,0x23,0x27,0x2f,0x3f,

}

const unsigned char tab_yw_asc[]=

{

0x07,0x0b,0x0f,0x17,0x1f,0x27,0x2f,0x37,0x3f,0x47,0x4f,0x5f,0x7f,

}

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

// 这是一个字符显示程序, 显示数据由 lcd_byte_data 传递

// 显示到 pos_x(行), pos_y(列)

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

void wr_lcd_hex(unsigned char lcd_byte_data,unsigned char font_ord)

{

unsigned char i,j,k

unsigned char x_w,y_w //行列位宽

unsigned char x_byte_w //行字节宽

unsigned char zoom_bak

unsigned short b_order

x_w=tab_xw_asc[font_ord]

y_w=tab_yw_asc[font_ord]

x_byte_w=x_w

x_byte_w+=0x07

x_byte_w>>=0x03 //每行字节数

clrwdt()

ex_ee_addr.w[0]=lcd_byte_data

ex_ee_addr.w[1]=0x00

ex_ee_addr.val*=tab_len_asc[font_ord]

ex_ee_addr.val+=tab_addr_offset_asc[font_ord]

lcd_set_rang(lcd_pos_x,lcd_pos_x+x_w,lcd_pos_y,lcd_pos_y+y_w)//设定写入区域

b_order=0x00

set_lcd_cs_on

lcd_wr_cmd(lcd_cmd_wr_rams)//写存储器,后跟内容

zoom_bak=zoom

zoom=0x01

x_w++ //宽度实际位数

k=max_45db_buff //进入下面循环程序时自动读入字库

while (b_order<tab_len_asc[font_ord])

{

if (k>=max_45db_buff) //续读字库

{

rd_45db_data(ex_ee_addr.val,rd_45db_buff,max_45db_buff)//读字库

ex_ee_addr.val+=max_45db_buff

i=x_w

k=0x00

}

j=0x80

while ((i)&&(j))

{

if (rd_45db_buff[k]&j)

lcd_wr_color(lcd_word_color)

else

lcd_wr_color(lcd_back_color)

j>>=0x01

i--

}

k++

b_order++

if (i==0x00) //当前行写完,更新行长

i=x_w

}

zoom=zoom_bak

set_lcd_cs_off

//调整到下一显示位置

lcd_pos_x+=x_w

if (lcd_pos_x>max_lcd_pos_x)

{

lcd_pos_x=0x00

lcd_pos_y+=y_w+0x01

if (lcd_pos_y>max_lcd_pos_y)

lcd_pos_y=0x00

}

}

TFT-LCD 即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD 与无源 TN-LCD、STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD 也被叫做真彩液晶显示器。

步骤:

1 ) 设置 STM32 与 与 TFTLCD 模块相连接的 IO 。

这一步,先将我们与 TFTLCD 模块相连的 IO 口进行初始化,以便驱动 LCD。这里需要根据连接电路以及 TFTLCD 模块的设置来确定。

2 ) 初始化 TFTLCD 模块。

即图 16.1.4 的初始化序列,这里我们没有硬复位 LCD,因为 MiniSTM32 开发板的 LCD 接口,将 TFTLCD 的 RST 同 STM32 的 RESET 连接在一起了,只要按下开发板的 RESET 键,就会对 LCD 进行硬复位。初始化序列,就是向 LCD 控制器写入一系列的设置值(比如伽马校准),这些初始化序列一般 LCD 供应商会提供给客户,我们直接使用这些序列即可,不需要深入研究。在初始化之后,LCD 才可以正常使用。

3 ) 通过函数将字符和数字显示到 TFTLCD 模块上。

这一步则通过图 16.1.4 左侧的流程,即:设置坐标写 GRAM 指令写 GRAM 来实现,但是这个步骤,只是一个点的处理,我们要显示字符/数字,就必须要多次使用这个步骤,从而达到显示字符/数字的目标,所以需要设计一个函数来实现数字/字符的显示,之后调用该函数,就可以实现数字/字符的显示了。

可以修改LCD长宽型号等参数便于移植。

封装的主要函数有:

void LCD_Init(void) //初始化

void LCD_DisplayOn(void) //开显示

void LCD_DisplayOff(void) //关显示

void LCD_Clear(u16 Color) //清屏

void LCD_SetCursor(u16 Xpos, u16 Ypos)//设置光标

void LCD_DrawPoint(u16 x,u16 y) //画点

void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)//快速画点

u16 LCD_ReadPoint(u16 x,u16 y) //读点

void LCD_Draw_Circle(u16 x0,u16 y0,u8 r) //画圆

void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) //画线

void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)//画矩形

void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color) //填充单色

void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color) //填充指定颜色

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode) //显示一个字符

void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size) //显示一个数字

void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode) //显示 数字

void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p) //显示一个字符串,12/16字体

void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)

u16 LCD_ReadReg(u16 LCD_Reg)

void LCD_WriteRAM_Prepare(void)

void LCD_WriteRAM(u16 RGB_Code)

void LCD_Scan_Dir(u8 dir) //设置屏扫描方向

void LCD_Display_Dir(u8 dir) //设置屏幕显示方向

void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height) //设置窗口

STM32Cube移植

(1)分析

硬件用开发板已经连接好,主要是软件对端口的一些初始化配置。还有驱动的移植。

(2)TFTLCD模块接口

你现在看到的这两个函数LCD_ShowString()ChineseChar()是你在上层调用的,具体的函数定义你要去看底层是怎么实现的。我先简单介绍下着两个函数

LCD_ShowString(12,60,colors[0],colors[7],"-")应该是讲屏幕上x=12,y=60的地方显示一个“-”字符,字符颜色应该是你定义的colors[0],TFT屏的背景颜色是colors[7],这两个是你函数库自己定义的,可以改。

ChineseChar(20,60,1,colors[0],colors[7],1) //带 这个函数和上面那个函数大致相同,至于为什么会显示“带”,是因为最后那个1,这个程序你应该定义一个数组,在这个数组里面对你所要显示的字全部编码并存在这个数组中,最后你只需用想调用数组下标那样调用这个汉子。

至于你想显示班级、姓名 只需用把班级姓名进行编码就可以调用这个ChineseChar()函数进行显示

其实很简单的,只需用该几步就可以达到你想要的,不难~~


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11921378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存