系列内容章节如下:
STM32并口屏应用实例:点亮你的显示世界之原理篇
STM32并口屏应用实例:点亮你的显示世界之程序篇
STM32并口屏应用实例:点亮你的显示世界之应用篇
STM32之并口屏应用实例:点亮你的显示世界之程序篇
在嵌入式系统开发中,显示设备是与用户交互的重要界面之一。STM32作为一款功能强大的微控制器,支持多种外设接口,其中并口屏的驱动应用非常广泛,其抗干扰性比其他接口更为出色。本文将通过一个实际案例,介绍如何使用STM32驱动并口屏,并展示其原理和实现过程。
书接上文STM32并口屏应用实例:点亮你的显示世界之原理篇我们继续进行并口屏的显示程序设计。
一、页面刷新设计
1.1 画布设置
这里我们讲一下为什么我们使用画布来完成显示刷新。显示刷新有两种方式:第一,通过寻址后向LCD目标地区写入数据,局部更新显示内容,局部更新是指仅对屏幕中发生变化的区域进行更新,而不重新绘制整个屏幕。这种方式类似于在一张纸上只修改需要更改的部分,而不重新绘制整个画面。第二,画布更新是指每次显示更新时,将整个屏幕的内容重新绘制并发送到LCD显示模块。这种方式类似于在一张纸上重新绘制整个画面,而不是只修改部分区域。
优缺点分析:
画布更新的优点
- 实现简单画布更新的实现相对简单,不需要复杂的逻辑来判断哪些区域发生了变化。开发者只需要将完整的图像数据发送到LCD,由硬件完成显示即可。这种方式在软件开发中减少了逻辑复杂度,降低了出错的可能性。示例:假设需要在屏幕上绘制一个动态的图形(如时钟),使用画布更新时,开发者只需在每次更新时重新绘制整个屏幕,而无需考虑哪些像素是未变化的。
- 硬件兼容性好对于一些硬件性能较低的系统,全屏更新可以避免复杂的硬件操作。例如,某些LCD驱动芯片可能对局部更新的支持有限,或者需要额外的硬件资源来实现局部刷新。而全屏更新则对硬件要求较低,几乎所有LCD屏都能很好地支持。
- 显示效果一致全屏更新可以确保屏幕显示内容的一致性,避免因局部更新可能出现的视觉撕裂或闪烁问题。例如,在快速动态显示(如游戏或动画)中,全屏更新可以提供更流畅的视觉体验。
- 适合动态内容对于显示内容频繁变化的场景(如动画、视频播放等),全屏更新可以更高效地处理显示任务。每次更新都重新绘制整个屏幕,避免了局部更新可能带来的复杂性(如多次局部刷新导致的延迟)。
局部更新的缺点
- 实现复杂局部更新需要开发者精确地判断哪些区域发生了变化,并仅对这些区域进行更新。这需要额外的逻辑来跟踪屏幕内容的变化,增加了软件实现的复杂度。示例:如果需要在屏幕上动态更新一个数字(如计数器),局部更新需要精确地找到数字所在区域,并仅更新该区域。这需要开发者维护一个屏幕状态的副本,以判断哪些像素需要更新。
- 硬件支持有限并非所有LCD屏都支持高效的局部更新。某些屏幕可能需要额外的硬件支持(如DMA、双缓冲等)来实现局部刷新,否则可能会导致性能下降或显示异常。
- 可能引入视觉问题局部更新可能会导致屏幕显示的不一致性,例如在更新过程中可能出现闪烁或撕裂现象。特别是在动态显示场景中,局部更新可能无法提供流畅的视觉效果。
- 不适合频繁更新对于显示内容频繁变化的场景,局部更新可能并不高效。每次更新都需要判断哪些区域需要刷新,这可能会引入额外的延迟,反而不如全屏更新来得高效。
画布更新的适用场景
- 动态显示内容:如动画、视频播放等场景,全屏更新可以提供更流畅的视觉效果。
- 硬件资源有限:对于硬件性能较低的系统,全屏更新可以避免复杂的硬件操作。
- 开发时间紧张:全屏更新的实现相对简单,适合在开发时间有限的情况下快速实现显示功能。
- 显示内容频繁变化:当屏幕内容大部分区域都会发生变化时,全屏更新可以避免复杂的局部更新逻辑。
局部更新的适用场景
尽管局部更新在某些情况下可能不如画布更新高效,但在以下场景中仍有其优势:
- 静态显示内容:当屏幕大部分区域是静态的,只有小部分区域需要动态更新时(如仪表盘、电子书等),局部更新可以节省资源。
- 低功耗需求:在需要低功耗的应用中,局部更新可以减少屏幕刷新的功耗,延长设备的续航时间。
- 硬件支持良好:如果硬件平台对局部更新有良好的支持(如支持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规格书。如果自己找不到的话需要的可以联系交流。