STM32并口屏应用实例:点亮你的显示世界之程序篇

系列内容章节如下:

STM32并口屏应用实例:点亮你的显示世界之原理篇

STM32并口屏应用实例:点亮你的显示世界之程序篇

STM32并口屏应用实例:点亮你的显示世界之应用篇

STM32之并口屏应用实例:点亮你的显示世界之程序篇

在嵌入式系统开发中,显示设备是与用户交互的重要界面之一。STM32作为一款功能强大的微控制器,支持多种外设接口,其中并口屏的驱动应用非常广泛,其抗干扰性比其他接口更为出色。本文将通过一个实际案例,介绍如何使用STM32驱动并口屏,并展示其原理和实现过程。

书接上文STM32并口屏应用实例:点亮你的显示世界之原理篇我们继续进行并口屏的显示程序设计。

一、页面刷新设计

1.1 画布设置

这里我们讲一下为什么我们使用画布来完成显示刷新。显示刷新有两种方式:第一,通过寻址后向LCD目标地区写入数据,局部更新显示内容,局部更新是指仅对屏幕中发生变化的区域进行更新,而不重新绘制整个屏幕。这种方式类似于在一张纸上只修改需要更改的部分,而不重新绘制整个画面。第二,画布更新是指每次显示更新时,将整个屏幕的内容重新绘制并发送到LCD显示模块。这种方式类似于在一张纸上重新绘制整个画面,而不是只修改部分区域。

优缺点分析:

画布更新的优点
  1. 实现简单画布更新的实现相对简单,不需要复杂的逻辑来判断哪些区域发生了变化。开发者只需要将完整的图像数据发送到LCD,由硬件完成显示即可。这种方式在软件开发中减少了逻辑复杂度,降低了出错的可能性。示例:假设需要在屏幕上绘制一个动态的图形(如时钟),使用画布更新时,开发者只需在每次更新时重新绘制整个屏幕,而无需考虑哪些像素是未变化的。
  2. 硬件兼容性好对于一些硬件性能较低的系统,全屏更新可以避免复杂的硬件操作。例如,某些LCD驱动芯片可能对局部更新的支持有限,或者需要额外的硬件资源来实现局部刷新。而全屏更新则对硬件要求较低,几乎所有LCD屏都能很好地支持。
  3. 显示效果一致全屏更新可以确保屏幕显示内容的一致性,避免因局部更新可能出现的视觉撕裂或闪烁问题。例如,在快速动态显示(如游戏或动画)中,全屏更新可以提供更流畅的视觉体验。
  4. 适合动态内容对于显示内容频繁变化的场景(如动画、视频播放等),全屏更新可以更高效地处理显示任务。每次更新都重新绘制整个屏幕,避免了局部更新可能带来的复杂性(如多次局部刷新导致的延迟)。
局部更新的缺点
  1. 实现复杂局部更新需要开发者精确地判断哪些区域发生了变化,并仅对这些区域进行更新。这需要额外的逻辑来跟踪屏幕内容的变化,增加了软件实现的复杂度。示例:如果需要在屏幕上动态更新一个数字(如计数器),局部更新需要精确地找到数字所在区域,并仅更新该区域。这需要开发者维护一个屏幕状态的副本,以判断哪些像素需要更新。
  2. 硬件支持有限并非所有LCD屏都支持高效的局部更新。某些屏幕可能需要额外的硬件支持(如DMA、双缓冲等)来实现局部刷新,否则可能会导致性能下降或显示异常。
  3. 可能引入视觉问题局部更新可能会导致屏幕显示的不一致性,例如在更新过程中可能出现闪烁或撕裂现象。特别是在动态显示场景中,局部更新可能无法提供流畅的视觉效果。
  4. 不适合频繁更新对于显示内容频繁变化的场景,局部更新可能并不高效。每次更新都需要判断哪些区域需要刷新,这可能会引入额外的延迟,反而不如全屏更新来得高效。
画布更新的适用场景
  1. 动态显示内容:如动画、视频播放等场景,全屏更新可以提供更流畅的视觉效果。
  2. 硬件资源有限:对于硬件性能较低的系统,全屏更新可以避免复杂的硬件操作。
  3. 开发时间紧张:全屏更新的实现相对简单,适合在开发时间有限的情况下快速实现显示功能。
  4. 显示内容频繁变化:当屏幕内容大部分区域都会发生变化时,全屏更新可以避免复杂的局部更新逻辑。
局部更新的适用场景

尽管局部更新在某些情况下可能不如画布更新高效,但在以下场景中仍有其优势:

  1. 静态显示内容:当屏幕大部分区域是静态的,只有小部分区域需要动态更新时(如仪表盘、电子书等),局部更新可以节省资源。
  2. 低功耗需求:在需要低功耗的应用中,局部更新可以减少屏幕刷新的功耗,延长设备的续航时间。
  3. 硬件支持良好:如果硬件平台对局部更新有良好的支持(如支持DMA操作或双缓冲),局部更新可以提高显示效率。

二、程序设计

2.1 原理

再复述一遍安时原理,与后面要写的程序接口相呼应。

请留意页的定义:PAGE,与平时所讲的"页"并不是一个意思,在此表示 8 个行就是一个"页",

一个个 256*64 点阵的屏分为 8 个"页",从第 0"页"到第 7"页"。

DB7--DB0 的排列方向:数据是从下向上排列的。最低位 D0 是在最上面,最高位 D7 是在最下面。

每一位(bit)数据对应一个点阵,通常"1"代表点亮该点阵,"0"代表关掉该点阵.如下图所示:

整个LCD显示屏就是由这些页(像素点阵)组成。

所以,显示原理就是通过工具降我们要显示的字符转换成点阵数据,然后通过显示接口将显示内容写入到对应的页和列。

2.2 接口设计

寻址函数

c 复制代码
/**********************************************************************************************
函数名称: 	Api_lcd_address        
功能描述: 	写 LCD 行列地址:X 为起始的列地址Column,Y 为起始的行地址Page,x_total,y_total 分别为列地址及行地址的起点到终点的差值
			x_total 表示写多少个Column(写多少列 字库中的一个Byte)
			y_total 表示写多少个Page  (一般都是汉字16x16和字母8x16写2个Page, 宽x高)
输 入:   	无
输 出:   	无
**************************************************************************************************/
void Api_lcd_address(int x, int y, int x_total, int y_total)
{
	x=x-1;
	y=y-1;
	
	Api_transfer_cmd_lcd(0x15);	//Set Column Address
	Api_transfer_data_lcd(x);		
	Api_transfer_data_lcd(x+x_total-1);

	Api_transfer_cmd_lcd(0x75);	//Set Page Address	
	Api_transfer_data_lcd(y);		
	Api_transfer_data_lcd(y+y_total-1);	
	Api_transfer_cmd_lcd(0x30);	
	Api_transfer_cmd_lcd(0x5c);	
}

2.3 显示函数接口

根据上一节的寻址函数,我们可以通过对LCD现实屏对应的行列坐标的像素点进行操作。

2.3.1 清屏函数

c 复制代码
/*************************************************************************************************
函数名称: 	Api_clear_screen        
功能描述: 	清屏 
输 入:   	无
输 出:   	无
*************************************************************************************************/
void Api_clear_screen(void)
{
	int i,j;	
	Api_lcd_address(0,0,256,34);
	for(i=0;i<34;i++)
	{
		for(j=0;j<256;j++)
		{
			Api_transfer_data_lcd(0x00);
		}
	}
}

2.3.2 显示256*64点阵的图像

c 复制代码
/****************************************************************************************************
函数名称: 	Api_disp_256x64       
功能描述: 	显示256*64点阵的图像
输 入:   	
输 出:   	无
***************************************************************************************************/
void Api_disp_256x64(int x, int y, uchar *dp)
{
	int i,j;
	Api_lcd_address(x,y,256,8);
	for(i=0;i<8;i++)	  
	{
		for(j=0;j<256;j++)  
		{
			Api_transfer_data_lcd(*dp);
			dp++;
		}
	}
}

2.3.3 画布定义

c 复制代码
/**
  * @brief  OLED 的宽度和高度
  */
#define LCD_WIDTH              256
#define LCD_HEIGHT             64

//LCD的显存
static uint8_t sg_arrFrameBuffer[LCD_HEIGHT / 8][LCD_WIDTH] = {0};  // LCD画布 [Page][Column]
画布操作函数
c 复制代码
/******************************************************************************************************
函数名称: 	Api_disp_canvas_clear       
功能描述: 	画布绘画
输 入:   	
输 出:   	无
*********************************************************************************************************/
void Api_disp_canvas_clear(void)
{
	memset(sg_arrFrameBuffer, 0x00, sizeof(sg_arrFrameBuffer));
}

/**************************************************************************************************
函数名称: 	Api_disp_canvas_painting       
功能描述: 	画布绘画
输 入:   	
输 出:   	无
*******************************************************************************************************/
void Api_disp_canvas_paint(void)
{
	Api_disp_256x64(0, 1, sg_arrFrameBuffer[0]);
}
汉字字符串显示
c 复制代码
/*****************************************************************************************************
函数名称: 	Api_display_label_16x16       
功能描述: 	写入一组16x16点阵的汉字字符串(字符串表格中需含有此字)
输 入:   	(页,列,汉字字符串)
输 出:   	无
*******************************************************************************************************/
void Api_display_label_16x16(LcdTxType_e type, uchar column, uchar page, uchar *text, int Len)
{
	uchar i,j,k,m;
	uint32_t address = 0;
	j=0;
	
	for(m=0; m<Len; m++)
	{
		i=0;
		if(column>255)
		{
			column=0;
			page+=2;
		}
		if(LCD_PAINTING == type)
		{
			Api_lcd_address(column, page+1, 16,2);
		}	
		if(address !=1)
		{
			for(k=0;k<2;k++)
			{
				for(i=0;i<16;i++)
				{
					sg_arrFrameBuffer[page+k][column+i] = text[address];
					if(LCD_PAINTING == type)
					{
						Api_transfer_data_lcd(text[address]);
					}
					address++;
				}
			}
			j +=2;
		}
		else
		{
			for(k=0;k<2;k++)
			{
				for(i=0;i<16;i++)
				{
					sg_arrFrameBuffer[page+k][column+i] = 0x00;
					if(LCD_PAINTING == type)
					{
						Api_transfer_data_lcd(0x00);
					}
				}
			}
			j++;
		}
		column+=16;
	}
}
数字英文字符串显示
c 复制代码
/*********************************************************************************************************************
函数名称: 	Api_display_string_8x16       
功能描述: 	
输 入:   	
输 出:   	无
*********************************************************************************************************************/
void Api_display_string_8x16(LcdTxType_e type, uchar column, uchar page, uchar *text)
{
	char str = text[0];
	uchar i,j,k;
	int idx = 0, address = 0;
	j=0;
	
	if(column>248)
	{
		column=1;
		page+=2;
	}
	while(text[j]!='\0')
	{	
		str = text[j];
		if(column>248)
		{
			column=1;
			page+=2;
		}
		
		if(LCD_PAINTING == type)
		{
			Api_lcd_address(column, page+1, 8,2);
		}
		if ((idx = IsCharExit(str, ' ', '~')) >= 0)
		{
			address = idx * 16;
			for(k=0;k<2;k++)
			{
				for(i=0;i<8;i++)
				{
					sg_arrFrameBuffer[page+k][column+i] = ASCII_8X16_DATA[address];
					if(LCD_PAINTING == type)
					{
						Api_transfer_data_lcd(ASCII_8X16_DATA[address]);
					}
					address++;
				}
			}
		}
		else
		{
			for(k=0;k<2;k++)
			{
				for(i=0;i<8;i++)
				{
					sg_arrFrameBuffer[page+k][column+i] = 0x00;
					if(LCD_PAINTING == type)
					{
						Api_transfer_data_lcd(0x00);
					}
				}
			}
		}
		column +=8;
		j++;
	}
}

2.4 显示应用

2.4.1 字库

故障信息

c 复制代码
uchar AlarmInfo16x16[]={
/*--  文字:  故  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x08,0x08,0xFF,0x08,0x08,0x0A,0x04,0x1B,0xE8,0x08,0x08,0x0F,0x08,0x08,0x00,
0x00,0xFE,0x84,0x84,0x84,0xFE,0x01,0x02,0x84,0x68,0x10,0x68,0x84,0x02,0x01,0x00,

/*--  文字:  障  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x7F,0x40,0x44,0x5B,0x60,0x08,0x4B,0x6A,0x5A,0xCA,0x5A,0x6A,0x4B,0x08,0x00,
0x00,0xFF,0x10,0x08,0x10,0xE0,0x08,0xE8,0xA8,0xA8,0xBF,0xA8,0xA8,0xE8,0x08,0x00,

/*--  文字:  信  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x01,0x06,0x1F,0xE0,0x00,0x20,0x24,0x24,0xA4,0x64,0x24,0x24,0x24,0x20,0x00,
0x80,0x00,0x00,0xFF,0x00,0x00,0x00,0x9F,0x92,0x92,0x92,0x92,0x92,0x9F,0x00,0x00,

/*--  文字:  息  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x3F,0x2A,0x2A,0x6A,0xAA,0x2A,0x2A,0x2A,0x3F,0x00,0x00,0x00,0x00,
0x02,0x0C,0x00,0xC0,0x9C,0x82,0x82,0xA2,0x9A,0x82,0x82,0xCE,0x00,0x10,0x0C,0x00,
};

无故障

c 复制代码
uchar AlarmNONE16x16[]={
/*--  文字:  无  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x02,0x42,0x42,0x42,0x43,0x7E,0x42,0x43,0x42,0x42,0x42,0x02,0x02,0x00,0x00,
0x01,0x02,0x04,0x08,0x30,0xC0,0x00,0x00,0xFC,0x02,0x02,0x02,0x02,0x0E,0x00,0x00,

/*--  文字:  故  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x08,0x08,0xFF,0x08,0x08,0x0A,0x04,0x1B,0xE8,0x08,0x08,0x0F,0x08,0x08,0x00,
0x00,0xFE,0x84,0x84,0x84,0xFE,0x01,0x02,0x84,0x68,0x10,0x68,0x84,0x02,0x01,0x00,

/*--  文字:  障  --*/
/*--  新宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x7F,0x40,0x44,0x5B,0x60,0x08,0x4B,0x6A,0x5A,0xCA,0x5A,0x6A,0x4B,0x08,0x00,
0x00,0xFF,0x10,0x08,0x10,0xE0,0x08,0xE8,0xA8,0xA8,0xBF,0xA8,0xA8,0xE8,0x08,0x00,
};

字符串&数字

c 复制代码
/**
  * @brief      8 * 16 ASCII字符集点阵.
  */
const unsigned char ASCII_8X16_DATA[] =	
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x00,0x00,0x00,0x00,/*"!",1*/
0x00,0x08,0x30,0x40,0x08,0x30,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/
0x00,0x02,0x03,0x1E,0x02,0x03,0x1E,0x00,0x00,0x20,0xFC,0x20,0x20,0xFC,0x20,0x00,/*"#",3*/
0x00,0x0E,0x11,0x11,0x3F,0x10,0x0C,0x00,0x00,0x18,0x04,0x04,0xFF,0x84,0x78,0x00,/*"$",4*/
0x0F,0x10,0x0F,0x01,0x06,0x18,0x00,0x00,0x00,0x8C,0x30,0xC0,0x78,0x84,0x78,0x00,/*"%",5*/
0x00,0x0F,0x10,0x11,0x0E,0x00,0x00,0x00,0x78,0x84,0xC4,0x34,0x98,0xE4,0x84,0x08,/*"&",6*/
0x00,0x48,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,/*"(",8*/
0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,/*")",9*/
0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,/*"*",10*/
0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,/*"+",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0E,0x00,0x00,0x00,0x00,0x00,/*",",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,/*"-",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,/*".",14*/
0x00,0x00,0x00,0x00,0x03,0x1C,0x20,0x00,0x00,0x06,0x18,0xE0,0x00,0x00,0x00,0x00,/*"/",15*/
0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,/*"0",16*/
0x00,0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,/*"1",17*/
0x00,0x0E,0x10,0x10,0x10,0x10,0x0F,0x00,0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00,/*"2",18*/
0x00,0x0C,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x18,0x04,0x84,0x84,0x44,0x38,0x00,/*"3",19*/
0x00,0x00,0x01,0x02,0x0C,0x1F,0x00,0x00,0x00,0x60,0xA0,0x24,0x24,0xFC,0x24,0x24,/*"4",20*/
0x00,0x1F,0x11,0x11,0x11,0x10,0x10,0x00,0x00,0x98,0x04,0x04,0x04,0x88,0x70,0x00,/*"5",21*/
0x00,0x07,0x08,0x11,0x11,0x09,0x00,0x00,0x00,0xF0,0x88,0x04,0x04,0x04,0xF8,0x00,/*"6",22*/
0x00,0x18,0x10,0x10,0x11,0x16,0x18,0x00,0x00,0x00,0x00,0x7C,0x80,0x00,0x00,0x00,/*"7",23*/
0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00,/*"8",24*/
0x00,0x0F,0x10,0x10,0x10,0x08,0x07,0x00,0x00,0x80,0x48,0x44,0x44,0x88,0xF0,0x00,/*"9",25*/
0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,/*":",26*/
0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,/*";",27*/
0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x00,/*"<",28*/
0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"=",29*/
0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x80,0x00,/*">",30*/
0x00,0x0E,0x12,0x10,0x10,0x11,0x0E,0x00,0x00,0x00,0x00,0x0C,0xEC,0x00,0x00,0x00,/*"?",31*/
0x03,0x0C,0x13,0x14,0x17,0x08,0x07,0x00,0xE0,0x18,0xE4,0x14,0xF4,0x14,0xE8,0x00,/*"@",32*/
0x00,0x00,0x03,0x1C,0x07,0x00,0x00,0x00,0x04,0x3C,0xC4,0x40,0x40,0xE4,0x1C,0x04,/*"A",33*/
0x10,0x1F,0x11,0x11,0x11,0x0E,0x00,0x00,0x04,0xFC,0x04,0x04,0x04,0x88,0x70,0x00,/*"B",34*/
0x03,0x0C,0x10,0x10,0x10,0x10,0x1C,0x00,0xE0,0x18,0x04,0x04,0x04,0x08,0x10,0x00,/*"C",35*/
0x10,0x1F,0x10,0x10,0x10,0x08,0x07,0x00,0x04,0xFC,0x04,0x04,0x04,0x08,0xF0,0x00,/*"D",36*/
0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x04,0xC4,0x04,0x18,0x00,/*"E",37*/
0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x00,0xC0,0x00,0x00,0x00,/*"F",38*/
0x03,0x0C,0x10,0x10,0x10,0x1C,0x00,0x00,0xE0,0x18,0x04,0x04,0x44,0x78,0x40,0x00,/*"G",39*/
0x10,0x1F,0x10,0x00,0x00,0x10,0x1F,0x10,0x04,0xFC,0x84,0x80,0x80,0x84,0xFC,0x04,/*"H",40*/
0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,/*"I",41*/
0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x03,0x01,0x01,0x01,0xFE,0x00,0x00,0x00,/*"J",42*/
0x10,0x1F,0x11,0x03,0x14,0x18,0x10,0x00,0x04,0xFC,0x04,0x80,0x64,0x1C,0x04,0x00,/*"K",43*/
0x10,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0x04,0x04,0x04,0x04,0x0C,0x00,/*"L",44*/
0x10,0x1F,0x1F,0x00,0x1F,0x1F,0x10,0x00,0x04,0xFC,0x80,0x7C,0x80,0xFC,0x04,0x00,/*"M",45*/
0x10,0x1F,0x0C,0x03,0x00,0x10,0x1F,0x10,0x04,0xFC,0x04,0x00,0xE0,0x18,0xFC,0x00,/*"N",46*/
0x07,0x08,0x10,0x10,0x10,0x08,0x07,0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00,/*"O",47*/
0x10,0x1F,0x10,0x10,0x10,0x10,0x0F,0x00,0x04,0xFC,0x84,0x80,0x80,0x80,0x00,0x00,/*"P",48*/
0x07,0x08,0x10,0x10,0x10,0x08,0x07,0x00,0xF0,0x08,0x14,0x14,0x0C,0x0A,0xF2,0x00,/*"Q",49*/
0x10,0x1F,0x11,0x11,0x11,0x11,0x0E,0x00,0x04,0xFC,0x04,0x00,0xC0,0x30,0x0C,0x04,/*"R",50*/
0x00,0x0E,0x11,0x10,0x10,0x10,0x1C,0x00,0x00,0x1C,0x04,0x84,0x84,0x44,0x38,0x00,/*"S",51*/
0x18,0x10,0x10,0x1F,0x10,0x10,0x18,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00,/*"T",52*/
0x10,0x1F,0x10,0x00,0x00,0x10,0x1F,0x10,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00,/*"U",53*/
0x10,0x1E,0x11,0x00,0x00,0x13,0x1C,0x10,0x00,0x00,0xE0,0x1C,0x70,0x80,0x00,0x00,/*"V",54*/
0x10,0x1F,0x00,0x1F,0x00,0x1F,0x10,0x00,0x00,0xC0,0x7C,0x80,0x7C,0xC0,0x00,0x00,/*"W",55*/
0x10,0x18,0x16,0x01,0x01,0x16,0x18,0x10,0x04,0x0C,0x34,0xC0,0xC0,0x34,0x0C,0x04,/*"X",56*/
0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00,/*"Y",57*/
0x08,0x10,0x10,0x10,0x13,0x1C,0x10,0x00,0x04,0x1C,0x64,0x84,0x04,0x04,0x18,0x00,/*"Z",58*/
0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,/*"[",59*/
0x00,0x20,0x1C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x1C,0x03,0x00,/*"\",60*/
0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,/*"]",61*/
0x00,0x00,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/*"_",63*/
0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/
0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x98,0x24,0x24,0x48,0xFC,0x04,0x00,/*"a",65*/
0x08,0x0F,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xFC,0x88,0x04,0x04,0x88,0x70,0x00,/*"b",66*/
0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x88,0x00,/*"c",67*/
0x00,0x00,0x01,0x01,0x01,0x09,0x0F,0x00,0x00,0xF8,0x04,0x04,0x04,0x08,0xFC,0x04,/*"d",68*/
0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0xF8,0x24,0x24,0x24,0x24,0xE8,0x00,/*"e",69*/
0x00,0x01,0x01,0x07,0x09,0x09,0x04,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,/*"f",70*/
0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0xD6,0x29,0x29,0x29,0xC9,0x06,0x00,/*"g",71*/
0x08,0x0F,0x00,0x01,0x01,0x01,0x00,0x00,0x04,0xFC,0x84,0x00,0x00,0x04,0xFC,0x04,/*"h",72*/
0x00,0x01,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,/*"i",73*/
0x00,0x00,0x00,0x01,0x19,0x19,0x00,0x00,0x00,0x03,0x01,0x01,0x01,0xFE,0x00,0x00,/*"j",74*/
0x08,0x0F,0x00,0x00,0x01,0x01,0x01,0x00,0x04,0xFC,0x24,0x60,0x94,0x0C,0x04,0x00,/*"k",75*/
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,/*"l",76*/
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x04,0xFC,0x04,0x00,0xFC,0x04,0x00,0xFC,/*"m",77*/
0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x04,0xFC,0x84,0x00,0x00,0x04,0xFC,0x04,/*"n",78*/
0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00,/*"o",79*/
0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0xFF,0x89,0x04,0x04,0x88,0x70,0x00,/*"p",80*/
0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x00,0x00,0x70,0x88,0x04,0x04,0x89,0xFF,0x01,/*"q",81*/
0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x04,0x04,0xFC,0x84,0x04,0x00,0x80,0x00,/*"r",82*/
0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0xCC,0x24,0x24,0x24,0x24,0x98,0x00,/*"s",83*/
0x00,0x01,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x04,0x04,0x08,0x00,/*"t",84*/
0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0xF8,0x04,0x04,0x04,0x08,0xFC,0x04,/*"u",85*/
0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0xC0,0x30,0x0C,0x30,0xC0,0x00,0x00,/*"v",86*/
0x01,0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x80,0x70,0x0C,0x30,0xE0,0x1C,0x60,0x80,/*"w",87*/
0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x04,0x8C,0x70,0x74,0x8C,0x04,0x00,/*"x",88*/
0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x01,0x00,0x81,0x61,0x1E,0x18,0x60,0x80,0x00,/*"y",89*/
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x84,0x0C,0x34,0x44,0x84,0x0C,0x00,/*"z",90*/
0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,/*"{",91*/
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,/*"|",92*/
0x40,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,/*"}",93*/
0x00,0x40,0x80,0x40,0x40,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/
};

2.4.2 显示示例

进一步的,通过在LCD的页,列坐标上写入定义好的数据,将会显示出我们需要的内容。程序设计将在下一章STM32并口屏应用实例:点亮你的显示世界之程序篇内容中作详细讲解分析。

c 复制代码
char cmd_str[20];

Api_display_string_8x16(type,  20, 1, (uchar *)"4.");
Api_display_label_16x16(type,  36, 1, AlarmInfo16x16, sizeof(AlarmInfo16x16)/32);
Api_display_string_8x16(type, 100, 1, (uchar *)":");
Api_display_label_16x16(type, 134, 1, AlarmNONE16x16, sizeof(AlarmNONE16x16)/32);

Api_display_string_8x16(type, 20, 3, (uchar *)"5.ModSta1 :");
memset(cmd_str, 0, 20);
snprintf(cmd_str, 20, "0x%08X", pSt_DisPara.pU32_DCstatus1);
Api_display_string_8x16(type, 118, 3, (uchar *)cmd_str);

Api_display_string_8x16(type, 20, 5, (uchar *)"6.ModSta2 :");
memset(cmd_str, 0, 20);
snprintf(cmd_str, 20, "0x%08X", pSt_DisPara.pU32_DCstatus2)

三、效果展示

通过上述代码,我们成功驱动了8位并口的液晶屏,实现了参数的显示。如下:

复制代码
特殊符号显示
中英文字符串显示
十六进制数据显示
十进制数据显示

四、总结

本文通过一个实际案例,展示了如何使用STM32驱动8位并口屏。通过硬件连接和软件编程,我们实现了屏幕的初始化、数据传输和显示功能。并口屏以其快速的数据传输能力,在嵌入式显示领域具有广泛的应用前景。希望本文能为你的项目提供参考和启发。

一般LCD都会设计多种通信接口,例如,在我们示例中所应用的JLX25664有设计IIC接口、4线SPI接口,并口包括6800和8080系列的并口,区别只是在通信调用接口不同,寄存器地址和寄存器数据控制写入的逻辑大差不差,需要的可进一步阅读LCD规格书。如果自己找不到的话需要的可以联系交流。

相关推荐
m0_疾风19 分钟前
STM32
stm32·单片机·嵌入式硬件
硬匠的博客34 分钟前
C/C++基础
stm32·单片机·嵌入式硬件
LaoZhangGong1231 小时前
MCU屏和RGB屏
经验分享·stm32·单片机·嵌入式硬件·fsmc
格里姆肖1 小时前
LVGL源码(7):渲染
c语言·stm32·单片机
双叶8361 小时前
(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
c语言·开发语言·数据库·单片机·嵌入式硬件·mongodb·51单片机
无际单片机编程5 小时前
嵌入式软件OTA升级,有哪几种Flash划分方式?
单片机·嵌入式硬件·学习·嵌入式
逼子格5 小时前
七种驱动器综合对比——《器件手册--驱动器》
单片机·嵌入式硬件·硬件工程师·驱动器·硬件测试·电机驱动·硬件笔试真题
Neil今天也要学习5 小时前
永磁同步电机控制算法--转速阻尼补偿和闭环调节电流给定IF控制
单片机·嵌入式硬件
come on world5 小时前
入门51单片机(1)-----点灯大师梦开始的地方
c语言·单片机·嵌入式硬件·学习·51单片机