嵌入式—————显示屏字符显示

 一、嵌入式的定义

 二、中文显示原理

    1.字模的生成
    2.字模的使用
    3.创建对应的字体

三、.c .h文件
     

 一、什么是嵌入式开发

1、弄清楚“嵌入式”的内涵:嵌入式是指将某些程序代码或者某种小型操作系统“内嵌于”集成电路芯片,嵌入式设备是用于控制、监视或者辅助操作机器和设备的装置。嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分。

2、弄清楚常用的嵌入式开发平台:主流的嵌入式平台有三种:ARM平台、DSP平台和FPGA平台。

3、嵌入式开发的主要含义:嵌入式开发是指利用分立元件或集成器件进行电路设计、结构设计,再进行软件编程(通常是高级语言),实验,经过多轮修改设计、制作,最终完成整个系统的开发。这种嵌入式开发,适用于未来产品比较单一,产量比较大,产品开发周期比较长,成本控制比较严格的系统。(简言之,嵌入式开发涵盖了电路硬件设计,软件程序设计,软硬件系统联合调试)

4、弄清楚单片机开发与嵌入式开发的异同:单片机开发也是嵌入式开发的一种,但是单片机开发一般没有涉及到操作系统;我们所学的嵌入式开发后期会涉及到操作系统,难度比纯单片机开发要大,就业面会更加广泛。                               

二、中文显示原理

已知字模是图形数据,而图形在计算机中是由一个个像素点组成的,所以字模实质是一个个像素点数据。为方便处理,我们把字模定义成方块形的像素点阵,且每个像素点只有0和1这两种状态(可以理解为单色图像数据),下图两个宽、高为16x16的像素点阵组成的两个汉字图形,其中的黑色像素点即为文字的笔迹。计算机要表示这样的图形,只需使用16x16个二进制数据位,每个数据位记录一个像素点的状态,把黑色像素点以“1”表示,无色像素点以“0”表示即可。这样的一个汉字图形,使用16x16/8=32个字节来就可以记录下来。

首先,

    我们使用到的软件有Keil5,字模软件

      使用的硬件有STM32开发板

 配置字模的解析顺序,解析顺序要和代码配套,否则会显示乱码。

例如:

 将取好的字模放入代码


DB 08H 20H 04H 40H 7FH FCH 01H 00H 01H 00H 3FH F8H 01H 00H 01H 00H;
DB FFH FEH 01H 00H 01H 00H 7FH FCH 02H 80H 04H 40H 18H 30H E0H 0EH;"美",0

DB 10H 00H 10H FCH 10H 04H 10H 08H FCH 10H 24H 20H 24H 20H 25H FEH;
DB 24H 20H 48H 20H 28H 20H 10H 20H 28H 20H 44H 20H 84H A0H 00H 40H;"好",1

DB 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H FFH FEH;
DB 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H;"一",2

DB 00H 00H 3FH F8H 01H 00H 01H 00H 01H 00H 01H 00H FFH FEH 01H 00H;
DB 02H 80H 02H 80H 04H 40H 04H 40H 08H 20H 10H 10H 20H 08H C0H 06H;"天",3

2. 创建对应字体

打开lcd_show_zn.c文件,添加如下内容,该内容表示一组名字为“ZN_Font16x16”的字体,这组字体里边一共有“匠心柳职”四个字,如果使用这组字体,只有存在字模数据的字才能正常显示。

其中对应的字体也要对应,字体

编写完后,在头文件中添加:extern znsFONT ZN_Font16x16; 语句,这样就能调用ZN_Font16x16字体了

3.设置字体

使用“LCD_SetZNFont”函数设置字体,一般在main函数中while(1)之前调用一次即可,除非要更换字体则需重新调用

4. 使用字体

调用“LCD_DrawCharCN”函数显示中文字体,注意,必须是由字模数据的字才能显示,没有字模数据的字不会显示,所以想显示哪些中文字体,需要生成这些字模的字体并添加到代码中。

LCD_DrawCharCN(210,220,"匠心");   //在坐标点(210,220)显示“匠心”两个中文字体

5.中文和英文混合显示

LCD_DrawCharCN函数既可以显示中文也可以显示英文

LCD_DrawCharCN(210,220,"匠心 Welcom");//显示 匠心 Welcom

 .c文件代码
#include "lcd_show_zn.h"
#include "bsp_lcd.h"

#define ITEM_BIT_NUM  8



//unsigned char zm24x24_index[]="姓名,性别,班级,学号";

//uint8_t ZN24x24_Table[] = {

//	
//};


//znsFONT ZN_Font24x24 = {
//  ZN24x24_Table,
//  zm24x24_index,
//  24, /* Width */
//  24, /* Height */
//};
//*************************************************************************************//


uint8_t ZN16x16_Table[] = {
0x08,0x04,0x08,0x04,0x88,0x04,0x88,0x04,0xBF,0x3F,0xA4,0x04,0x64,0x04,0x24,0x04,
0x24,0x04,0x92,0x3F,0x14,0x04,0x08,0x04,0x14,0x04,0x22,0x04,0xC1,0x7F,0x00,0x00,/*"姓",0*/

0x40,0x00,0x40,0x00,0xE0,0x0F,0x10,0x08,0x28,0x04,0x46,0x02,0x40,0x01,0x80,0x00,
0x60,0x00,0xF8,0x1F,0x17,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xF0,0x1F,0x10,0x10,/*"名",1*/
	
0x08,0x04,0x08,0x04,0x88,0x04,0x88,0x04,0x98,0x3F,0xAA,0x04,0x4A,0x04,0x0A,0x04,
0x09,0x04,0x88,0x3F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0xC8,0x7F,0x08,0x00,/*"性",0*/

0x00,0x20,0xFE,0x20,0x82,0x20,0x82,0x24,0x82,0x24,0xFE,0x24,0x08,0x24,0x08,0x24,
0xFF,0x24,0x88,0x24,0x88,0x24,0x88,0x24,0x84,0x20,0x84,0x20,0x52,0x28,0x21,0x10,/*"别",1*/
	

0x80,0x00,0x80,0x00,0x80,0x00,0xFC,0x1F,0x40,0x00,0x40,0x00,0xFF,0x7F,0x20,0x00,
0x10,0x00,0xF0,0x0F,0x00,0x08,0x00,0x04,0x60,0x02,0x80,0x01,0x00,0x02,0x00,0x04,/*"专",0*/

0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x22,0x22,0x24,0x22,0x24,0x12,0x28,0x12,
0x28,0x0A,0x28,0x06,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0xFF,0x7F,0x00,0x00,/*"业",1*/
	
0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,
0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*"学",0*/

0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x00,0x00,0xFF,0x7F,
0x10,0x00,0x08,0x00,0xF8,0x0F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x05,0x00,0x02,/*"号",1*/

0x08,0x01,0x08,0x01,0x0A,0x01,0x0A,0x3F,0xBE,0x2A,0x4A,0x2A,0x09,0x2A,0x08,0x29,
0x38,0x29,0x8F,0x24,0x4A,0x24,0x08,0x22,0x08,0x22,0x08,0x21,0x88,0x14,0x08,0x08,/*"物",0*/

0x00,0x11,0x3F,0x12,0x12,0x0A,0x12,0x00,0x9E,0x3F,0x12,0x04,0x12,0x04,0x1E,0x04,
0xD2,0x7F,0x12,0x04,0x32,0x0A,0x1E,0x0A,0x13,0x11,0x10,0x11,0x90,0x20,0x50,0x40,/*"联",1*/

0x00,0x00,0xFE,0x3F,0x02,0x20,0x02,0x20,0x42,0x28,0x4A,0x29,0x52,0x2A,0x22,0x24,
0x22,0x24,0x52,0x2A,0x52,0x2A,0x4A,0x29,0x86,0x20,0x02,0x20,0x02,0x28,0x02,0x10,/*"网",2*/

0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"二",3*/

0x00,0x01,0x00,0x01,0x1F,0x7D,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x5F,0x7D,
0x44,0x11,0x24,0x11,0x04,0x11,0x9C,0x10,0x87,0x10,0x42,0x7C,0x20,0x00,0x10,0x00,/*"班",4*/





};

unsigned char zm16x16_index[]="姓名性别专业学号物联网二班";


znsFONT ZN_Font16x16 = {
  ZN16x16_Table,
  zm16x16_index,
  16, /* Width */
  16, /* Height */
};






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

unsigned char zm48x48_index[]="2022032";

uint8_t ZN48x48_Table[] = {


0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",0*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",1*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",2*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",3*/

0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",4*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x40,0x20,0x18,0x20,0x40,0x42,0x42,0x3C,0x00,0x00,/*"3",5*/

0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x40,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",6*/
};


znsFONT ZN_Font48x48 = {
  ZN48x48_Table,
  zm48x48_index,
  48, /* Width */
  48, /* Height */
};


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

static znsFONT *LCD_ZNCurrentfonts;


void _LCD_DrawCharCN(uint16_t Xpos, uint16_t Ypos,uint8_t *zn_table)
{
 uint32_t index = 0, counter = 0, xpos =0;
 uint32_t  Xaddress = 0;

 xpos = Ypos*LCD_PIXEL_WIDTH*2;
 Xaddress += Xpos;
 
 uint8_t tt = LCD_ZNCurrentfonts->Width/ITEM_BIT_NUM;   //一行像素由多少个字节构成
 uint16_t CurrentBackColor = 0;
 uint16_t CurrentTextColor = 0;
 uint32_t CurrentFrameBuffer = LCD_SetCursor(0,0);
 LCD_GetColors(&CurrentTextColor,&CurrentBackColor);
 for(index = 0; index < LCD_ZNCurrentfonts->Height*LCD_ZNCurrentfonts->Width/ITEM_BIT_NUM; index+=tt)  //一个中的一行像素
 {

   for(counter = 0; counter < LCD_ZNCurrentfonts->Width; counter++) ///一个自己的8个位
   {
      uint8_t index1 = counter/ITEM_BIT_NUM;
      uint8_t counter1 = counter%ITEM_BIT_NUM;
     if((zn_table[index+index1]&(0x1 << counter1)) == 0x00)
     {
         /* Write data value to all SDRAM memory */
        *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentBackColor;
     }
     else
     {
         /* Write data value to all SDRAM memory */
        *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentTextColor;
     }
     Xaddress++;
   }
     Xaddress += (LCD_PIXEL_WIDTH - LCD_ZNCurrentfonts->Width);  //X左边回到新一行的起点
 }
}

unsigned char  cnN(unsigned char *s){
	uint16_t  i;
	for(i=0;LCD_ZNCurrentfonts->ZN_index[i]!=0;i+=2)
		if(LCD_ZNCurrentfonts->ZN_index[i]==*s && LCD_ZNCurrentfonts->ZN_index[i+1]==*(s+1))
            return i/2; 
        
    return 255;
}

void LCD_SetZNFont(znsFONT *fonts)
{
  LCD_ZNCurrentfonts = fonts;

}

void LCD_DrawCharCN(uint16_t Xpos, uint16_t Ypos,uint8_t *s)
{
  unsigned char  i;
	for(i=0;s[i]!=0;i++)
  {
		if(s[i]<0x80)
    { 	//英文
      LCD_DisplayChar(Ypos,Xpos,s[i]);
      Xpos+=LCD_GetFont()->Width;
		}else
    {			
            int indd = cnN(&s[i]);
            if(indd!=255)
            {
              _LCD_DrawCharCN(Xpos,Ypos,(uint8_t*)&(LCD_ZNCurrentfonts->table[indd*(LCD_ZNCurrentfonts->Width*LCD_ZNCurrentfonts->Height/ITEM_BIT_NUM)]));	
              Xpos+=LCD_ZNCurrentfonts->Width;
              i+=1;
            }
		}
		
    if(Xpos>LCD_PIXEL_WIDTH)
    {	 //换行处理
			Xpos=0;
			Ypos+=LCD_ZNCurrentfonts->Height;
		}
	}
}

.h文件代码
#ifndef __LCD_SHOW_ZN_H_
#define __LCD_SHOW_ZN_H_

#include "stm32F4xx.h"



/*字体格式*/
typedef struct _zntFont
{    
  const uint8_t *table;    /*指向字模数据的指针*/
  const uint8_t *ZN_index;    /*指向字模数据的指针*/
  uint16_t Width;           /*字模的像素宽度*/
  uint16_t Height;          /*字模的像素高度*/  
}znsFONT;

/*这些可选的字体格式定义在fonts.c文件*/
extern znsFONT ZN_Font16x16; 
extern znsFONT ZN_Font24x24;
extern znsFONT ZN_Font48x48;

void LCD_SetZNFont(znsFONT *fonts);
void LCD_DrawCharCN(uint16_t Xpos, uint16_t Ypos,uint8_t *s);


#endif
main.c 文件中如何引用相关函数
LCD_DisplayStringLineEx(520,100,100,100,"发财",0);

LCD_DispString_EN_CH(210,120,"姓名");
LCD_DispString_EN_CH(210,220,"性别");
LCD_DispString_EN_CH(210,320,"专业");
LCD_DispString_EN_CH(210,420,"学号");
				
LCD_DispString_EN_CH(310,120,"XXX");
LCD_DispString_EN_CH(310,220,"女");
LCD_DispString_EN_CH(310,320,"物联网二班");
LCD_DispString_EN_CH(310,420,"20220320031");


//其中210,120是字符显示坐标,
//  LCD_DisplayStringLineEx
//  LCD_DispString_EN_CH  这两个函数都有显示字符的作用

    1在上面显示中文时,需要先对要显示的中文字符进行取模,没取模的字符无法显示。如果我们设计一个系统,显示用户输入的文字,我们无法预测用户会输入什么文字,那只能将所有常用的中文字符全部取模,才能保证用户输入的文字能正常显示。

    可以将所有常用字体取模并打包成一个文件,这个文件就是字体文件,想要显示哪个字符,就去字体文件里边查找其对应的字模数据,然后读取字模数据并通过显示屏显示,就完成了一个中文字符的显示。

    计算机显示文字的原理也是如此,当选择某一种字体后,显示文字时就会去对应的字体文件中寻找文字的字模

Window系统的字体文件存放在C:\Windows\Fonts路径中

2运用字模软件生成字体文件后使用会方便许多,缺点就是编译较慢。

 

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值