基于STM32的汉字显示系统(DOC)

合集下载

基于单片机的智能终端中汉字显示的处理

基于单片机的智能终端中汉字显示的处理

基于单片机的智能终端中汉字显示的处理
引言
近年来,以单片机以及嵌入式系统平台为基础的各种智能终端广泛应用于各
行各业的专用设备和产品中,也将逐渐渗透到家用电器和各种消费类电子产品中。

单片机以其价格低廉、技术成熟而广泛应用于各种低端产品之中,但是由于
单片机的寻址能力有限,限定了其最大的存储空间。

比如最常用的MCS-51 单
片机,其直接寻址的数据存储空间为64k 字节,如果通过扩展来得到更大的存
储空间,既增加了系统成本,也为数据读取操作带来了不便(对扩展区间的访
问要通过端口操作实现)。

所以在单片机系统的设计中,存储空间的大小是一
个很重要的因素。

在PC 机上的汉字显示,是来自存储在PC 机上的汉字库。

汉字库中的汉字
以点阵形式组成。

如果以一个16x16 点阵的汉字库作为基本字模库,每个汉字占32 个字节。

GB2312 中规定了6763 个二级汉字,则需要的存储空间大体为6763 乘以32 字节,约200 多K 字节。

显然,如果要在单片机终端上显示汉字,不可能把以上所有的汉字库信息都放在单片机系统的存储空间中。

本文以我实验室独立开发的智能餐饮信息系统为例,首先介绍关于汉字显示
的基础知识,然后说明在实际应用中如何对系统汉字库进行裁减,只保留需要
在终端上显示的汉字库信息,最后介绍在实际应用中会涉及到的有关字模提取
和字模转化的处理方法。

1:关于汉字显示的基础知识
在中文WIN9X 下,我们输入一个双八位字节,就得到一个汉字,就会认为。

基于STM32平台实现UCGUI外挂中文字库

基于STM32平台实现UCGUI外挂中文字库

U CG UI是 一 种轻 量级 的嵌 入 式 图形 支 持 系
间 不足 而 无法 实 现程 序 的烧 写 . 所 以对 于大 量 文字
统 ,它 的设 计架 构 是模 块化 的, 由不 同 的模 块 中
的 上 运
的 随 机 显 示 ,更 好 的方 案 是 将 字 库 与 程 序 代 码 分 开 .但 是 U C GU I 本 身 并没 有 提供 从 外 部存 储 器读
行, 因为 它是 1 0 0 %的标准 C代 码编 写 的 . Uc Gu I 提 供一 个 可扩 展 的 2 D图形 库及 占用 极 少 R AM 的
窗 口管理 体系 ,非常适 合 如 S T M3 2 这样 的轻 量
级 嵌入 式 平 台 的 图形 界面 显示 I l J ,大 量 应用 于 各
作 者简 介 :马 志 刚 ( 1 9 7 9) ,云南 水 富人 ,讲师 ,硕 士,研 究方 向 :计算 机控 制 ,嵌入 式 系统 软硬 件
F O NT T YP E P R OP S J I S 的定 义 ,将字 符 显示 驱动
P Bl 2 P B1 3
PB 1 4 PB 1 5
绝 大部 分应 用场 合 都是 无法 事 先预 知有 哪些 汉字
需 要 显示 ,而 如果 把 所 有 常用 汉 字 按 照 uC G UI
S T M3 2处 理器 上外 接 F l a s h存储 芯片 来扩 大存储 空
间 .例 如 可 采 用 S P I接 口 的 Na n d F l a s h 芯 片 M2 5 P X1 6来 扩展 存储 空 间 ,该芯 片具有 1 6 Mb i t 容 量 ,具备 4 K 字 节子 区擦 除功 能 ,最 高支 持 7 5 Mh z

基于单片机的LED汉字显示系统设计大学课程设计报告

基于单片机的LED汉字显示系统设计大学课程设计报告

专业技能实训报告题目基于单片机的汉字显示系统设计学院信息科学与工程学院专业电子信息科学与技术班级学生学号指导教师二〇一二年十二月二十五日1前言 (1)1.1 课题背景 (1)1.1.1 电子显示屏概述 (1)1.1.2 LED研究现状及发展趋势 (1)1.2 选题意义 (2)2 显示原理及控制方式分析 (3)2.1 点阵模块 (3)2.2 LED的控制方式 (5)3 硬件电路设计 (6)3.1 总体设计 (6)3.2 系统硬件概述 (6)3.2.1 仿真电路组成 (6)3.2.2主控单片机的接口说明 (7)3.3 LED显示电路 (8)3.3.1 驱动显示电路 (8)3.3.2 LED显示屏显示 (9)3.3.3 译码电路 (9)3.4 字模提取 (9)4 软件设计 (12)4.1显示驱动程序 (12)4.2系统主程序 (13)4.3 动态显示原理 (13)5 系统功能调试分析 (15)结语 (16)参考文献 (17)附录 (18)1前言1.1 课题背景1.1.1 电子显示屏概述LED显示屏是八十年代后期在全球迅速发展起来的新型信息显示媒体,显示屏由几万到几十万个半导体发光二极管像素点均匀排列组成。

利用不同的材料可以制造不同色彩的LED像素点。

目前应用最广的是红色、绿色、黄色。

而蓝色和纯绿色LED 的开发已经达到了实用阶段。

LED显示屏可以显示变化的数字、文字、图形图像;不仅可以用于室内环境还可以用于室外环境,具有投影仪、电视墙、液晶显示屏无法比拟的优点。

在短短的十来年中,LED点阵显示屏就以亮度高、工作电压低、功耗小、小型化、寿命长、耐冲击和性能稳定的优点迅速成长为平板显示的主流产品,在信息显示领域得到了广泛的应用。

LED的发展前景极为广阔,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光均匀性、可靠性、全色化方向发展。

LED显示屏的应用涉及社会经济的许多领域,主要包括:(1)证券交易、金融信息显示。

基于单片机控制的LED汉字显示.doc

基于单片机控制的LED汉字显示.doc

分类号 TP 单位代码 11395 密级公开学号 0605230学生毕业设计(论文)题目LED汉字显示作者院 (系) 能源工程学院专业电气工程及自动化指导教师答辩日期2010年月日毕业设计(论文)诚信责任书本人郑重声明:所呈交的毕业设计(论文),是本人在导师的指导下独立进行研究所取得的成果。

毕业设计(论文)中凡引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处。

尽我所知,除文中已经注明引用的内容外,本论文不包含任何其他个人或集体已经公开发表或撰写过的研究成果。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人毕业设计(论文)与资料若有不实,愿意承担一切相关的法律责任。

论文作者签名:年月日LED汉字显示摘要目前,作为方便、快捷的信息显示方式,LED汉字显示的应用非常广泛。

车站、银行、超市等大型公共场所的即时信息及广告的显示,无不应用LED汉字显示屏。

在能源日渐危机以及信息日渐重要的今天,具有低耗能、频更新、易维护的LED汉字显示屏必将受到广泛的应用,其具有非常的发展前景。

本文从LED的发展及单片机的简单原理开始,深入的研究了基于AT89C51单片机16×16 LED汉字滚动显示屏的设计并运用Proteus软件的仿真和实现。

主要介绍了LED汉字显示屏的硬件电路设计、汇编程序设计与调试、Proteus 软件仿真和实物制作等方面的内容,本显示屏的设计具有体积小、硬件少、电路结构简单及容易实现等优点。

能帮助广大电子爱好者了解汉字的点阵显示原理,认识单片机的基本结构、工作原理及应用方法,并提高单片机知识技术的运用能力。

关键词:单片机 LED 点阵 Proteus仿真ABSTRACTNow, as a convenient, quick, LED display mode of information that is very extensive application. Station, bank, supermarket and large public places of instant messaging and advertisement of the application of Chinese characters, LED display screen. In the energy crisis and information increasingly more important today, with low energy consumption, easy maintenance and update frequency of the Chinese character screen will be LED by the widespread application, it has very development prospects.In this paper, based on AT89C51 microcontroller 16 × 16LED scrolling display character design and the use of software in the simulation and realization of Proteus. Introduces the character LED display hardware design, assembly programming and debugging, Proteus software simulation and other aspects of physical production, the design of the screen is small, less hardware, the circuit structure is simple and easy to implement. Can help the fans understand the character of the lattice electronic display principle, understanding the basic structure of SCM, working principle and application of methods and technologies to improve knowledge and ability to use single chip.Keywords:microcontroller, LED dot matrix ,Proteus simulation.LED汉字显示目录摘要 (1)ABSTRACT (2)目录 (2)1 引言 (1)1.1 LED汉字显示研究背景及意义 (2)1.2本设计的研究内容及方法 (2)1.3 本设计的主要工作 (3)2 硬件电路组成及工作原理 (4)2.1 硬件电路组成 (4)2.1.1 A T89C51简介 .......................................................................................... (4)2.1.2 时钟电路设计 (7)2.1.3复位电路设计 (15)2.1.4 16×16LED点阵屏 (9)2.2 元器件选择 (10)2.3 硬件电路工作原理 (19)3 LED汉字显示原理及字库代码获取方法 (20)3.1 汉字的点阵显示原理 (20)3.2 字库代码获取方法 (20)3.3 LED屏的显示 (22)4 程序设计 (25)4.1 主程序 (25)4.2 显示子程序、延时子程序 (25)4.3 程序编译、仿真 (19)5 基于PROTEUS的电路仿真 (30)5.1用PROTEUS 绘制原理图 (30)5.2 PROTEUS 对单片机内核的仿真 (31)6 结束语 (33)参考文献 (35)致谢 (37)1 引 言1.1 LED 汉字显示研究背景及意义受到体育场馆用LED 显示屏需求快速增长的带动,近年来,中国 LED 显示屏应用逐步增多。

stm32驱动1.44寸LCD屏幕显示中文字符

stm32驱动1.44寸LCD屏幕显示中文字符

stm32驱动1.44⼨LCD屏幕显⽰中⽂字符之前的0.96⼨的OLED屏幕坏掉了,现在重新买了⼀块1.44⼨的LCD屏幕,感觉这次的质量⽐较好,还可以显⽰彩⾊的⽤的stm32是stm32f103vet6,我看某宝卖家给的例程⾥⾯好像还有触摸功能,我之后研究下实物图接线⽅法:供电要5V的,3.3V只会⽩屏SCL---PB13SDA---PB15RES---PB12(复位来的,和stm32接同⼀个复位就⾏)DC---PB10那个CS⽚选完全可以不接就默认浮空吧BL接GND的话是关闭屏幕,浮空或者接3.3V就是开启屏幕,那就不接默认浮空吧放⼀个例⼦显⽰的效果图还⾏挺清楚的,128*128分辨率还能放彩图上去,美滋滋下⾯贴⼀下lcd的代码和main中使⽤,会移植的⼩伙伴⾃⾏移植1 #include "lcd.h"2 #include "stdlib.h"3 #include "usart.h"4 #include "delay.h"5/****************************************************************************************************6//=======================================液晶屏数据线接线==========================================//7//CS 接PB11 //⽚选信号8//CLK 接PB13 //SPI时钟信号9//SDI(DIN) 接PB15 //SPI总线数据信号10//=======================================液晶屏控制线接线==========================================//11//LED 接PB9 //背光控制信号,⾼电平点亮12//RS(D/C) 接PB10 //寄存器/数据选择信号(RS=0数据总线发送的是指令;RS=1数据总线发送的是像素数据)13//RST 接PB12 //液晶屏复位信号,低电平复位14/////////////////////////////////////////////////////////////////////////////////////////////////15//==================================如何精简到只需要3个IO=======================================//16//1.CS信号可以精简,不作SPI复⽤⽚选可将CS接地常低,节省1个IO17//2.LED背光控制信号可以接⾼电平3.3V背光常亮,节省1个IO18//3.RST复位信号可以接到单⽚机的复位端,利⽤系统上电复位,节省1个IO19//==================================如何切换横竖屏显⽰=======================================//20//打开lcd.h头⽂件,修改宏#define USE_HORIZONTAL 值为0使⽤竖屏模式.1,使⽤横屏模式21//===========================如何切换模拟SPI总线驱动和硬件SPI总线驱动=========================//22//打开lcd.h头⽂件,修改宏#define USE_HARDWARE_SPI 值为0使⽤模拟SPI总线.1,使⽤硬件SPI总线23**************************************************************************************************/242526//管理LCD重要参数27//默认为竖屏28 _lcd_dev lcddev;2930//画笔颜⾊,背景颜⾊31 u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;32 u16 DeviceCode;3334/****************************************************************************35* 名称:void SPIv_WriteData(u8 Data)36* 功能:STM32_模拟SPI写⼀个字节数据底层函数37* ⼊⼝参数:Data38* 出⼝参数:⽆39* 说明:STM32_模拟SPI读写⼀个字节数据底层函数40****************************************************************************/41void SPIv_WriteData(u8 Data)42 {43 unsigned char i=0;44for(i=8;i>0;i--)45 {46if(Data&0x80)47 LCD_SDA_SET; //输出数据48else LCD_SDA_CLR;4950 LCD_SCL_CLR;51 LCD_SCL_SET;52 Data<<=1;53 }54 }5556/****************************************************************************57* 名称:u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)58* 功能:STM32_硬件SPI读写⼀个字节数据底层函数59* ⼊⼝参数:SPIx,Byte60* 出⼝参数:返回总线收到的数据61* 说明:STM32_硬件SPI读写⼀个字节数据底层函数62****************************************************************************/63 u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)64 {65while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待发送区空66 SPIx->DR=Byte; //发送⼀个byte67while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完⼀个byte68return SPIx->DR; //返回收到的数据69 }7071/****************************************************************************72* 名称:void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)73* 功能:设置SPI的速度74* ⼊⼝参数:SPIx,SpeedSet75* 出⼝参数:⽆76* 说明:SpeedSet:1,⾼速;0,低速;77****************************************************************************/78void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)79 {80 SPIx->CR1&=0XFFC7;81if(SpeedSet==1)//⾼速82 {83 SPIx->CR1|=SPI_BaudRatePrescaler_2;//Fsck=Fpclk/284 }85else//低速86 {87 SPIx->CR1|=SPI_BaudRatePrescaler_32; //Fsck=Fpclk/3288 }89 SPIx->CR1|=1<<6; //SPI设备使能90 }9192/****************************************************************************93* 名称:SPI2_Init(void)94* 功能:STM32_SPI2硬件配置初始化95* ⼊⼝参数:⽆96* 出⼝参数:⽆97* 说明:STM32_SPI2硬件配置初始化98****************************************************************************/99void SPI2_Init(void)100 {101 SPI_InitTypeDef SPI_InitStructure;102 GPIO_InitTypeDef GPIO_InitStructure;103104//配置SPI2管脚105 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); 106 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;107 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;108 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;109 GPIO_Init(GPIOB, &GPIO_InitStructure);110111 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;112 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;113 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;114 GPIO_Init(GPIOB, &GPIO_InitStructure);115116 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12; 117 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;118 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;119 GPIO_Init(GPIOB, &GPIO_InitStructure);120121//SPI2配置选项122 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);123124 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;125 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;126 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;127 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;128 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;129 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;130 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;131 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;132 SPI_InitStructure.SPI_CRCPolynomial = 7;133 SPI_Init(SPI2, &SPI_InitStructure);134135//使能SPI2136 SPI_Cmd(SPI2, ENABLE);137 }138139//******************************************************************140//函数名: LCD_WR_REG141//功能:向液晶屏总线写⼊写16位指令142//输⼊参数:Reg:待写⼊的指令值143//返回值:⽆144//修改记录:⽆145//****************************************************************** 146void LCD_WR_REG(u16 data)147 {148 LCD_CS_CLR;149 LCD_RS_CLR;150#if USE_HARDWARE_SPI151 SPI_WriteByte(SPI2,data);152#else153 SPIv_WriteData(data);154#endif155 LCD_CS_SET;156 }157158//****************************************************************** 159//函数名: LCD_WR_DATA160//功能:向液晶屏总线写⼊写8位数据161//输⼊参数:Data:待写⼊的数据162//返回值:⽆163//修改记录:⽆164//****************************************************************** 165void LCD_WR_DATA(u8 data)166 {167168 LCD_CS_CLR;169 LCD_RS_SET;170#if USE_HARDWARE_SPI171 SPI_WriteByte(SPI2,data);172#else173 SPIv_WriteData(data);174#endif175 LCD_CS_SET;176177 }178//****************************************************************** 179//函数名: LCD_DrawPoint_16Bit180//功能: 8位总线下如何写⼊⼀个16位数据181//输⼊参数:(x,y):光标坐标182//返回值:⽆183//修改记录:⽆184//****************************************************************** 185void LCD_WR_DATA_16Bit(u16 data)186 {187 LCD_CS_CLR;188 LCD_RS_SET;189#if USE_HARDWARE_SPI190 SPI_WriteByte(SPI2,data>>8);191 SPI_WriteByte(SPI2,data);192#else193 SPIv_WriteData(data>>8);194 SPIv_WriteData(data);195#endif196 LCD_CS_SET;197 }198199//****************************************************************** 200//函数名: LCD_WriteReg201//功能:写寄存器数据202//输⼊参数:LCD_Reg:寄存器地址203// LCD_RegValue:要写⼊的数据204//返回值:⽆205//修改记录:⽆206//****************************************************************** 207void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue) 208 {209 LCD_WR_REG(LCD_Reg);210 LCD_WR_DATA(LCD_RegValue);211 }212213//****************************************************************** 214//函数名: LCD_WriteRAM_Prepare215//功能:开始写GRAM216// 在给液晶屏传送RGB数据前,应该发送写GRAM指令217//输⼊参数:⽆218//返回值:⽆219//修改记录:⽆220//****************************************************************** 221void LCD_WriteRAM_Prepare(void)222 {223 LCD_WR_REG(lcddev.wramcmd);224 }225226//****************************************************************** 227//函数名: LCD_DrawPoint228//功能:在指定位置写⼊⼀个像素点数据229//输⼊参数:(x,y):光标坐标230//返回值:⽆231//修改记录:⽆232//******************************************************************233void LCD_DrawPoint(u16 x,u16 y)234 {235 LCD_SetCursor(x,y);//设置光标位置236 LCD_WR_DATA_16Bit(POINT_COLOR);237 }238239//******************************************************************240//函数名: LCD_GPIOInit241//功能:液晶屏IO初始化,液晶初始化前要调⽤此函数242//输⼊参数:⽆243//返回值:⽆244//修改记录:⽆245//******************************************************************246void LCD_GPIOInit(void)247 {248 GPIO_InitTypeDef GPIO_InitStructure;249250 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB ,ENABLE);251252 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; 253 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;254 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;255 GPIO_Init(GPIOB, &GPIO_InitStructure);256 }257258//******************************************************************259//函数名: LCD_Reset260//功能: LCD复位函数,液晶初始化前要调⽤此函数261//输⼊参数:⽆262//返回值:⽆263//修改记录:⽆264//******************************************************************265void LCD_RESET(void)266 {267 LCD_RST_CLR;268 delay_ms(100);269 LCD_RST_SET;270 delay_ms(50);271 }272273//******************************************************************274//函数名: LCD_Init275//功能: LCD初始化276//输⼊参数:⽆277//返回值:⽆278//修改记录:⽆279//******************************************************************280void LCD_Init(void)281 {282#if USE_HARDWARE_SPI //使⽤硬件SPI283 SPI2_Init();284#else285 LCD_GPIOInit();//使⽤模拟SPI286#endif287288 LCD_RESET(); //液晶屏复位289290//************* Start Initial Sequence **********//291//开始初始化液晶屏292 LCD_WR_REG(0x11);//Sleep exit293 delay_ms (120);294//ST7735R Frame Rate295 LCD_WR_REG(0xB1);296 LCD_WR_DATA(0x01);297 LCD_WR_DATA(0x2C);298 LCD_WR_DATA(0x2D);299300 LCD_WR_REG(0xB2);301 LCD_WR_DATA(0x01);302 LCD_WR_DATA(0x2C);303 LCD_WR_DATA(0x2D);304305 LCD_WR_REG(0xB3);306 LCD_WR_DATA(0x01);307 LCD_WR_DATA(0x2C);308 LCD_WR_DATA(0x2D);309 LCD_WR_DATA(0x01);310 LCD_WR_DATA(0x2C);311 LCD_WR_DATA(0x2D);312313 LCD_WR_REG(0xB4); //Column inversion314 LCD_WR_DATA(0x07);315316//ST7735R Power Sequence317 LCD_WR_REG(0xC0);318 LCD_WR_DATA(0xA2);319 LCD_WR_DATA(0x02);320 LCD_WR_DATA(0x84);321 LCD_WR_REG(0xC1);322 LCD_WR_DATA(0xC5);323324 LCD_WR_REG(0xC2);325 LCD_WR_DATA(0x0A);326 LCD_WR_DATA(0x00);327328 LCD_WR_REG(0xC3);329 LCD_WR_DATA(0x8A);330 LCD_WR_DATA(0x2A);331 LCD_WR_REG(0xC4);332 LCD_WR_DATA(0x8A);333 LCD_WR_DATA(0xEE);334335 LCD_WR_REG(0xC5); //VCOM336 LCD_WR_DATA(0x0E);337338 LCD_WR_REG(0x36); //MX, MY, RGB mode339 LCD_WR_DATA(0xC8);340341//ST7735R Gamma Sequence342 LCD_WR_REG(0xe0);343 LCD_WR_DATA(0x0f);344 LCD_WR_DATA(0x1a);345 LCD_WR_DATA(0x0f);346 LCD_WR_DATA(0x18);347 LCD_WR_DATA(0x2f);348 LCD_WR_DATA(0x28);349 LCD_WR_DATA(0x20);350 LCD_WR_DATA(0x22);351 LCD_WR_DATA(0x1f);352 LCD_WR_DATA(0x1b);353 LCD_WR_DATA(0x23);354 LCD_WR_DATA(0x37);355 LCD_WR_DATA(0x00);356 LCD_WR_DATA(0x07);357 LCD_WR_DATA(0x02);358 LCD_WR_DATA(0x10);359360 LCD_WR_REG(0xe1);361 LCD_WR_DATA(0x0f);362 LCD_WR_DATA(0x1b);363 LCD_WR_DATA(0x0f);364 LCD_WR_DATA(0x17);365 LCD_WR_DATA(0x33);366 LCD_WR_DATA(0x2c);367 LCD_WR_DATA(0x29);368 LCD_WR_DATA(0x2e);369 LCD_WR_DATA(0x30);370 LCD_WR_DATA(0x30);371 LCD_WR_DATA(0x39);372 LCD_WR_DATA(0x3f);373 LCD_WR_DATA(0x00);374 LCD_WR_DATA(0x07);375 LCD_WR_DATA(0x03);376 LCD_WR_DATA(0x10);377378 LCD_WR_REG(0x2a);379 LCD_WR_DATA(0x00);380 LCD_WR_DATA(0x00);381 LCD_WR_DATA(0x00);382 LCD_WR_DATA(0x7f);383384 LCD_WR_REG(0x2b);385 LCD_WR_DATA(0x00);386 LCD_WR_DATA(0x00);387 LCD_WR_DATA(0x00);388 LCD_WR_DATA(0x9f);389390 LCD_WR_REG(0xF0); //Enable test command391 LCD_WR_DATA(0x01);392 LCD_WR_REG(0xF6); //Disable ram power save mode 393 LCD_WR_DATA(0x00);394395 LCD_WR_REG(0x3A); //65k mode396 LCD_WR_DATA(0x05);397 LCD_WR_REG(0x29);//Display on398399 LCD_SetParam();//设置LCD参数400 LCD_LED_SET;//点亮背光401//LCD_Clear(WHITE);402 }403//****************************************************************** 404//函数名: LCD_Clear405//功能: LCD全屏填充清屏函数406//输⼊参数:Color:要清屏的填充⾊407//返回值:⽆408//修改记录:⽆409//****************************************************************** 410void LCD_Clear(u16 Color)411 {412 u16 i,j;413 LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); 414for(i=0;i<lcddev.width;i++)415 {416for(j=0;j<lcddev.height;j++)417 LCD_WR_DATA_16Bit(Color); //写⼊数据418 }419 }420/*************************************************421函数名:LCD_SetWindows422功能:设置lcd显⽰窗⼝,在此区域写点数据⾃动换⾏423⼊⼝参数:xy起点和终点424返回值:⽆425*************************************************/426void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd) 427 {428#if USE_HORIZONTAL==1 //使⽤横屏429 LCD_WR_REG(lcddev.setxcmd);430 LCD_WR_DATA(xStar>>8);431 LCD_WR_DATA(0x00FF&xStar+3);432 LCD_WR_DATA(xEnd>>8);433 LCD_WR_DATA(0x00FF&xEnd+3);434435 LCD_WR_REG(lcddev.setycmd);436 LCD_WR_DATA(yStar>>8);437 LCD_WR_DATA(0x00FF&yStar+2);438 LCD_WR_DATA(yEnd>>8);439 LCD_WR_DATA(0x00FF&yEnd+2);440441#else442443 LCD_WR_REG(lcddev.setxcmd);444 LCD_WR_DATA(xStar>>8);445 LCD_WR_DATA(0x00FF&xStar+2);446 LCD_WR_DATA(xEnd>>8);447 LCD_WR_DATA(0x00FF&xEnd+2);448449 LCD_WR_REG(lcddev.setycmd);450 LCD_WR_DATA(yStar>>8);451 LCD_WR_DATA(0x00FF&yStar+3);452 LCD_WR_DATA(yEnd>>8);453 LCD_WR_DATA(0x00FF&yEnd+3);454#endif455456 LCD_WriteRAM_Prepare(); //开始写⼊GRAM457 }458459/*************************************************460函数名:LCD_SetCursor461功能:设置光标位置462⼊⼝参数:xy坐标463返回值:⽆464*************************************************/465void LCD_SetCursor(u16 Xpos, u16 Ypos)466 {467 LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);468 }469470//设置LCD参数471//⽅便进⾏横竖屏模式切换472void LCD_SetParam(void)473 {474 lcddev.wramcmd=0x2C;475#if USE_HORIZONTAL==1 //使⽤横屏476 lcddev.dir=1;//横屏477 lcddev.width=128;478 lcddev.height=128;479 lcddev.setxcmd=0x2A;480 lcddev.setycmd=0x2B;481 LCD_WriteReg(0x36,0xA8);482483#else//竖屏484 lcddev.dir=0;//竖屏485 lcddev.width=128;486 lcddev.height=128;487 lcddev.setxcmd=0x2A;488 lcddev.setycmd=0x2B;489 LCD_WriteReg(0x36,0xC8);490#endif491 }lcd.c1 #ifndef __LCD_H2#define __LCD_H3 #include "sys.h"4 #include "stdlib.h"56//////////////////////////////////////////////////////////////////////////////////7/****************************************************************************************************8//=======================================液晶屏数据线接线==========================================// 9//CS 接PB11 //⽚选信号10//CLK 接PB13 //SPI时钟信号11//SDI(DIN) 接PB15 //SPI总线数据信号12//=======================================液晶屏控制线接线==========================================// 13//LED 接PB9 //背光控制信号,⾼电平点亮14//RS(D/C) 接PB10 //寄存器/数据选择信号(RS=0数据总线发送的是指令;RS=1数据总线发送的是像素数据)15//RST 接PB12 //液晶屏复位信号,低电平复位16/////////////////////////////////////////////////////////////////////////////////////////////////17//==================================如何精简到只需要3个IO=======================================//18//1.CS信号可以精简,不作SPI复⽤⽚选可将CS接地常低,节省1个IO19//2.LED背光控制信号可以接⾼电平3.3V背光常亮,节省1个IO20//3.RST复位信号可以接到单⽚机的复位端,利⽤系统上电复位,节省1个IO21//==================================如何切换横竖屏显⽰=======================================//22//打开lcd.h头⽂件,修改宏#define USE_HORIZONTAL 值为0使⽤竖屏模式.1,使⽤横屏模式23//===========================如何切换模拟SPI总线驱动和硬件SPI总线驱动=========================//24//打开lcd.h头⽂件,修改宏#define USE_HARDWARE_SPI 值为0使⽤模拟SPI总线.1,使⽤硬件SPI总线25**************************************************************************************************/2627//LCD重要参数集28 typedef struct29 {30 u16 width; //LCD 宽度31 u16 height; //LCD ⾼度32 u16 id; //LCD ID33 u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。

STM32汉字显示实验

STM32汉字显示实验
#include "12864.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
void p_out(void) //把PB命令端口配置成输出
{
rs();
wr();
en();
psb();
}
void wr_outite_cmd(u8 cmd) //写命令
{
p_out();
data_out();
rs_out=1;
wr_out=0;
en_out=0;
GPIOB->ODR=((GPIOB->ODR&0X00FF)|(dat<<8));//把dat给PB高八位
delay_ms(10);
en_out=1;
delay_ms(10);
en_out=0;
}
void LCDClear(void)
//例如,100,这样就会出错,根本就不能进入循环体。
{
temp[i] =(num%10)+0x30;
num/=10;
i++;
}
i--; //因为i在退出循环之前还自加了一次,此时,
//指向最后一个存储有用值的元素的后一个位置。
while(i > -1)//因为i=0时,temp[0]还是有用值。
{
u8 x2=0;
x2=x;
if(y<1) y=1;
if(y>4) y=4;
x&=0x0f;
switch(y)
{
case 1:x2|=0x80;break;

单片机系统中的汉字显示

单片机系统中的汉字显示

单片机系统中的汉字显示摘要:需要显示的汉字较多时,单片机系统中的汉字编码非常繁琐。

本文介绍一种直接利用PC机的汉字内码作为单片机系统的汉字编码,以简化系统的设计。

关键词:单片机液晶显示器 29F040 汉字显示引言在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字。

通常的汉字显示方式是先根据所需要的汉字提取汉字点阵(如16×16点阵),将点阵文件存入ROM,形成新的汉字编码;而在使用时刚需要先根据新的汉字编码组成语句,再由MCU根据新编码提取相应的点阵进行汉字显示。

在这种显示方式中,如果使用的流字数量较大或语句较多时,利用汉字的新编码组成语句将是一件十分繁琐而枯燥的工作。

针对这种情况,本文提出了一种十分简单的方式——直接利用PC机的汉字内码作为单片机系统的编码。

下面以8051单片机系统为例阐述如下:一、硬件组成本系统中采用香港精电公司的内置T6963控制器[1]的240128T点阵图形液晶显示器。

该显示器1行为240点,能容纳16×16点阵的汉字15个,总列数为128点,能显示8行汉字。

为了使用MCU操作可使用1片512KB的存储器(如本系统中的29F040)用来存储全部的国标16×16点阵汉辽、8×16的ASCII码点阵数据以及汉字语句编码数据。

为了降低成本和减小体积,对于速度要求不是很高的场合也可采用大容量的串行数据存储器,如AT45DB041B。

具体的硬件控制电路如图1所示(与汉字显示无关的电路略)。

由于29F040的容量为512KB,而5031微控制器只能管理64KB的数据间,所以可将29F040分成16页,每页32KB,占单片机系统数据空间的8000H~0FFFFH(剩余32KB为单片机系统的其他存储器和外设)。

页码由单片机的P1.0~P1.3选择。

液晶显示器的地址为7FF8H~7FF9H。

二、汉字显示原理及软件设计UCDOS软件中的文件HZK16和文件ASC16分别为16×16的国标汉字点阵文件和8×16的ASCII码点阵文件,以二进制格式存储。

STM32TFT2.4彩屏显示字符和汉字

STM32TFT2.4彩屏显示字符和汉字

#define LCD_SIZE_X 240 //彩屏的分辨率为 240*320 #define LCD_SIZE_Y 320
extern uint colors[];
void LCD_Init(void); //LCD 初始化函数 void LCD_ShowString(uint x,uint y,uint For_color,uint Bk_color,char *p); //写字符串函数 void LCD_ShowChar(uint x,uint y,uint For_color,uint Bk_color, char ch); //写字符函数 void ChineseChar(uint x,uint y,int size,uint For_color,uint Bk_color ,char c); //写汉字函数 void delayms(int count) ; //void LCD_Writ_Bus(char VH,char VL); //8 位模式下的总线写函数 void LCD_Writ_Bus( uint VH, uint VL); //16 位模式下的总线写函数
驱动程序的头文件 LCD_driver.h 如下:
#define uchar unsigned char #define uint unsigned int
#define Bus_16
//16 位数据模式,如果使用 8 位模式,请注释此语句,如果使用 16 位
模式,请打开此句
#define LCD_DataPortH P1 //高 8 位数据口,8 位模式下只使用高 8 位
//设置地址
驱动程序 Lcd.c 文件如下:
#include "stm32f10x_lib.h" #include"LCD_driver.h" #include"chinese.h" #include"char.h"

基于单片机的LED汉字显示屏设计

基于单片机的LED汉字显示屏设计

编号:南京信息职业技术学院毕业设计论文作者学号系部电子信息学院专业电子信息工程(检测与应用)题目基于单片机的LED汉字显示屏设计指导教师评阅教师完成时间: 2012年月日毕业设计(论文)中文摘要基于单片机的LED汉字显示屏设计摘要:随着社会的进步和发展,人们对生活的需求越来越高,购物欲望越来越强。

许多商家为了吸引顾客的眼球,大多采用社会最前沿的技术来做宣传,LED显示屏以其色彩鲜艳,动态范围广,亮度高,寿命长,工作性能稳定,节能等优点,是一个很好的宣传途径,是大型娱乐、体育赛事、广场装点主题显示信息传播等方面的重要组成部分,在装饰显示市场LED屏将起到积极的作用。

本文设计基于单片机的LED汉字显示屏,LED屏是种新型的显示媒体,是结合电子信息技术各个方面于一体的大型显示系统。

本文设计包含系统框图,硬件模块设计图,软件流程图和程序。

主控制系统采用单片机控制方式,实现LED显示屏的驱动及信息的保存与显示:通过单片机的控制驱动电路,采用扫描方式进行显示;LED显示点阵主要由LED、字模及电路构成。

C语言进行软件设计,增加了程序的可读性和可移植性。

而软件的设计模块化结构,使程序设计的逻辑关系更加简洁明了。

通过实验实现了汉字的滚动显示功能,达到了预测效果。

关键词:LED显示屏,单片机驱动,字模,C语言毕业设计(论文)外文摘要Based on SCM LED Chinese characters display design Abstract:with the social progress and development, people livingon the increasingly high demand, the shopping desire more and more strong. Many businesses in order to attract customers eye, mostly with social the most cutting-edge technology to do publicity, LED display with its colorful, wide dynamic range, high brightness, long life, stable performance, energy-saving advantages, is a very good way of promotion, is a large entertainment, sporting events, Plaza decorating theme display information dissemination and other aspects of the important part in the LED screen, decorative display market will play a positive role.In this paper the design based on MCU LED Chinese characters display screen, LED screen is a new type of display media, is the combination of electronic information technology aspects in one of the large-scale display system. This design includes the system block diagram, hardware design, software flow chart and the procedure. The main control system using single chip microcomputer control mode, realization of LED display driver and information preservation and display: through the single-chip control driving circuit, the use of scanning display; display mainly composed of LED, LED dot matrix font and circuit. C language software design, increase the readability and portability. The software design of the modular structure, make the logic relation of designingprogram more concise. Through the experimental realization of the Chinese characters rolling display function, the predicted effect.Key words: LED display, microprocessor, fonts, C language目录1 引言 (6)1.1 开发意义及背景 (6)1.1.1 设计要求 (6)2 课题分析及方案论证 (6)2.1 课题分析 (6)2.1.1 设计方案 (7)3 电路设计 (6)3.1 原理图设计 (8)3.1.1 工作原理: (8)3.2 元器件的选择与介绍 (10)3.2.1 元器件检测 (11)结论 (12)致谢 (14)参考文献 (15)1 引言1.1 开发意义及背景LED被公认为21世纪“绿色照明”,具有“高节能”“寿命长”“多变幻”“利环保”“高新尖”等特点,LED通用照明成为最具市场潜力的行业热点。

野火stm32-LCD显示(中英文、BMP图片,带截图功能)

野火stm32-LCD显示(中英文、BMP图片,带截图功能)

SD卡字库和 bmp图片显示实验E-Mail firestm32@QQ 313303034博客硬件平台野火STM32开发板库版本ST3.0.0实验描述:使用软件制作自定义类型的字库,然之后将字库放入SD卡中,并且在SD 卡中放入一张bmp图片作为LCD背景。

并且调用截屏函数截取LCD背景并保存为bmp图片。

硬件连接:MicroSD卡PC8-SDIO-D0 ----DATA0PC9-SDIO-D1 ----DATA1PC10-SDIO-D2 ----DATA2PC11-SDIO-D3 ----CD/DATA3PC12-SDIO-CLK ----CLKPD2-SDIO-CMD ----CMDTFT 数据线PD14-FSMC-D0 ----LCD-DB0PD15-FSMC-D1 ----LCD-DB1PD0-FSMC-D2 ----LCD-DB2PD1-FSMC-D3 ----LCD-DB3PE7-FSMC-D4 ----LCD-DB4PE8-FSMC-D5 ----LCD-DB5PE9-FSMC-D6 ----LCD-DB6PE10-FSMC-D7 ----LCD-DB7PE11-FSMC-D8 ----LCD-DB8PE12-FSMC-D9 ----LCD-DB9PE13-FSMC-D10 ----LCD-DB10PE14-FSMC-D11 ----LCD-DB11PE15-FSMC-D12 ----LCD-DB12PD8-FSMC-D13 ----LCD-DB13PD9-FSMC-D14 ----LCD-DB14PD10-FSMC-D15 ----LCD-DB15 TFT 控制信号线PD4-FSMC-NOE ----LCD-RDPD5-FSMC-NEW ----LCD-WRPD7-FSMC-NE1 ----LCD-CSPD11-FSMC-A16 ----LCD-DCPE1-FSMC-NBL1 ----LCD-RESETPD13-FSMC-A18 ----LCD-BLACK-LIGHT库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_rcc.cFWlib/misc.cFwlib/stm32f10x_systick.cFWlib/stm32f10x_exti.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_fsmc.c用户文件: USER/main.cUSER/stm32f10x_it.cUSER/systick.cUSER/usart1.cUSER/lcd.cUSER/ff.cUSER/sdcard.cUSER/diskio.cUSER/sd_fs_app.cUSER/Sd_bmp.c野火STM32开发板LCD和SD卡硬件连接图:SD卡接口连接如下LCD接口连接如下字库制作详细流程我们采用“字模III-增强版v3.91”软件来制作中文字库。

基于单片机的LED显示屏的汉字显示

基于单片机的LED显示屏的汉字显示

灭,CA2 灭, CA3 灭 CA4 灭, CA5 灭,CA6 灭,CA7 灭 CA8 亮。即二进制 00000001,转换 为 16 进制为 01h.。
上半部第一行完成后,继续扫描右半部的 第一行,为了接线的方便,我们仍设计成由左往 右扫描,即从 C 1 向 C 8 方向扫描,从上图可以 看到,这一行全部为不亮,即为 00000000,16 进 制则为 00h。
for(i=0;i<16;i++) { if(i<8)
ROW_1=temp; else { ROW_1=0x00; ROW_2=temp; }
LINE_A1=ModeTable[index*16+i*2]; / / 左红
LINE_B1=ModeTable[index*16+i*2]; / / 左绿
然后单片机转向左半部第二行,仍为 C8 点 亮,为 00000001,即 16 进制01h.这一行完成后 继续进行下部分的扫描。依照这个方法,继续进 行下面的扫描,一共扫描 32 个 8 位, 可以得出 汉字“大”的扫描代码为以下数组里的值。
图2
3.汉字显示的程序实现
以下是笔者用 C 语言对 L E D 显示屏实现 ‘大’字显示
我们用 89C51 单片机来控制显示屏, 由于 单片机的总线为 8 位,一个字需要拆分为 4 个部 分即上下左右,分别由 8*8 点阵组成。
在本例图 2 中单片机首先显示的是左上角 的第一行的左半部分,即第 0 行的 CA1---CA8 或 CB1 — CB8。方向为 C1 到 C8 ,显示汉字“大” 时,C A 7 或 C B 7 点亮, 由左到右排列,为 C A 1
-112-
LINE_A2=ModeTable[index*16+1+i*2]; // 右红

基于STM32的汉字显示系统(DOC)

基于STM32的汉字显示系统(DOC)

基于STM32的汉字显⽰系统(DOC)摘要随着社会经济的迅速发展,如今汉字显⽰系统应⽤于各个领域中。

LCD显⽰屏的技术和产业都取得了长⾜的发展,作为重要的现代信息发布媒体之⼀,LCD显⽰屏在证券交易、⾦融、交通、体育、⼴告等领域被⼴泛的应⽤。

基于STM32的LCD显⽰可以更好的满⾜各种需求,也更便于操作和实现。

汉字显⽰系统主要由STM32芯⽚作为LCD彩⾊显⽰屏的主要核⼼控制器,并且通过字库制作软件制作相应的字库经过SD卡将⾃⼰所制作的字库中的汉字在屏幕中依次显⽰出来,同时可以通过按键控制,来控制现实的汉字的暂停,继续,更新字库。

本系统是利⽤STM32开发板配合SD卡实现将已存⼊字库中的汉字完整的显⽰在LCD彩⾊显⽰屏上。

关键词:STM32开发板;LCD彩⾊显⽰屏;开关⽬录1 引⾔ .................................................................................................... 错误!未定义书签。

2 总体设计 ............................................................................................ 错误!未定义书签。

2.1 汉字显⽰设计分析 (2)2.2 汉字显⽰的基本原理 (2)2.3 系统的结构框图 (3)3 详细设计 ............................................................................................ 错误!未定义书签。

3.1 硬件设计 ................................................................................... 错误!未定义书签。

STM32显示汉字精讲

STM32显示汉字精讲

STM32显示汉字精讲本文是一个自学者的学习心得,通过大白话解释写代码,欢迎指教。

主要应用目的是在TFT屏幕上显示汉字,FAT32文件系统的SD卡存储16*16的汉字库,汉字显示是通过查找字库方法。

主要应用几个高级文件:1.GUI 屏幕显示函数库2.FATFS应用在单片机,ARM文件系统库3.TFT,SD卡驱动致力于应用,所以对于原理就不要深究了,我们把接口函数研究明白就行了!对于以上GUI和FATFS高级文件,我们看文档都很多,也很长,如果想速成的话(不建议速成,时间够的话,知识要一步一个脚印的学,要把原理学好,为以后省去很多麻烦),简单学习方法:1.先把接口函数里的对应数据类型记住,特别是结构体,因为我们应用就是直接或间接改这些参数2.学习接口函数原型,这部分主要包括:函数返回值,参数还有函数实现的功能,再就是函数应用条件,有例子最好看一下例子怎么使用函数对于这些大量文档把这两点把握好,就可以对随意使用了,当然这里是建立在文件移植好之后。

STM32的显示汉字几处关键程序跟大家分享一下:FATFS fs;FIL fsrc; /* file objects */UINT br; // File R/W countstatic uint8_t Find_Chinese(uint8_t* str, uint8_t* p) //字库中索引对应的汉字{uint8_t High8bit,Low8bit; //字库存储是一个字节8位的,而屏幕是16位传送的,所以把两个字节合并成一个16位数,与屏幕驱动相匹配,这里要注意数据的大小端问题FRESULT res;uint8_t error[]="Please put the sys folder which include the font file HZK16.bin into the SD card root directory. ";High8bit=*str; /* ?高八位数据*/Low8bit=*(str+1); /* 低八位数据*/f_mount(0, &fs); //fatfs申请一个工作区/* Infinite loop */res = f_open(&fsrc, "/sys/HZK16.bin", FA_OPEN_EXISTING | FA_READ); /* 打开SD卡里的字库*/if(res != 0){LCD_ShowString(32,100,error,RED ,BLACK ); //在指定位置显示errorreturn 1;}f_lseek(&fsrc,32*((High8bit-0xa0-1)*94+(Low8bit-0xa0-1))); //根据公式算出对应汉字在字库中首地址f_read(&fsrc, p, 32, &br); //取出这个汉字的字模16*16/8=32个字节,所以取32字节放在p里f_close(&fsrc); //用完关闭文件f_mount(0, NULL); //注销工作区return 0;}*************************************************************** **************** **/void PutChinese(u16 x, u16 y, u8 *c, u32 PenColor, u32 BackColor){u16 i=0;u16 j=0;u8 buffer[32];u16 tmp_char=0;if(!Find_Chinese(c,buffer)) //判断字库里是否有对应的汉字{LCD_WindowMax(x,y,x+16,y+16); /*设置窗口*/LCD_SetCursor(x,y); /*设置当前坐标*/LCD_WriteRAM_Prepare(); //LCD驱动函数里的,准备写数据/* LCD驱动写是一次写两个字节,32字节发送16次就把一个汉字显示出来*/for (i=0;i<16;i++){tmp_char=buffer[i*2];tmp_char=(tmp_char<<8);tmp_char|=buffer[2*i+1]; /*把16位数据存入tem_char*/for (j=0;j<16;j++) //这里16表示16位数据一位一位绘制屏幕上的点{if((tmp_char<<="" p="">LCD_WriteRAM(PenColor);elseLCD_WriteRAM(BackColor);}}LCD_WindowMax(0x00,0x00,240,320); /*恢复窗口*/}*************************************************************** **************** **/void GUI_Put(u16 x, u16 y, u8 *str,u32 PenColor, u32BackColor){do{if (x>MAX_HZ_POSX) /*保证空间能放下16*16字体,否则换行*/{y+=16;x=0;}if (y>MAX_HZ_POSY) /*保证空间能放下16*16字体,否则换行*/{y=0;}if ( *str < 0x80) /* 字符是16*8的*/{LCD_ShowCharString(x, y, str, PenColor, BackColor);x+= 8;str++;}else /*′显示汉字*/{PutChinese(x, y, str++, PenColor, BackColor);str++;x+=16;}}while(*str!=0);}。

(完整word版)简单单片机汉字显示

(完整word版)简单单片机汉字显示

目录1.课程设计目的 (1)2.课程设计题目和要求 (1)3.设计内容 (1)3.1设计概述 (1)3.2单元电路设计 (2)3.2.1单片机选型 (2)3.2.2 驱动单元 (7)3.2.3 显示单元 (10)4.系统的掉电,复位信号生成电路 (13)5.电源 (14)6.软件设计 (16)7.设计总结 (20)附录Ⅰ (22)附录Ⅱ (34)参考文献 (35)1.课程设计目的通过对课题的研究,更加深入,具体的复习所学的有关单片机的知识,从而实现学以致用的根本目标。

在设计中,可以全面检查设计者的知识结构以及对知识的掌握情况,从而更好的促进设计者进行二次学习,巩固基础知识。

通过设计,学生的动手能力得到提高,对单片机最小系统控制下的LED显示方式有了全面了解。

本次设计主要应用的知识有:单片机I/O的应用,8位串行输入并行输出寄存器的应用以及LED汉字显示的扫描方式。

2.课程设计题目和要求(1)课程设计题目:基于单片机的LED动态显示(2)要求○1用16×16 LED点阵显示,静态显示“同一个世界,同一个梦想”10个字。

○2硬件设计避免繁琐,达到所需功能即可。

○3软件设计采用模块化设计。

3.设计内容3.1设计概述本系统采用AT89C51单片机作控制器,整个电路主要由单片机控制及驱动显示电路、电源电路等部分组成。

通常LED点阵显示应该准备用于存储点阵码的字库存储器,但是为了简化显示屏电路,降低成本,本系统在单片机部分不加字库存储器。

而采用软件编程的方式生成字库,并通过扫描驱动的方式将字库中的信息反映到LED阵列的行和列上,从而实现字符的显示。

工作前需要用过编程软件将要显示的字符以程序代码的形式生成字库并存入单片机的存储器中,以便系统工作时调用字库,完成显示。

工作时,字库中的数据通过AT89 C51的P1.0管脚与P1.4管脚串行输出,数据传输到两组由两个74HC959级联而成的寄存器中。

在数据的传输过程中P1.1管脚与P1.5管脚用来以输出脉冲的方式控制两组寄存器中数据的位移,P1.2管脚用来控制寄存器内数据的更新与输出,P1.3管脚用来将寄存器内的数据清零。

基于单片机的点阵汉字显示(附C语言程序)资料

基于单片机的点阵汉字显示(附C语言程序)资料

湖南科技大学测控技术与仪器专业单片机课程设计题目基于单片机的点阵汉字显示设计姓名学号指导教师成绩____________________湖南科技大学机电工程学院二〇一五年十二月制摘要LED显示屏在我们的周围随处可见,它的应用已经普及到社会中的方方面面。

作为一种新型的显示器件,在许多场合都可以见到它的身影,不仅是它的应用使呈现出来的东西更加美观,更重要的是它的应用方便,成本很低,除了能给人视觉上的冲击外,更能给人一种美的享受。

LED显示屏是由多个发光二极管按矩阵形式排列封装而成,通常用来显示时间、图文等各种信息。

本设计是基于STC89C51单片机的16*16点阵式显示屏,该LED显示屏能实现16*16个汉字,简单的显示图像, 然后一直循环着显示下去。

该设计包含了硬件、软件、调试等方案,只需简单的级联就能实现显示屏的拓展,但要注意不要超过负载能力。

本次设计的作品体积小、功能多、方便实用、花费小,电路具有结构简单、操作方便、精度高、应用广泛的特点。

关键词: LED,STC89C51单片机,显示屏目录摘要 (i)第一章系统功能要求 (1)1.1系统设计要求 (1)第二章方案论证 (1)2.1方案论证 (1)第三章系统硬件电路设计 (1)3.1 STC89C51芯片的介绍 (1)3.1.1 系统单片机选型 (1)3.1.2 STC89C51引脚功能介绍 (2)3.1.374LS595的总体特点和工作原理..........................................3.2 LED点阵介绍 (2)3.2.1LED点阵 (2)3.3系统各硬件电路介绍 (3)3.3.1系统电源电路设计介绍 (3)3.3.2复位电路 (3)3.3.3晶振电路 (4)3.4系统的总的原理图 (4)第四章系统程序设计 (5)4.1基于PROTEUS的电路仿真 (5)4.2用PROTEUS绘制原理 (5)4.3PROTEUS对单片机内核的仿真 (6)第五章调试及性能分析 (6)5.1系统的调试 (6)参考文献 (7)附录 (7)第一章设计要求1.1 系统设计要求1.以STC89C51系列的单片机为核心器件;组成一个点阵式汉字显示屏。

【STM32F429开发板用户手册】第41章STM32F429的LTDC应用之LCD汉字显。。。

【STM32F429开发板用户手册】第41章STM32F429的LTDC应用之LCD汉字显。。。

【STM32F429开发板⽤户⼿册】第41章STM32F429的LTDC应⽤之LCD汉字显。

第41章 STM32F429的LTDC应⽤之LCD汉字显⽰和2D图形显⽰本章教程为⼤家讲解LTDC应⽤中最基本的汉字显⽰和2D图形显⽰功能实现。

41.1 初学者重要提⽰41.2 LCD相关的基础⽀持41.3 LCD硬件设计41.4 LCD驱动设计41.5 LCD板级⽀持包(bsp_ltdc_429.c和bsp_tft_lcd.c)41.6 LCD的驱动移植和使⽤41.7 实验例程设计框架41.8 实验例程说明(MDK)41.9 实验例程说明(IAR)41.10 总结41.1 初学者重要提⽰1. 学习本章节前,务必优先学习第40章,需要对LTDC的基础知识和HAL库的⼏个常⽤API有个认识。

2. 本章的第4⼩节LCD驱动设计⾮常重要。

3. 如果⾃⼰观察的话,LCD上电会有⼀个瞬间⾼亮的问题,在此贴进⾏了描述:。

这个解决⽅案已经应⽤到本章配套的例⼦上。

4. 本章节⽤到的汉字⽅案会在下章专门为⼤家讲解,下⾯是⼩字库的制作⽅法:。

5. 调试状态或者刚下载LCD的程序到⾥⾯,屏幕会抖动,这个是正常现象,之前F429就有这个问题,详情看此贴:。

41.2 LCD相关的基础知识41.2.1 显⽰屏相关知识显⽰屏的结构有必要给⼤家普及下,这⾥我们通过如下三种类型的显⽰屏进⾏说明,基本已经涵盖我们常⽤的⽅式了。

RA8875 + RGB接⼝裸屏⾸先RA8875是⼀个显⽰屏控制器,⾃带显存,它的作⽤就是让不⽀持RGB接⼝的MCU也可以使⽤RGB接⼝的⼤屏。

这起到了⼀个桥接的作⽤,可以将RGB接⼝屏转换成8080总线接⼝、SPI接⼝或者I2C接⼝⽅式。

这种情况下,甚⾄低速的51单⽚机都可以外接⼤屏了。

另外像SSD1963也是同样的作⽤。

ili9488类显⽰屏这种类型是把显⽰控制器和显⽰屏都集成好了,⽀持8080总线接⼝,有些还⽀持SPI或者I2C接⼝,⽽且显存也都集成了,不过主要是驱动⼀些⼩屏。

1.stm32取字模软件的使用 (1)

1.stm32取字模软件的使用 (1)

关于取字模软件的使用1.24*24 指屏幕是24*24个点2.通过这里可以改变在LCD上显示字体大小3.在这里输入你想在LCD上显示的字然后点击生成字模,得到一些16进制的代码,但在点击生成字模之前,还有重要的设置步骤:1.点击,进入在这里注意以下几点在(1)“自定义格式”那里选择“C51格式”如果选择了A51,生成的字模代码是汇编格式的(2)在这里我们选择点阵72和索引8 主要是为了写程序方便比如const u8 font[1][72]={{0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x61,0x8C,0x01,0xE3,0x88,0x06,0x45,0x10,0x1C,0x49, 0x10,0x30,0x71,0x12,0x00,0x61,0x24,0x01,0x81,0x28,0x03,0x02,0x30,0x08,0x00,0x22,0x08,0x01,0xC2,0x0F,0xFF,0x04,0x0F,0xF8,0x04,0x08,0x06,0x08,0x08,0x01,0x90,0x08,0x60,0x60,0x0 B,0xA0,0xF0,0x0E,0x23,0x98,0x18,0x3E,0x0C,0x00,0x70,0x06,0x00,0x00,0x04,0x00,0x00,0x0 4,0x00,0x00,0x00},/*"级",1*/在计算机一个汉字占两个字节,英文数字占1个字节当我们选择的是字高和字宽是24*24时,共有576个点,我们用16进制来表示8个点,也就是每个位代表一个点,当这个点是有颜色时,该位为1,否则为0. 所以我们总共有576/8=72个,72也就是数组的长度,所以调用起来很方便。

(3)我们选这种显示方式,意思是显示一串字体时,显示的顺序是从左到右,先是y轴填满,再到x轴,向右偏移4.改变字体的大小当我们在取字模软件中把字高和字宽设置为32*32时,经计算32*32=1024,1024/8=128 所以要把数组长度改为128。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要随着社会经济的迅速发展,如今汉字显示系统应用于各个领域中。

LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。

基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。

汉字显示系统主要由STM32芯片作为LCD彩色显示屏的主要核心控制器,并且通过字库制作软件制作相应的字库经过SD卡将自己所制作的字库中的汉字在屏幕中依次显示出来,同时可以通过按键控制,来控制现实的汉字的暂停,继续,更新字库。

本系统是利用STM32开发板配合SD卡实现将已存入字库中的汉字完整的显示在LCD彩色显示屏上。

关键词:STM32开发板;LCD彩色显示屏;开关目录1 引言 ....................................................................................................... 错误!未定义书签。

2 总体设计 ............................................................................................... 错误!未定义书签。

2.1 汉字显示设计分析 (2)2.2 汉字显示的基本原理 (2)2.3 系统的结构框图 (3)3 详细设计 ............................................................................................... 错误!未定义书签。

3.1 硬件设计 ...................................................................................... 错误!未定义书签。

3.1.1 芯片介绍 ........................................................................... 错误!未定义书签。

3.1.2 功能简介 ........................................................................... 错误!未定义书签。

3.2 软件设计 (8)3.2.1 录字软件 (8)3.2.2 主函数部分 (9)3.2.3 硬件部分程序 (12)3.2.4 字库相关程序 (14)3.2.5 FAT系统 (18)3.2.6 程序流程图 (19)4 实验结果及分析 (20)4.1 硬件实验结果 (20)4.2 结果分析 (20)5 结论 (21)参考文献 (22)1引言随着嵌入式技术的迅猛发展,人机交互界面也越来越显示出它的重要性。

实际的LCD应用中要显示的汉字一般很有限,并不需要完整的汉字库,再加上完整字库在程序中要占用大量空间,因而非完整汉字库的研究就有了其自身的现实必要性。

本次课程设计主要以TFTLCD的LCD显示模块,完整的实现了汉字库的建立与显示。

TFT-LCD即薄膜晶体管液晶显示器。

其英文全称为:Thin Film Transistor-Liquid Crystal Display。

TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。

目前,显示技术和显示工业的发展迅速。

显示技术是传递视觉的信息技术。

液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。

它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。

2 总体设计2.1 汉字显示设计分析首先,要通过字库制作软件建立一个小的自己设计的汉字字库;其次需要将创建好的字库文件复制到SD卡中并将其插入到STM32的开发板上;最后就是编写程序,下载程序反复调试得出想要的结果。

具体要实现的目标如下:1.更新字库,即文档可进行变换;2. 初始状态显示本次课设的基本信息;3.可以将输出的文字进行字体、颜色、大小的变换;4. 可对显示过的汉字进行计数;5. 显示显每个汉字所对应的内存字节;6. 在运行过程中可实现暂停、继续、变速等功能。

7. 每显示一个汉字后,LED0 小灯会闪烁提示一下。

2.2 汉字显示的基本原理汉字在液晶上的显示其实就是一些点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不画,所以只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一个汉字。

首先需要用字库制作软件制作一个GBK字库,将制作好的字库放在SD卡里面,然后通过SD卡,将字库文件复制到W25X16里,这样,W25X16就相当于一款汉字字库芯片了,从而使STM32芯片读取其中的数据显示到LCD显示屏上。

2.3 系统的结构框图按键控制图2.1 系统结构框图3 详细设计3.1 硬件设计3.1.1 芯片介绍STM32开发板主要采用STM32F103RBT6作为MCU,STM32F103的型号众多,我们选择这款的原因是看重其性价比,作为一款低端开发板,选择STM32F103RBT6是最佳的选择。

128K FLASH、20K SRAM、2个SPI、3个串口、1个USB、1个CAN、2个12位的ADC、RTC、51个可用IO脚…,这样的配置无论放到哪里都是很不错的了,更重要的是其价格,不到13元的批量价,足以秒杀很多其他芯片了,所以我们选择了它作为我们的主芯片。

3.1.2 功能简介开机的时候先检测 W25X16中是否已经存在字库,如果存在,则按次序显示汉字。

如果没有,则检测 SD卡和文件系统,并查找 SYSTEM 文件夹下的FONT 文件夹,在该文件夹内查找UNI2GBK.SYS和GBK16.FON。

在检测到这些文件之后,就开始更新字库,更新完毕才开始显示汉字。

每显示一个汉字LED0 小灯会闪烁一下。

WK_UP按键调整显示汉字的速度;key1控制继续和暂停;key0更新SD卡。

所要用到的硬件资源如下:1)STM32F103RBT6。

2)外部LED0。

3)TFTLCD 液晶模块。

4)按键WK_UP、key1、key0。

5)W25X16。

6) SD卡。

1、 STM32的简单介绍图3.1 STM32原理图选择STM32F103RBT6 作为MCU,原因是其性价比高,128K FLASH、20K SRAM、2 个SPI、3 个串口、1 个USB、1 个CAN、2 个12 位的ADC、RTC、51 个可用IO 脚…,所以我们选择了它作为我们的主芯片。

2、外部LED0图3.2 外部LED0原理图其中PWR 是系统电源指示灯,为蓝色。

LED0 和LED1 分别接在PA8 和PD2 上,PA8 还可以通过TIM1 的通道1 的PWM 输出来控制DS0 的亮度。

3、 TFTLCD 液晶模块图3.3 TFTLCD 液晶显示原理图TFT_LCD 是一个通用的液晶模块接口。

OLED 是一个给OLED 显示模块供电的接口,它和TFT_LCD 拼接在一起。

当使用2.4’/2.8’的LCD 时,我们接到TFT_LCD 上就可以了,而当我们使用ALIENTEK的OLED 模块时,则接OLED 排阵做电源,同时会连接到TFT_LCD 上的部分管脚,从而实现OLED 与MCU 的连接。

4、按键图3.4 按键输入原理图KEY0 和KEY1 用作普通按键输入,分别连接在PA13 和PA15 上,他们都连接在了JTAG相关的引脚上(KEY0 还连接在SWDIO 上),KEY0 和KEY1 还和PS/2 的DAT 和CLK 线共用,他们都通过JTAG 的上拉电阻来提供上拉。

WK_UP 按键连接到PA0(STM32 的WKUP 引脚),它除了可以用作普通输入按键外,还可以用作STM32 的唤醒输入。

这个按键是高电平触发的。

5、 W25X16图3.5 25X16原理图这是ALIENTEK MiniSTM32 开发板板载的一颗 FLASH芯片,型号为W25X16。

这颗芯片的容量为16M bit,也就是 2M字节,容量和AT45DB161 一样。

适合存储不常修改的数据,比如字库等。

6、 SD 卡图3.6 SD卡部分原理图插入SD 卡可以外扩大容量存储设备,可以用来记录数据。

SD 卡我们使用的是SPI 模式通信,SD 卡的SPI 接口连接到STM32 的SPI1 上,SD_CS 接在PA3 上。

3.2 软件设计汉字显示系统需要有STM32开发板配合SD卡使用,因此其程序需要分为以下几个文件夹,用来读取SD卡上的字库和UNICODE到GBK的转换码表的FAT系统文件,硬件组成文件HARDWARE系统文,汉字字库存储,及读取相应的文件TEXT文件,以及存放主程序文件USER文件件,和STM32的系统文件。

3.2.1 录字软件双击如图所示的软件,进入主界面,如图3.7。

选择中文—>小字库—>开始输入文本—>创建—>确定,如图3.8。

完成后,将生成的文件拷入SD卡中。

图3.7 点阵字库生成器图3.8 创建字库3.2.2 主函数部分int main(void){u32 fontcnt; u8 i,j; u16 fx,fy;u8 fontx[2]; u8 key; u16 t,ts;Stm32_Clock_Init(9); delay_init(72);uart_init(72,9600); LCD_Init();KEY_Init(); LED_Init();SPI_Flash_Init();if(Font_Init()){ UPD:POINT_COLOR=BLACK;LCD_Clear(WHITE);LCD_ShowString(60,50," STM32 ");LCD_ShowString(60,70,"Font Updating...");SD_Initialize();while(FAT_Init()){ LCD_ShowString(60,90,"FAT SYS ERROR");i= SD_Initialize();if(i){ LCD_ShowString(60,110,"SD_CARD ERROR"); }delay_ms(500);LCD_Fill(60,90,240,126,WHITE);delay_ms(500); LED0=!LED0; LED1=!LED1; } while(Update_Font()!=0){ LCD_ShowString(60,110,"SYSTEM FILE LOST");delay_ms(500);LCD_ShowString(60,130,"Please Check....");delay_ms(500);LED0=!LED0; LED1=!LED1; };LCD_Clear(WHITE); }RESET:LCD_Clear(WHITE); POINT_COLOR=RED;Show_Str(5,5,"电子系统设计",16,0);Show_Str(140,5,"汉字显示系统",16,0);POINT_COLOR=BLUE;Show_Str(10,40,"内码:高字节",16,0);Show_Str(130,40,"低字节",16,0);Show_Str(10,60,"对应汉字",16,0);Show_Str(130,60,"计数器",16,0);Show_Str(60,270," 张政马舒阳刘佳萍",16,0);Show_Str(90,290," 2015年7月9日",16,0);POINT_COLOR=BLACK;fx=15; fy=80; ts=600;while(1){ fontcnt=0;for(i=0x81;i<0xp;i++){ fontx[0]=i; LCD_ShowNum(100,40,i,3,16);for(j=0x40;j<0xfe;j++){ if(j==0x7f)continue;fontcnt++;LCD_ShowNum(210,40,j,3,16);LCD_ShowNum(190,60,fontcnt,5,16);fontx[1]=j; fx+=15;if(fx>=220){ fx=5;fy+=20; }if(fy>130){ POINT_COLOR=RED;while(1){ key=KEY_Scan();if(key==1)goto UPD;if(key==2)goto RESET;LCD_ShowString(60,190,"Show Over");delay_ms(500);LCD_ShowString(60,210,"Please Check....");delay_ms(500);LCD_Fill(60,210,220,230,WHITE); } } Show_Font(100,60,fontx,16,0);Show_Font(fx,fy,fontx,16,0); t=ts;while(t--){ delay_ms(1);key=KEY_Scan();if(key==1)goto UPD;else if(key==2){ while(1){ key=KEY_Scan();if(key==1)goto UPD;if(key==2) break; }break; }else if(key==3){ if(ts==600) ts=200;else ts=600; } }LED0=!LED0; } } } }3.2.3 硬件部分程序void KEY_Init(void) // 键盘相应程序{RCC->APB2ENR|=1<<2;GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=0X00000008;GPIOA->CRH&=0X0F0FFFFF;GPIOA->CRH|=0X80800000;GPIOA->ODR|=1<<13;GPIOA->ODR|=1<<15; }u8 KEY_Scan(void){ static u8 key_up=1; JTAG_Set(JTAG_SWD_DISABLE);if(key_up&&(KEY0==0||KEY1==0||KEY2==1)){ delay_ms(10); key_up=0;if(KEY0==0){ JTAG_Set(SWD_ENABLE);return 1; }else if(KEY1==0){JTAG_Set(SWD_ENABLE); return 2;}else if(KEY2==1){JTAG_Set(SWD_ENABLE); return 3;}} else if (KEY0==1&&KEY1==1&&KEY2==0) key_up=1;JTAG_Set(SWD_ENABLE); return 0;}void LED_Init(void) // led相应程序{ RCC->APB2ENR|=1<<2;RCC->APB2ENR|=1<<5;GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003;GPIOA->ODR|=1<<8;GPIOD->CRL&=0XFFFFF0FF;GPIOD->CRL|=0X00000300; G PIOD->ODR|=1<<2; }void SPIx_Init(void) //SD卡驱动程序{ RCC->APB2ENR|=1<<2;RCC->APB2ENR|=1<<12;GPIOA->CRL&=0X000FFFFF;GPIOA->CRL|=0XBBB00000;GPIOA->ODR|=0X7<<5;SPI1->CR1|=0<<10; SPI1->CR1|=1<<9;SPI1->CR1|=1<<8; SPI1->CR1|=1<<2;SPI1->CR1|=0<<11; SPI1->CR1|=1<<1;SPI1->CR1|=1<<0; SPI1->CR1|=7<<3;SPI1->CR1|=0<<7; SPI1->CR1|=1<<6;SPIx_ReadWriteByte(0xff); }void SPIx_SetSpeed(u8 SpeedSet){ SPI1->CR1&=0XFFC7;switch(SpeedSet){ case SPI_SPEED_2: SPI1->CR1|=0<<3; break;case SPI_SPEED_4: SPI1->CR1|=1<<3; break;case SPI_SPEED_8: SPI1->CR1|=2<<3; break;case SPI_SPEED_16: SPI1->CR1|=3<<3; break;case SPI_SPEED_256: SPI1->CR1|=7<<3; break; }SPI1->CR1|=1<<6; }u8 SPIx_ReadWriteByte(u8 TxData){ u8 retry=0;while((SPI1->SR&1<<1)==0){ retry++; if(retry>200)return 0;}SPI1->DR=TxData; retry=0;while((SPI1->SR&1<<0)==0){ retry++; if(retry>200)return 0; }return SPI1->DR; }3.2.4 字库相关程序u32 FONT16ADDR ; u32 FONT12ADDR ;u32 UNI2GBKADDR;#ifdef EN_UPDATE_FONTu8 temp[512]; u8 Update_Font(void){ u32 fcluster=0; u32 i; u32 tempsys[2];float prog; u8 t; FileInfoStruct FileTemp;if(FAT32_Enable) fcluster=FirstDirClust;else fcluster=0;FileTemp=F_Search (fcluster, (unsigned char *) folder[0], T_FILE);if(FileTemp.F_StartCluster==0) return 1;{ FileTemp=F_Search(FileTemp.F_StartCluster, (unsigned char*)folder[1], T_FILE);if(FileTemp.F_StartCluster==0) return 2;fcluster=FileTemp.F_StartCluster;FileTemp=F_Search (fcluster, (unsigned char *) sysfile[2], T_SYS);if(FileTemp.F_StartCluster==0) return 3;LCD_ShowString (20,90,"Write UNI2GBK to FLASH...");LCD_ShowString (108,110,"%");F_Open(&FileTemp);i=0;while (F_Read (&FileTemp,temp) ){ if (i<FileTemp.F_Size){ SPI_Flash_Write (temp,i+100000,512) ; i+=512;}prog=(float)i/FileTemp.F_Size; prog*=100;if(t!=prog){ t=prog; if(t>100) t=100;LCD_ShowNum(84,110,t,3,16); } }UNI2GBKADDR = 100000;tempsys[0] = UNI2GBKADDR;tempsys[1] = FileTemp.F_Size;SPI_Flash_Write((u8*)tempsys,0,8);delay_ms(1000);FONT16ADDR = FileTemp.F_Size+UNI2GBKADDR;FileTemp = F_Search(fcluster, (unsigned char*)sysfile[0] , T_FON); if (FileTemp.F_StartCluste r== 0) return 4;LCD_ShowString (20,90,"Write FONT16 to FLASH... ");F_Open(&FileTemp); i=0;while(F_Read(&FileTemp,temp)){ if(i<FileTemp.F_Size){ SPI_Flash_Write(temp,i+FONT16ADDR,512); i+=512; } prog = (float)i/FileTemp.F_Size;prog* = 100; if(t!=prog){ t=prog;if(t>100)t=100;LCD_ShowNum(84,110,t,3,16); } }tempsys[0]=FONT16ADDR;tempsys[1]=FileTemp.F_Size;SPI_Flash_Write((u8*)tempsys,8,8);delay_ms(1000);FONT12ADDR = FileTemp.F_Size+FONT16ADDR; }t=0XAA; SPI_Flash_Write(&t,24,1);LCD_ShowString (20, 90," Font Update Successed ") ;return 0;} #endifu8 Font_Init(void){ u32 tempsys[2]; u8 fontok=0 ;SPI_Flash_Read(&fontok,24,1) ;if(fontok!=0XAA) return 1;SPI_Flash_Read((u8*)tempsys,0,8) ;UNI2GBKADDR=tempsys[0];SPI_Flash_Read((u8*)tempsys,8,8) ;FONT16ADDR=tempsys[0];SPI_Flash_Read((u8*)tempsys,16,8) ;FONT12ADDR=tempsys[0];return 0; }//获取字库资源信息void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size){ unsigned char qh,ql; unsigned char i;unsigned long foffset; qh=*code;ql=*(++code);if(qh<0x81||ql<0x40||ql==0xff||qh==0xff){ for(i=0;i<(size*2);i++)*mat++=0x00;return; }if(ql<0x7f)ql-=0x40; else ql-=0x41;qh-=0x81;foffset=((unsigned long)190*qh+ql)*(size*2);if(size==16)SPI_Flash_Read(mat,foffset+FONT16ADDR,32);else SPI_Flash_Read(mat,foffset+FONT12ADDR,24); }void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode){ u8 temp,t,t1; u16 y0=y; u8 dzk[32]; u16 tempcolor;Get_HzMat(font,dzk,size); if(mode==0){ for(t=0;t<size*2;t++){ temp=dzk[t]; for(t1=0;t1<8;t1++){ if(temp&0x80) LCD_DrawPoint(x,y);else { tempcolor=POINT_COLOR;POINT_COLOR=BACK_COLOR;LCD_DrawPoint(x,y);POINT_COLOR=tempcolor; }temp<<=1; y++;if((y-y0)==size) {y=y0;x++;break;} } } }else { for (t=0; t<size*2; t++){ temp=dzk[t]; for(t1=0;t1<8;t1++){ if(temp&0x80) LCD_DrawPoint(x,y);temp<<=1; y++;if((y-y0)==size){ y=y0;x++;break; } } } } }void Show_Str(u16 x,u16 y,u8*str,u8 size,u8 mode){ u8 bHz=0; while(*str!=0){ if(!bHz) { if(*str>0x80)bHz=1;else { if(x>(LCD_W-size/2){ y+=size; x=0 ; }if (y>(LCD_H-size) break;if (*str==13) { y+=size;x=0;str++; }else LCD_ShowChar(x,y,*str,size,mode);str++; x+=size/2; } }else { bHz=0; if(x>(LCD_W-size)){ y+=size;x=0; }if(y>(LCD_H-size))break;Show_Font(x,y,str,size,mode); str+=2; x+=size; } } } u16 my_strlen(u8*str){ u16 len=0; while(*str!='\0'){ str++; len++; } return len; }void my_stradd( u8*str1, u8*str2 ){ while(*str1!='\0')str1++; while(*str2!='\0'){ *str1=*str2;str2++;str1++;}*str1='\0'; }void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len){ u16 strlenth=0; strlenth=my_strlen(str);strlenth*=size/2;if(strlenth>len)Show_Str(x,y,str,size,1);else {strlenth=(len-strlenth)/2;Show_Str(strlenth+x,y,str,size,1); } }3.2.5 FAT系统//用来读取SD卡上的字库FAT系统相关程序:DWORD FirstDirClust;DWORD FirstDataSector;WORD BytesPerSector;DWORD FATsectors;WORD SectorsPerClust;DWORD FirstFATSector;DWORD FirstDirSector; fat32DWORD RootDirSectors;DWORD RootDirCount;BYTE FAT32_Enable;DWORD Cur_Dir_Cluster;FAT_TABLE FAT_TAB;FileInfoStruct F_Info[3];u8 fat_buffer[512];u8 LongNameBuffer [MAX_LONG_NAME_SIZE];BOOL LongNameFlag = 0;const unsigned char *filetype[23]={ "MP1","MP2","MP3","MP4","M4A","3GP","3G2","OGG","ACC","WMA","WA V","MID", "FLA","LRC","TXT","C ","H "," ","FON","SYS","BMP","JPG","JPE" };3.2.6 程序流程图图3.9 程序流程图4 实验结果及分析4.1 硬件实验结果图4.1 实验结果4.2 结果分析开机的时候先检测 W25X16中是否已经存在字库,如果存在,则按次序显示汉字。

相关文档
最新文档