任务7-1 OLED液晶屏显示中文字符_第1页
任务7-1 OLED液晶屏显示中文字符_第2页
任务7-1 OLED液晶屏显示中文字符_第3页
任务7-1 OLED液晶屏显示中文字符_第4页
任务7-1 OLED液晶屏显示中文字符_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32EMBEDDEDTECHNOLOGYSTM32嵌入式技术及应用任务7-1OLED液晶屏显示中文字符项目七

太阳能自动追光系统的设计与实现主控芯片STM32F103显示模块0.96"OLED核心功能汉字显示CONTENTS目录01任务目标基于STM32F103微处理器,实现OLED屏幕上显示中文汉字"您好,中国!"的功能,掌握汉字编码原理和OLED驱动技术02知识储备汉字字符编码原理、LCD屏幕显示机制、点阵字模结构、显示字库与编码对应关系03任务实施硬件连接方案、程序设计流程、字模提取方法、工程编译调试、运行结果验证04任务总结与评价核心知识点回顾、技能提升总结、提升训练任务、综合评价标准建议课时:4学时难度等级:中级01TASKOBJECTIVES任务目标核心任务本任务基于STM32F103微处理器,实现OLED屏幕上显示中文汉字"您好,中国!"的功能。通过对相关函数的调用和初始化操作,将特定的中文字符显示在OLED屏幕上。汉字编码原理掌握GB2312字符集的区位结构、机内码与区位码的转换方法,理解汉字在计算机中的存储和传输机制字模提取方法理解点阵字模的结构原理,掌握使用PCtoLCD2002软件提取汉字字模的完整流程和操作技巧OLED驱动技术掌握I2C接口通信协议,学会OLED屏幕初始化配置和显示函数的编写,实现汉字在OLED上的正确显示学习成果完成本任务后,你将能够独立进行汉字字模提取、编写OLED显示程序、完成软硬件联调,为后续复杂嵌入式系统的人机交互开发打下坚实基础。CHAPTER02知识储备汉字编码原理·LCD显示机制·字库系统编码系统GB2312标准显示原理点阵字模存储结构字库映射CHARACTERENCODING汉字字符编码概述常见汉字字符集在计算机领域中,为了有效地处理和显示汉字,开发了多种汉字字符集标准:GB2312-80国家标准,6763个汉字GBK扩展标准,21003个汉字Big5繁体中文标准Unicode国际标准编码嵌入式设备的首选GB2312字符集成为了嵌入式设备中最常用的选择,原因在于其适中的字符数量和合理的存储空间需求,完美平衡了功能完整性和资源占用。GB2312字符集详解收录字符总数74456763汉字数量682汉字符号组织结构整个字符集被划分为94个区,每个区包含94个位置,形成94×94的字符矩阵。每个字符在矩阵中都有唯一的位置,通过"区"和"位"两个维度确定,称为区位码。ZONESTRUCTUREGB2312字符集的区位结构区位分布表01-09区特殊符号区标点、数字、字母等10-15区保留未使用预留扩展空间16-55区一级汉字区按拼音排序,3755字56-87区二级汉字区按部首/笔画排序88-94区保留未使用预留扩展空间一级汉字区位范围16-55区汉字数量3755个排序方式拼音排序包含常用汉字,使用频率最高二级汉字区位范围56-87区汉字数量3008个排序方式部首/笔画包含次常用汉字和生僻字特别说明GB2312中的汉字"啊"是该字符集中的第一个汉字,其区位码为:区码16(0x10)位码1(0x01)INTERNALCODECONVERSION机内码与区位码的转换为什么需要机内码?在程序设计中,由于运算和存储能力的限制,往往需要将基础ASCII码和GB2312汉字区位码混合使用。核心问题:单纯从二进制编码上,无法区分基础ASCII码和GB2312汉字区位码。解决方案采用机内码来表示每个汉字及符号,通过特定的编码规则,使计算机能够轻松区分ASCII码和汉字编码。区分原理基础ASCII码只占用一个字节的低7位,最高位为0;而加上0xA0后的区字节和位字节的最高位均为1,因此可以通过最高位轻松区分。机内码结构双字节组成第一个字节区字节范围:0xA1~0xF7第二个字节位字节范围:0xA1~0xFE转换公式区区字节=区码+0xA0位位字节=位码+0xA0实例:汉字"啊"区位码:区码=16,位码=1机内码:区字节0xB0(0xA0+16),位字节0xA1(0xA0+1)DISPLAYPRINCIPLE字符在LCD屏幕显示原理点阵显示在嵌入式设备的液晶屏上,中英文和阿拉伯数字等字符通常以点阵形式显示。每个字符由若干个像素点组成的矩阵构成。字模概念点阵显示对应的编码信息称为字模,而字模的集合称为字库。字模数据决定了屏幕上每个像素点的亮灭状态。数据存储在C语言编程中,字模通常以数组的形式出现。数组中的每个元素对应点阵中的一行或一列数据。显示工作机制1像素点表示点阵中的每一个像素点可以用一个位(bit)来存储:位=0:不显示位=1:显示2字节存储1个字节可以存储8个像素点的信息。多个字节组合起来,就能完整表示整个点阵字符。3单色LCD显示在单色LCD屏幕上,字模数组中数据的每一位直接对应屏幕上的每一个像素点的亮灭状态,实现简单直接。4彩色LCD显示在彩色LCD屏幕上,一个像素点的颜色值用16位数据表示。显示字符时,需要将字模数组中的每一位转换为显示字符的字体颜色或背景色。8×16DOTMATRIX英文字符8×16点阵字模以字母"W"为例英文和阿拉伯数字字符常用的8×16点阵结构:点阵每一行的分辨率为8,正好对应一个字节的8位;16行正好对应16个字节。存储计算每行像素数8=1字节总行数16行总字节数16字节取模方法按从左到右的顺序,从第一列开始向下取8个点作为一个字节,然后从第二列开始向下取8个点作为第二个字节……依此类推,从低位到高位取英文字母的字模数据。字模数组表示C语言数组定义uint8_tconstchar_lib[16]={0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00};数组结构说明数据类型:uint8_t(无符号8位整数)数组长度:16(对应16行)存储方式:每个元素表示一行的8个像素数据格式:十六进制表示数据解析示例以0x08为例:二进制为00001000,表示第4个像素点亮,其余熄灭。16×16DOTMATRIX汉字字符16×16点阵字模以汉字"国"为例汉字字符因其笔画结构复杂,相较于英文和阿拉伯数字,常采用16×16的点阵字模来进行表示,以保证显示效果的清晰度。结构特点点阵大小16×16每行字节数2字节(左右各1字节)总行数16行总字节数32字节与英文字模的异同相同点:都采用从低位到高位的取模方式,每个字节表示8个像素点不同点:汉字每行需要2个字节(左右两部分),总字节数是英文字模的2倍汉字"国"字模数组C语言数组定义uint8_tconsthz_lib[32]={0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x4A,0x4C,0x48,0x40,0xFF,0x00,0x00};数组结构说明前16字节左半部分(第1-8列)后16字节右半部分(第9-16列)数据解析示例以0xFE为例:二进制为11111110,表示第2-8个像素点亮,第1个熄灭,形成左侧边框。FONTLIBRARY&ENCODING显示字库与字符编码的关系编码解决的问题字符编码解决了字符在计算机中的存储和传输问题。它定义了字符与二进制数据之间的映射关系,使计算机能够识别和处理各种字符。字库解决的问题要实现屏幕显示,还需要字库的支持。字库包含了每个字符对应的点阵字模数据,是字符在屏幕上可视化的关键。编码与字库的对应关系ASCII字符常用字库8×16点阵字符范围32-126存储方式二维数组汉字字符常用字库16×16点阵字符范围GB2312区位码存储方式二维数组核心优势ASCII码点阵字库和汉字区位码点阵字库内部字模的排列分别与ASCII码表、区位码码表中字符的排列顺序一致。这种对应关系为程序设计带来便利:✓快速定位字模✓提高开发效率✓降低编程难度ASCIIINDEXCALCULATIONASCII码字库索引计算对应关系ASCII码中32-126的字符按顺序排列,可将显示字库编成二维数组:数组第二维固定为16每字模16字节(8×16点阵)数组第一维ASCII码-32得到的序号索引计算公式序号=ASCII码-32实例演示字符'A'的索引计算ASCII编码65(0x41)计算公式65-32字库序号33字库数组定义constunsignedcharasc2_1206[95][12]={{0x00,0x00,...},//""序号0{0x00,0x00,...},//"!"序号1...{0x00,0x00,...},//"A"序号33...};关键说明:数组第一维大小为95,对应ASCII码32-126共95个可显示字符。GB2312INDEXCALCULATIONGB2312汉字字库索引计算计算步骤1机内码转区位码区码=区字节-0xA0位码=位字节-0xA02计算字库位置位置=(区码-16)×94+(位码-1)公式说明区码-16:一级汉字从16区开始×94:每区94个位置位码-1:位置从0开始计数实例:汉字"啊"已知条件区字节0xB0位字节0xA1计算过程①区码=0xB0-0xA0=16②位码=0xA1-0xA0=1③位置=(16-16)×94+(1-1)计算结果0汉字"啊"在字库中的位置FONTLIBRARYCODE汉字字库代码示例"您好,中国!"字库数组unsignedcharHZK_16x16[6][32]={//"您"-序号0{0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00},//"好"-序号1{0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00},//","-序号2{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},//"中"-序号3{0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00},//"国"-序号4{0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x4A,0x4C,0x48,0x40,0xFF,0x00,0x00},//"!"-序号5{0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};数组结构第一维:6个汉字第二维:32字节/字字模排列前16字节:左半部分后16字节:右半部分应用说明通过索引N直接访问对应汉字的字模数据CHAPTER03任务实施硬件设计·程序开发·调试验证主控芯片STM32F103通信接口I2C协议开发环境KeilMDKIMPLEMENTATIONREQUIREMENTS任务实现要求硬件设计使用STM32F103作为主控芯片,连接OLED液晶屏OLED液晶屏采用I2C或SPI接口与单片机通信确保连接正确,电源稳定,信号完整程序设计初始化I2C或SPI接口,配置通信参数编写OLED液晶屏的初始化函数和基本显示函数获取中文字符的点阵数据,编写显示函数功能验证搭建实物作品,验证OLED液晶屏的显示功能检查中文字符的显示效果,确保清晰无乱码调整系统参数(显示位置、字体大小等)系统联调进行硬件实测,观察OLED液晶屏的显示结果特别关注中文字符的显示效果记录并修复问题(显示乱码、位置偏移等)质量目标:确保显示稳定可靠,满足设计要求,中文字符显示清晰、位置准确、无乱码现象。HARDWARECONNECTION硬件连接方案OLED显示模块屏幕尺寸0.96英寸分辨率128×64接口类型4引脚I2C页面结构64行分成8页,每页中有8行数据。显示数据方式:先选定页,再选定列,逐个读或写数据。微处理器选用STM32F103C8T6作为主控芯片,通过4引脚的I2C接口与OLED屏幕通信。引脚连接图I2C通信连接示意图通信协议I2C引脚数量4个I2CCONNECTIONTABLEI2C接口与STM32连接表引脚连接关系序号OLED模块单片机STM32功能说明1VCC3.3VDD电源正极,供电电压3.3V2SCLPB13I2C时钟线,同步数据传输3SDAPB12I2C数据线,双向传输数据4GNDGND电源负极,接地注意事项确保VCC连接3.3V,不要接5V,否则可能损坏OLED模块I2C特性SCL和SDA需要配置为开漏输出模式,并接上拉电阻连接检查连接完成后,使用万用表检查各引脚是否正确连通PROGRAMDESIGNFLOW程序设计流程1初始化外设•时钟初始化•GPIO配置•I2C初始化2OLED初始化•配置工作模式•设置对比度•清屏操作3字模处理•提取汉字字模•生成字库数组•存储到代码4显示函数•编写显示函数•设置显示位置•写入字模数据5主函数实现•调用初始化•显示中文字符•循环保持流程说明1初始化相关外设使能GPIO和I2C外设时钟,配置GPIO引脚为开漏输出模式,编写I2C基础通信函数(起始、停止、发送字节等)。2OLED屏幕初始化向OLED发送一系列配置命令,包括设置显示模式、对比度、扫描方向、页面地址等参数,最后打开显示。3字模数据处理使用PCtoLCD2002软件提取汉字字模数据,将生成的字模数组存储到代码文件中,供显示函数调用。4显示函数编写编写OLED_ShowCN函数,实现汉字显示功能。函数需要设置显示位置、计算字模地址、分上下两部分写入字模数据。5主函数实现在主函数中依次调用初始化函数和显示函数,实现中文"您好,中国!"的显示。最后进入循环保持显示状态。关键提示严格按照流程顺序执行,确保每个步骤都正确完成,特别是OLED初始化命令的顺序和参数。PERIPHERALINITIALIZATION初始化相关外设时钟初始化使能GPIO和I2C外设的时钟,为后续GPIO引脚的配置做准备。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);函数说明:使能GPIOB时钟,因为PB12和PB13用于I2C通信。GPIO初始化将用于I2C通信的GPIO引脚(PB12、PB13)配置为开漏输出模式。GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);关键配置:开漏输出模式(GPIO_Mode_Out_OD)是I2C协议的要求。I2C初始化编写I2C初始化函数,包括起始、停止、发送字节、等待应答等基本操作。voidi2c_Start(void){I2C_SDA_1();I2C_SCL_1();delay_us(4);I2C_SDA_0();delay_us(4);I2C_SCL_0();}时序要求:严格按照I2C协议时序,注意延时保证信号稳定。初始化顺序:必须先使能时钟,再配置GPIO,最后初始化I2C通信。顺序错误会导致初始化失败。OLEDINITIALIZATIONOLED屏幕初始化OLED_Init函数详解voidOLED_Init(void){delay_ms(100);//上电延时,确保OLED模块稳定WriteCmd(0xAE);//关闭显示WriteCmd(0x20);//设置内存寻址模式WriteCmd(0x10);//设置水平寻址模式(00:水平;01:垂直;10:页面模式)WriteCmd(0xb0);//设置页面起始地址(页面寻址模式下,0-7)WriteCmd(0xc8);//设置COM输出扫描方向WriteCmd(0x00);//设置低列地址WriteCmd(0x10);//设置高列地址WriteCmd(0x40);//设置显示起始行地址WriteCmd(0x81);//设置对比度控制寄存器WriteCmd(0xff);//亮度调节,0x00~0xff,值越大亮度越高WriteCmd(0xa1);//设置段重映射,0映射到127WriteCmd(0xa6);//设置正常显示(非反色)WriteCmd(0xa8);//设置多路复用比率(1到64)WriteCmd(0x3F);//设置为64(4位二进制为00111111)WriteCmd(0xa4);//输出跟随RAM内容(0xa4:跟随;0xa5:忽略)WriteCmd(0xd3);//设置显示偏移WriteCmd(0x00);//不偏移WriteCmd(0xd5);//设置显示时钟分频比/振荡器频率WriteCmd(0xf0);//设置分频比WriteCmd(0xd9);//设置预充电周期WriteCmd(0x22);//设置预充电周期的值WriteCmd(0xda);//设置COM引脚硬件配置WriteCmd(0x12);//配置COM引脚WriteCmd(0xdb);//设置VCOMH电压等级WriteCmd(0x20);//设置为0.77倍VccWriteCmd(0x8d);//设置DC-DC使能WriteCmd(0x14);//启用DC-DCWriteCmd(0xaf);//打开OLED显示屏}0xAE/0xAF关闭/打开显示0x81对比度设置0xA1/0xA6段重映射/正常显示0x20/0xB0寻址模式/页地址FONTEXTRACTIONSTEPS汉字字模提取步骤1打开软件打开PCtoLCD2002软件,点击模式菜单,选择字符模式。2选项设置点击选项菜单,配置取模参数:阴码、列行式、逆向、C51格式。3设置尺寸设置字宽16、字高16,在输入栏输入需要取模的汉字"您好,中国!"。4生成字模点击生成字模按钮,将生成的字模数据复制到代码文件中。详细操作流程1打开PCtoLCD2002软件启动软件后,在菜单栏点击模式,选择字符模式,切换到字符取模界面。2配置取模选项点击选项菜单,在弹出的对话框中设置:阴码(1表示点亮)、列行式、逆向(低位在前)、C51格式。3设置字模尺寸在界面下方设置字宽为16、字高为16,确保生成的字模符合16×16点阵要求。4输入汉字在输入栏中输入需要取模的汉字"您好,中国!",可以一次性输入多个汉字一起取模。5生成字模点击生成字模按钮,软件会在下方显示生成的字模数据,以C语言数组形式呈现。6复制到代码将生成的字模数据复制到项目的codetab.h文件中,存储到HZK_16x16数组中。SOFTWAREINTERFACEPCtoLCD2002软件操作界面字符模式选择模式→字符模式点击菜单栏的"模式",选择"字符模式",切换到字符取模界面。选项设置界面选项→配置参数设置阴码、列行式、逆向、C51格式,完成后点击确定。生成字模界面生成字模→复制数据输入汉字,设置字宽字高为16,点击生成字模按钮。操作提示:三个步骤缺一不可,特别是选项设置中的参数配置,直接影响字模数据的正确性。建议截图保存设置界面,以便日后参考。DISPLAYFUNCTION显示函数OLED_ShowCN函数代码voidOLED_ShowCN(unsignedcharx,unsignedchary,unsignedcharN,unsignedcharmode){unsignedcharwm=0;unsignedintadder=32*N;OLED_SetPos(x,y);//第一个8行(上半部分)for(wm=0;wm<16;wm++){if(mode==1)WriteDat(~(HZK_16x16[adder]));elseWriteDat(HZK_16x16[adder]);adder+=1;}OLED_SetPos(x,y+1);//第二个8行(下半部分)for(wm=0;wm<16;wm++){if(mode==1)WriteDat(~(HZK_16x16[adder]));elseWriteDat(HZK_16x16[adder]);adder+=1;}}核心逻辑通过索引N计算字模起始地址,分上下两部分写入OLED(每部分16字节),支持正常显示和反白显示两种模式。参数说明xX坐标显示汉字的起始X坐标,范围0-127(像素点)。yY坐标显示汉字的起始Y坐标(页地址),范围0-7(8页)。N汉字索引汉字在HZK_16x16数组中的索引号,从0开始。M显示模式0=正常显示,1=反白显示(黑底白字)。MAINFUNCTION主函数main.c实现主函数代码intmain(void){delay_init();//初始化延时函数I2C_Configuration();//初始化I2C通信接口OLED_Init();//初始化OLED显示屏OLED_CLS();//清屏操作InitDisplay();//显示初始化信息while(1){delay_ms(100);//延时100毫秒}}voidInitDisplay(void){unsignedchari=0;//显示6个汉字(包括标点)for(i=0;i<6;i++){OLED_ShowCN(i*16+16,2,i,0);}//显示英文问候语OLED_ShowStr(16,4,"Hello,China!",2);}主函数流程1延时初始化2I2C配置3OLED初始化4清屏操作5显示内容6循环保持显示函数详解循环显示6个汉字:i从0到5,每次显示一个汉字X坐标计算:i*16+16,每个汉字占16像素,间隔16像素Y坐标:固定为2(第2页)显示模式:0表示正常显示坐标说明:X范围0-127,Y范围0-7(页地址)BUILD&DEBUG创建工程、编译与调试工程编译1编译工程在KeilμVision5中点击Build按钮,编译整个工程,生成.hex目标文件。2检查错误确保编译结果显示"0Error(s),0Warning(s)",无错误无警告。3获取HEX文件编译成功后,在工程目录的Objects文件夹中找到.hex文件。程序下载下载软件:使用FlyMcu软件下载方式:ISP方式加载HEX文件BOOT0设置:下载前设为高电平重启验证:恢复BOOT0为低电平调试过程1观察现象仔细观察OLED屏幕的显示结果,记录任何异常现象、错误提示或不符合预期的行为。2问题定位对发现的问题进行分析和定位,判断是硬件问题(连接错误)还是软件问题(代码逻辑)。3修复验证修改代码或调整硬件,重新编译下载,重复调试步骤直到所有功能正常。常见问题显示乱码:检查字模数据是否正确位置偏移:检查坐标计算是否正确无显示:检查I2C通信是否正常RUNNINGRESULT运行结果展示显示效果显示内容:"您好,中国!"+"Hello,China!"验证结果中文字符显示正确"您好,中国!"六个字符显示清晰,无乱码现象。英文字符显示正确"Hello,China!"英文问候语显示正常。位置准确汉字和英文显示位置符合预期,布局合理。显示稳定长时间运行无闪烁、无拖影现象。任务完成!成功实现OLED液晶屏显示中文字符功能。IMPORTANTNOTES注意事项I2C通信延时在I2C通信过程中,需要适当的延时来保证数据的稳定传输。使用定时器实现精确延时或使用简单循环延时函数延时时间根

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论