(整理)基于STM32的LCD操作

合集下载

基于STM32在LCD上显示SD卡中BMP图片的设计

基于STM32在LCD上显示SD卡中BMP图片的设计

基于STM32在LCD上显示SD卡中BMP图片的设计上海第二工业大学实训报告课程名称:电信专业综合实践学生姓名: xx xx xx学号:201x4820xxx 201x4820xxx 201x4820xxx 学院名称:工学部专业班级: xx电信A1目录摘要: (1)第一章绪论 (1)1.2本课题设计的背景 (1)1.2 本课题设计内容 (2)第二章实验方案的总体设计 (3)2.1详细设计组成框图: (3)2.2相关硬件简介 (3)2.3相关硬件原理图 (12)第三章设计流程图 (19)第四章硬件设计 (20)4.1中英文显示部分设计 (20)4.2 BMP图片部分设计 (21)4.3 SD卡读取的内容 (22)第五章软件设计 (23)5.1主函数部分程序设计 (23)5.2按键程序设计 (27)5.3 LED灯程序设计 (33)第六章系统调试结果及问题分析 ....................... 3错误!未定义书签。

6.1 系统调试后的实验现象...................... 3错误!未定义书签。

6.2 遇到的问题及解决办法 (38)第七章总结 (39)7.1思考与总结 (39)7.2参考文献: (40)基于STM32在LCD上显示SD卡中BMP图片的设计摘要:设计了一种基于STM32的处理器的按键式控制的BMP图片切换系统。

在设计过程中采用了SD卡中读取BMP格式图片及汉字字库,使LCD屏幕显示相关提示内容及设定格式的BMP图片。

完成了基于ARM最新Cortex-M3内核的处理器STM32的BMP图片切换系统的硬件电路和软件程序的设计,实现了一个能在内存有限的片上系统中进行BMP图片切换的系统。

关键词:BMP图片;SD卡;ARM微控制器;STM32;片上系统第一章绪论1.1本课题设计的背景随着国民经济的起飞,现代社会的不断进步,广告的在新时期又有了新的发展。

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

STM32学习之TFTLCD应用

STM32学习之TFTLCD应用

STM32学习之TFTLCD应用1、TFTLCD控制器ili9325寄存器和指令采用 16 位数据线(低了速度太慢,用彩色就没什么效果了)。

80 并口有如下一些信号线:CS:TFTLCD 片选信号。

//为0时,片选成功WR :向TFTLCD 写入数据。

//上升沿有效RD:从TFTLCD 读取数据。

//上升沿有效D[15:0]:16 位双向数据线。

//可读可写RST :硬复位TFTLCD。

写1有效RS:命令/数据标志(0,读写命令;1,读写数据)。

80 并口在上一节我们已经有详细的介绍了,这里我们就不在介绍,需要说明的是,TFTLCD模块的RST 信号线和 OLED 模块一样,也是直接接到STM32 的复位脚上,并不由软件控制,这样可以省下来一个 IO 口。

另外我们还需要一个背光控制线来控制TFTLCD 的背光。

所以,我们总共需要的IO 口数目为21 个。

2、模块的控制器为ILI9320,该控制器自带显存,其显存总大小为172820 (240*320*18/8),即 18 位模式(26 万色)下的显存量。

模块的16 位数据线与显寸的对应关系为565 方式,如下图所示:最低 5 位代表蓝色,中间 6 位为绿色,最高 5 位为红色。

数值越大,表示该颜色越深。

接下来,我们介绍一下 ILI9320 的几个重要命令,因为ILI9320 的命令很多,大家可以找到ILI9320 的datasheet 看看。

要介绍的命令列表如下:R0,这个命令,有两个功能,如果对它写,则最低位为OSC,用于开启或关闭振荡器。

对它读操作,则返回的是控制器的型号。

这个命令最大的功能就是通过读它可以得到控制器的型号,而我们代码在知道了控制器的型号之后,可以针对不同型号的控制器,进行不同的初始化。

因为 93xx 系列的初始化都比较类似,我们完全可以用一个代码兼容好几个控制器。

R3,入口模式命令。

我们重点关注的是I/D0、I/D1、AM 这 3 个位,因为这 3 个位控制了屏幕的显示方向。

基于STM32单片机FSMC接口驱动LCD的配置与分析

基于STM32单片机FSMC接口驱动LCD的配置与分析

基于STM32单片机FSMC接口驱动LCD的配置与分析概述:STM32单片机是一款高性能、低功耗的32位ARM Cortex-M系列微控制器。

它具有丰富的外设接口,其中包括FSMC(Flexible Static Memory Controller)接口,用于连接外部存储器,例如LCD显示器。

本文将详细介绍如何配置和驱动LCD显示器,以及分析FSMC接口的工作原理。

一、LCD驱动接口配置1. 在STM32的标准外设库中,FSMC的配置函数位于STM32F10x_stdperiph_driver库的stm32f10x_fsmc.c和stm32f10x_fsmc.h文件中。

通过这些函数,可以配置FSMC接口的参数,以使它能够连接和驱动LCD。

2.首先,需要配置FSMC的时钟预分频值。

根据LCD的要求以及系统时钟频率,选择适当的预分频值。

这可以通过设置FSMC_BCRx寄存器中的MBKEN和PS字段来实现。

3.然后,需要配置FSMC的存储芯片选择使能信号(CSEN)和片选信号(ALE)。

这可以通过设置FSMC_BCRx寄存器中的CSEN和ALEN字段来实现。

4.接下来,需要配置FSMC的读写延迟、数据宽度、存储器类型等参数。

这可以通过设置FSMC_BTRx和FSMC_BWTRx寄存器来实现。

5.最后,需要配置FSMC的地址线、数据线和控制线的映射关系。

这可以通过设置FSMC_BCRx寄存器中的MWID、MTYP、MUXEN、MWID和NWID 字段来实现。

二、FSMC接口工作原理1.FSMC接口是一种高速并行接口,它通过多路复用来连接不同的外部存储器。

它具有独立的读/写数据线和地址线,以及控制线,用于选择读/写操作和片选信号。

2. FSMC接口支持不同类型的存储器,例如SRAM、NOR Flash、NAND Flash和LCD。

每种存储器都有不同的时序和接口要求。

3.FSMC接口的时序参数主要包括时钟预分频值、读/写延迟、数据宽度和地址线宽度等。

STM32 ---LCD1602

STM32  ---LCD1602
*出口参数:无
*********************************************************************/
void LCD_Setpos(uint8_t row,uint8_t col)
{
if(row==1) lcd_wcmd(col | 0x80);
}
/******************************测忙*************************************************/
/*********************************************************************
}
/*********************************************************************
*名 称:LCD_Setpos()
*功 能:根据习惯设定显示位置
*入口参数:row:行,row=1表示第一行,row=2表示第二行
* col:列,0~15,用于指定显示的列,范围可以是0~40
* 显示方式: *
* 1、从左到右逐字显示,闪动二次,清屏。 *
* 2、再从右到左逐字显示,闪动二次,清屏。 *
else lcd_wcmd(col | 0xC0);
}
/*********************************************************************
*功 能:显示一个字符
*入 口:ch:待显示的字符
*********************************************************************/

基于STM32的LCD操作

基于STM32的LCD操作

基于STM32的LCD操作STM32的LCD操作是通过使用外部的液晶显示器(Liquid Crystal Display,简称LCD)模块来实现的。

以下是一个基于STM32的LCD操作的详细解释,包括液晶显示器的初始化、数据和命令的发送、以及常用的LCD操作函数。

LCD初始化:1.首先,配置GPIO引脚用于连接到LCD模块的数据线和控制线。

3.然后,发送各种初始化命令,如清除显示、设置光标等。

数据和命令的发送:1.向LCD发送数据(字符或图形数据)时,需要确保LCD处于数据接收状态,而不是指令接收状态。

通常需要在发送数据之前发送一个命令来设置LCD的模式为数据接收模式。

2.通过配置GPIO引脚的电平来发送数据或命令。

常用的LCD操作函数:1. `lcd_init(`: 初始化LCD模块。

2. `lcd_cmd(uint8_t cmd)`: 向LCD发送一个命令。

3. `lcd_data(uint8_t data)`: 向LCD发送一个数据。

4. `lcd_clear(`: 清除LCD显示内容。

5. `lcd_set_cursor(uint8_t row, uint8_t col)`: 设置LCD显示的光标位置。

6. `lcd_print(char *str)`: 在LCD上打印一个字符串。

7. `lcd_create_custom_char(uint8_t location, uint8_t *data)`: 创建自定义字符。

8. `lcd_display_on(`: 打开LCD显示。

9. `lcd_display_off(`: 关闭LCD显示。

上述函数只是基本的示例,具体的函数实现会因不同的液晶模块而有所不同。

在编写代码时,需要根据液晶模块的规格和数据手册来设置相应的GPIO引脚和参数。

总之,基于STM32的LCD操作涉及到GPIO引脚的配置、LCD控制器的初始化、发送数据和命令等步骤。

通过熟悉液晶模块的规格和使用相关的库函数,可以实现对LCD模块的控制。

STM32单片机对TFTLCD的驱动设计

STM32单片机对TFTLCD的驱动设计

STM32单片机对TFTLCD的驱动设计STM32单片机对TFTLCD(TFT液晶屏)的驱动设计是一种基于STM32单片机的液晶显示技术。

TFTLCD是一种高分辨率、高色彩鲜艳的显示技术,常用于嵌入式设备的显示界面。

在设计STM32单片机对TFTLCD的驱动时,需要考虑到单片机的硬件资源和软件设计。

一、硬件设计:1.接口设计:根据TFTLCD的规格书,确定TFTLCD的接口类型(如SPI、RGB等),然后根据接口类型选择合适的引脚来连接TFTLCD与STM32单片机。

2.时钟设计:TFTLCD需要一个稳定的时钟信号来提供时序控制,可以使用STM32单片机的定时器来生成时钟信号。

3.电源设计:TFTLCD需要一定的电压供应,可以通过外部的电源模块提供合适的电压给TFTLCD。

二、软件设计:1.初始化:在驱动设计的开始阶段,需要初始化TFTLCD的相关参数,如分辨率、颜色格式等。

2.数据传输:根据TFTLCD的接口类型,使用合适的通信协议进行数据传输。

如果是SPI接口,可以使用STM32的SPI外设来传输数据;如果是RGB接口,可以通过GPIO口来控制数据线的高低电平。

3.显示控制:通过向TFTLCD发送相应的控制指令,来实现对显示内容的控制,如清屏、画点、画线、显示图像等。

4.刷新机制:TFTLCD的驱动需要实现刷新机制,即在TFTLCD的刷新周期内,不断向TFTLCD发送新的数据。

可以使用双缓冲机制,先将数据写入一个缓冲区,再将缓冲区的数据一次性发送给TFTLCD,以提高刷新效率。

在STM32单片机对TFTLCD的驱动设计中,需要根据具体的TFTLCD型号和规格书来进行具体的硬件和软件设计。

每个TFTLCD的驱动设计都是独特的,需要根据具体的需求和要求来进行设计。

同时,也需要根据单片机的性能和资源来进行合理的设计,以确保驱动的效率和稳定性。

总结来说,STM32单片机对TFTLCD的驱动设计需要同时考虑硬件和软件的设计。

基于STM32单片机FSMC接口驱动LCD的配置与分析

基于STM32单片机FSMC接口驱动LCD的配置与分析

基于STM32单片机FSMC接口驱动LCD的配置与分析STM32单片机的FSMC(Flexible Static Memory Controller)接口是一种灵活的静态存储器控制器,可以用于连接外部存储器设备,如LCD显示屏。

本文将对基于STM32单片机FSMC接口驱动LCD的配置与分析进行详细介绍。

首先,我们需要了解FSMC接口的基本原理和功能。

FSMC接口是一种高性能、低功耗的外部总线接口,可以连接到SRAM、PSRAM、NOR Flash、NAND Flash、LCD显示屏等外部存储器设备。

FSMC接口提供了多种数据传输模式(如并行、串行)和多种数据总线宽度选择,以满足不同应用的需求。

要实现FSMC接口驱动LCD,首先需要配置FSMC接口的相关寄存器。

在STM32单片机中,FSMC的配置主要包括以下几个方面:1.时序配置:通过设置FSMC_RCC和FSMC_BTR寄存器来定义访问存储器的时序。

时序配置非常重要,需要根据外部存储器的时序规格进行调整,以确保数据的正确传输。

2.地址配置:通过设置FSMC_BANK1或FSMC_BANK2寄存器来定义存储器的基地址和各种地址范围。

3.数据总线配置:根据外部存储器的数据宽度,设置FSMC_BCR和FSMC_BWTR寄存器来选择数据总线宽度(比特数)。

4.控制信号配置:通过设置FSMC_BCR、FSMC_BTR和FSMC_BWTR寄存器来配置控制信号,如写使能信号、读使能信号、片选信号等。

配置完成后,就可以使用FSMC接口进行数据的读写操作。

读取操作可以通过读取FSMC_BANK1或FSMC_BANK2的数据寄存器来实现。

写入操作可以通过写入FSMC_BANK1或FSMC_BANK2的数据寄存器来实现。

对于LCD显示屏的驱动,可以通过FSMC接口的并行模式来实现。

在并行模式下,数据总线的宽度由FSMC_BCR和FSMC_BWTR寄存器的设置决定,可以通过并行总线同时传输多个像素数据和控制信号,从而提高数据传输速度。

stm32 lcd 刷新波形原理

stm32 lcd 刷新波形原理

stm32 lcd 刷新波形原理
STM32是一系列由STMicroelectronics生产的32位微控制器,而LCD则是液晶显示屏的简称。

在STM32微控制器上刷新LCD波形
的原理涉及到许多方面,包括使用的通信协议、显示控制器、波形
数据处理等。

首先,通常情况下,STM32微控制器通过SPI、I2C、并行接口
等通信协议来驱动LCD显示屏。

其中,SPI和I2C是串行通信协议,而并行接口则是并行通信协议。

在使用这些通信协议时,需要将波
形数据发送到LCD显示屏,从而实现波形的刷新。

其次,STM32微控制器通常会集成显示控制器,例如SSD1963、ILI9341等,这些控制器可以帮助STM32微控制器更轻松地驱动LCD
显示屏。

通过编程控制这些显示控制器,可以实现波形数据的传输
和显示。

在实际应用中,刷新LCD波形的原理通常涉及到以下几个步骤:
1. 准备波形数据,首先,需要准备好要显示的波形数据,例如
通过传感器采集到的数据或者通过算法计算得到的数据。

2. 数据处理,接下来,需要对波形数据进行处理,例如进行数据转换、滤波、缩放等操作,以符合LCD显示的要求。

3. 数据传输,将处理后的波形数据通过SPI、I2C或并行接口发送给LCD显示控制器。

4. 显示刷新,LCD显示控制器接收到数据后,将数据转换为像素点,然后在LCD屏幕上显示出波形。

总的来说,刷新LCD波形的原理涉及到STM32微控制器的通信协议、显示控制器的使用以及波形数据的处理和传输。

通过合理的编程和配置,可以实现在LCD显示屏上实时、准确地显示各种波形数据。

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计

基于STM32单片机LCD多级菜单的设计摘要本设计介绍了以ARM内核嵌入式处理器STM32为控制核心,辅以低功耗的液晶模块MFG240160-3-A,以及相应的按键控制电路,实现了LCD多级菜单的设计。

在本系统中,侧重点在于LCD的显示上,因此此系统的硬件结构很简单,侧重点在于软件架构及程序的编写上,该系统程序量大,函数封装多,关于实时时钟信息、波形存储信息都留有相应的软件接口,以便与其它模块正确的相连接。

本系统硬件电路简单,但显示信息丰富,可以移植到各种便携式的电子产品上去,为电子产品的显示界面的设计提供了一个新的思路。

关键词 STM32单片机;LCD多级菜单;低功耗;Base on STM32 Microprocessor LCD modules in the multi-level menu display systemAbstractThis design describes to STM32 embedded processor based on ARM core for control, coupled with low power consumption of LCD module MFG240160-3-A as well as the corresponding keys control circuitry, enabling multi-level menu design of LCD. In this system, the focus is on the LCD display, so this system hardware structure is very simple, the emphasis lies in software architectures and applications, the system capacity, function encapsulates the information about the real-time clock, waveform stored information will have the appropriate software interface so that correct with other modules that you are connecting to. This system is simple, but the display information-rich, portable to avariety of portable electronic products, for electronic product display interface design provides a new train of thought.Keywords: STM32; LCD multi-level menu; low-power;目录摘要(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((I Abstract(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ((II 前言 ............................................................... 4 1方案设计 (5)1.1 设计方案概述 (5)1.2 电路介绍 (5)2 器件介绍 (9)2.1 STM32简介 (9)2.2 MFG240160-3-A LCD介绍 (13)3 软件设计 (16)3.1 STM32单片机的初始化 (16)3.2 液晶屏的初始化 (20)3.3 数据的传输 (20)3.4 字模的提取 (21)3.5 菜单框架的设计 (23)3.6 字模库的建立 (25)3.7 函数库的封装 (25)3.8 菜单标记 (26)3.9 时钟信息的显示 (27)3.10 波形的显示 (28)4 结论 (30)参考文献 (31)致谢 ............................................ 错误~未定义书签。

基于stm32的lcd1602实例代码

基于stm32的lcd1602实例代码

基于stm32的lcd1602实例代码下面是一个基于STM32的LCD1602实例代码的示例。

请注意,这只是一个基本的示例,您可能需要根据您的硬件配置和需求进行修改。

```cinclude ""include "stm32f10x_"include "stm32f10x_"include "stm32f10x_"define LCD1602_RS 0x06define LCD1602_RW 0x05define LCD1602_E 0x04void LCD1602_Init(void);void LCD1602_WriteCommand(unsigned char command);void LCD1602_WriteData(unsigned char data);void LCD1602_WriteString(char str, unsigned char mode);int main(void){LCD1602_Init();LCD1602_WriteString("Hello World!", 1); // 写入数据模式,写入字符串"Hello World!"while(1){// 主循环可以根据需要添加其他代码}}void LCD1602_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIODRCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOD和GPIOB时钟GPIO__Pin = GPIO_Pin_All; // 配置所有引脚为输出模式GPIO__Mode = GPIO_Mode_Out_PP; // 推挽输出模式GPIO__Speed = GPIO_Speed_50MHz; // 输出速度为50MHzGPIO_Init(GPIOD, &GPIO_InitStructure); // 初始化GPIODGPIO__Pin = GPIO_Pin_4 GPIO_Pin_5 GPIO_Pin_6 GPIO_Pin_7; // 配置四个引脚为输出模式,对应LCD1602的RS、RW、E和RW引脚GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB}void LCD1602_WriteCommand(unsigned char command){GPIOB->ODR &= ~(1 << 4); // 将LCD1602的RS引脚设置为低电平,表示接下来写入的是命令GPIOB->ODR &= ~(1 << 5); // 将LCD1602的RW引脚设置为低电平,表示接下来写入的是命令而非数据LCD1602_Write8Bit(command); // 写入8位命令到LCD1602的DB引脚上}void LCD1602_WriteData(unsigned char data){GPIOB->ODR = (1 << 4); // 将LCD1602的RS引脚设置为高电平,表示接下来写入的是数据GPIOB->ODR &= ~(1 << 5); // 将LCD1602的RW引脚设置为低电平,表示接下来写入的是数据而非命令LCD1602_Write8Bit(data); // 写入8位数据到LCD1602的DB引脚上}void LCD1602_WriteString(char str, unsigned char mode){while(str != '\0') // 当字符串未结束时,持续写入字符串数据到LCD1602上{if(mode == 1) // 如果mode为1,则写入数据到LCD1602上,否则写入命令到LCD1602上{LCD1602_WriteData(str++); // 写入一个字符的数据到LCD1602上,并将指针向后移动一位,指向下一个字符的数据或命令位上}else // 如果mode为0,则写入命令到LCD1602上,否则写入数据到LCD1602上{LCD1602_WriteCommand(str++); // 写入一个字符的命令到LCD1602上,并将指针向后移动一位,指向下一个字符的数据或命令位上} } }```。

STM32的LCD19264-12864经典程序

STM32的LCD19264-12864经典程序

现在STM32越来越流行,在学校搞的很火,本人最近也在学习,做了一个LCD19264的程序,先与大家分享,多谢关注!本程序是有LCD12864该进的,液晶驱动为ST7920。

可以稍微改动即可用于12864一、以下是LCD19264头文件/////////////////////////////////////////////////////////////////////////////////******************************************************************** ************ 函数功能:STM32F103VET6 19264-1液晶显示,串---并口19264* 编写时间:2012.07.22* 作者:ZhouGanJin* 版本:V1.1* 液晶19264-1简介:并口不多说;串口引脚4根RW(SID),E1(CLK1),E2(CLK2),PSB=0, RS(CS)=1,* 通过预编译选择串并口方式********************************************************************* **********/#ifndef _LCD19264_H#define _LCD19264_H/* 端口定义---------------------------本程序只用了GPIOA-----------------------------------*//* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/#define LCD_RS_H GPIO_SetBits(GPIOA, GPIO_Pin_0) //GPIOA->BSRR=GIOP_pin_0 #define LCD_RS_L GPIO_ResetBits(GPIOA, GPIO_Pin_0) //GPIOA->BRR=GIOP_pin_0#define LCD_RW_H GPIO_SetBits(GPIOA, GPIO_Pin_1)#define LCD_RW_L GPIO_ResetBits(GPIOA, GPIO_Pin_1)#define LCD_E1_H GPIO_SetBits(GPIOA, GPIO_Pin_2)#define LCD_E1_L GPIO_ResetBits(GPIOA, GPIO_Pin_2)#define LCD_E2_H GPIO_SetBits(GPIOA, GPIO_Pin_3)#define LCD_E2_L GPIO_ResetBits(GPIOA, GPIO_Pin_3)#define LCD_PSB_H GPIO_SetBits(GPIOA, GPIO_Pin_4)#define LCD_PSB_L GPIO_ResetBits(GPIOA, GPIO_Pin_4)#define LCD_DATA_PORT GPIOD#define LCD_DATA GPIOD->BSRR //BSRR高十六位是复位,低十六位是置位void Lcm_Wr_Dat(u8 wrdata,u8 enable); //写数据void Lcm_Wr_Com(u8 wrcommand,u8 enable); //写指令void Lcm_Rd_Status(u8 enable);//读忙状态void Lcm_Init(u8 enable); //液晶初始化void Lcm_GotoXY(u8 pos_X,u8 pos_y); //设定坐标void Lcm_SETXY(u8 pos_X,u8 pos_y,u8 enable);void Lcm_Disp_Char(u8 onechar,u8 enable);//显示单个字符void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable); //定坐标显示单个字符void Lcm_Disp_Str(u8 *string,u8 enable);//显示字符串void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable);//定坐标显示字符串void Delay_ms(u32 m);//1ms延时void Lcm_Delay(void);/*function all ------函数定义-------------以下函数包含19264液晶的串并行方式----------------------------------------*/#define PSB_SERIAL 0#ifdef PSB_SERIAL// -------以下为串口函数-------- serial transmission------/////-----------传送8bits 数据----void Send_byte(u8 bbyte,u8 enable){u8 i;for(i=0;i<8;i++){LCD_E1_L; LCD_E2_L;if(0x80&bbyte) LCD_RW_H; //SID=1;else LCD_RW_L;if(!enable) //CLK = 01 ; 串行用下降沿{LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}bbyte<<=1;Lcm_Delay(); //?}}//-----------写指令函数----void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Delay();Send_byte(0xf8,enable); //1111_1,RW(0),RS(0),0 -----------指令Send_byte(0xf0&wcomd,enable); //high 4bitsSend_byte(0xf8&(wcomd<<4),enable); //low 4bits}//-----------写数据函数----void Lcm_Wr_Dat(u8 wdata,u8 enable){Lcm_Delay();Send_byte(0xfa,enable); //1111_1,RW(0),RS(1),0 ---------数据Send_byte(0xf0&wdata,enable); //high 4bitsSend_byte(0xf8&(wdata<<4),enable); //low 4bits}#else// -------以下为并口函数-------- parallel Transmission-------/// //---------读忙函数----------------void Lcm_Rd_Status(u8 enable){u16 getd;while(1){Lcm_Delay();LCD_RS_L; //命令LCD_RW_H; //读取Lcm_Delay();//LCD_DATA=0xFFFF0000; //LCD_DATA=0xFF; 高16位为复位,即写入0使其不忙GPIO_Write(LCD_DATA_PORT, 0XFFFF) ; //准备读取数据, 写0x0000则与上相同Lcm_Delay();if(!enable){LCD_E1_L;Lcm_Delay();LCD_E1_H;getd=GPIO_ReadInputData(LCD_DATA_PORT);if((getd&0x0080)==0)break;}else{LCD_E2_L;Lcm_Delay();LCD_E2_H;if((getd&0x0080)==0)break;}}}//-----写指令----------------void Lcm_Wr_Com(u8 wcomd,u8 enable){Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_L;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wcomd|(~wcomd<<16); //Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}// Lcm_Delay();}//------写数据----------------void Lcm_Wr_Dat(u8 wdata,u8 enable) {Lcm_Rd_Status(enable);Lcm_Delay();LCD_RS_H;Lcm_Delay();LCD_RW_L;Lcm_Delay();LCD_DATA=wdata|(~wdata<<16);Lcm_Delay();if(!enable){LCD_E1_H;Lcm_Delay();LCD_E1_L;}else{LCD_E2_H;Lcm_Delay();LCD_E2_L;}}#endif//----选定坐标,全屏选择---------- void Lcm_GotoXY(u8 pos_x,u8 pos_y) {u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;Lcm_Wr_Com(addr,0);//设定DDRAM地址Lcm_Wr_Com(addr,1);//设定DDRAM地址}//---选定坐标,分屏选择------------void Lcm_SETXY(u8 pos_x,u8 pos_y,u8 enable){u8 addr;if((pos_x>11)||(pos_y>1))return;if(pos_y==0)addr=0x80+pos_x;else if(pos_y==1)addr=0x90+pos_x;if(enable==0)Lcm_Wr_Com(addr,0);//设定DDRAM地址elseLcm_Wr_Com(addr,1);//设定DDRAM地址}//----------初始化----------------void Lcm_Init(u8 enable){#ifdef PSB_SERIALLCD_PSB_L; //选择串口#elseLCD_PSB_H; //选择并口#endifLcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x30,enable);Delay_ms(2);Lcm_Wr_Com(0x0c,enable); //开显示及光标设置Delay_ms(2);Lcm_Wr_Com(0x01,enable); //显示清屏Delay_ms(3);Lcm_Wr_Com(0x06,enable); //显示光标移动设置Delay_ms(3);}/*--------- display function----------以下为各种显示函数---------------------------------------*/void Lcm_Disp_Char(u8 onechar,u8 enable)//显示单个字符{Lcm_Wr_Dat(onechar,enable);}void Lcm_Disp_Str(u8 *strings,u8 enable)//显示字符串{while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}void Lcm_Disp_Char_setxy(u8 x,u8 y,u8 ch,u8 enable) //指定坐标显示字符{Lcm_GotoXY(x, y);Lcm_Wr_Dat(ch,enable);}void Lcm_Disp_Str_setxy(u8 x,u8 y,u8 *strings,u8 enable)//指定坐标显示字符串{Lcm_GotoXY(x, y);while(*strings != '\0')Lcm_Wr_Dat(*strings++,enable);Lcm_Wr_Dat('\0',enable);}二、以下是STM32配置函数/* 函数申明---------------------STM32配置和19264函数声明-------------------------------*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void WWDG_Configuration(void);/********************************************************************** ************* 函数名称:RCC_Configuration(void)** 函数功能:时钟初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;void RCC_Configuration(void){/* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}}/********************************************************************** ************* 函数名称:GPIO_Configuration(void)** 函数功能:端口初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void GPIO_Configuration(void){//定义端口结构体GPIO_InitTypeDef GPIO_InitStructure;//将GPIOA端口使能有效RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE );GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | //GPIOAGPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6 |GPIO_Pin_7 |GPIO_Pin_8 |GPIO_Pin_9 |GPIO_Pin_10 |GPIO_Pin_11 |GPIO_Pin_12 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口}/********************************************************************** ************* 函数名称:NVIC_Configuration(void)** 函数功能:中断初始化** 输入:无** 输出:无** 返回:无********************************************************************* ************/void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Init(&NVIC_InitStructure);}/******************************************************************************** *函数功能:延时函数/*--- Delay function-----------------延时函数定义********************************************************************* ************///------1ms延时------------void Delay_ms(u32 m){u32 i;for(; m != 0; m--)for (i=0; i<25000; i++); //clk=50MHz ,25_000000 分频得1s,25000分频得1ms}//---------液晶延时----------void Lcm_Delay(void){u8 j,i=100;while(i--){for(j=0;j<100;j++){;}}}#endif/*************结束***************/。

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制

STM32产生频率可调正弦波、锯齿波、三角波&LCD界面控制此程序能输出两路通道,三路波形,利用STM32的DAC,TIM,LCD,和DMA控制的发射出正弦波,锯齿波和三角波,每种波形频率可调,独立输出,独立显示频率,使能。

最高频率达12.5KHz。

三种波形都是有一个简易小UI界面,电阻式触摸屏,能够完全手动控制通道的选择,波形的选择频率的选择以及各种波形的使能。

/****************************************************************************** **************使用手册:0.初学即兴所敲,不喜勿喷。

1.通道1和通道2只能分开输出。

2.只有选中响应的波形选择框,才能设置频率或者使能。

3.使能端只能在通道1或者通道2打开的情况下才能被使按下操作有效。

4.每次使能一个波形,其他波形使能将自动关闭。

5.当通道1和通道2都关闭,使能将自动无效。

6.通道1和通道2切换,必须重新使能。

7.开发平台为STM32战舰版。

USER:Zhang Changhao******************************************************************************* **************/#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "lcd.h"#include "usart.h"#include "24cxx.h"#include "flash.h"#include "touch.h"#include "STM32_WaveOutput.h"u8 t,Mode1,Mode2,Mode1_Flag,Mode2_Flag;u8 sinewave_flag,sawtooth_flag,triangle_flag,sinewave_mode,sawtooth_mode,triangle_mode;u8 sinewave_en,sawtooth_en,triangle_en;u8 sinewave_fre,sawtooth_fre,triangle_fre;u8 output_wave;u16 output_fre;#define MODE1 1#define MODE2 2#define sinewave 1#define sawtooth 2#define triangle 3void wave_show(u8 wavemode);void en_show(u8 wavemode);void Mode_Show(u8 mode);void wave_fre(u8 wavemode);void judge_tongdao();void judge_wave();void judge_en();void judge_fre();void show_init();void fengbi_tongdao();int main(void){delay_init();//延时函数初始化NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);//串口初始化为9600LED_Init();//LED端口初始化LCD_Init();KEY_Init();tp_dev.init();show_init();while(1){t=TP_Scan(0);if(t){t=0;//printf("%d,%d\r\n",tp_dev.x[0],tp_dev.y[0]);judge_tongdao();judge_wave();judge_en();judge_fre();if(sinewave_en==1||sawtooth_en==1||triangle_en==1){if(Mode1_Flag!=DISABLE){if(sinewave_en){output_wave=sinewave;output_fre=sinewave_fre*100;}else if(sawtooth_en){output_wave=sawtooth;output_fre=sawtooth_fre*100;}else if(triangle_en){output_wave=triangle;output_fre=triangle_fre*100;}printf("%d,%d\r\n",output_wave,output_fre);Wave_Init((output_wave-1),output_fre,ENABLE,(output_wave-1),output_fre,DISABLE); //printf("%d\r\n",TIM_TimeBaseStructure.TIM_Period);//Set_WaveFre(0,output_fre);}else if(Mode2_Flag!=DISABLE){if(sinewave_en){output_wave=sinewave;output_fre=sinewave_fre*100;}else if(sawtooth_en){output_wave=sawtooth;output_fre=sawtooth_fre*100;}else if(triangle_en){output_wave=triangle;output_fre=triangle_fre*100;}Wave_Init((output_wave-1),output_fre,DISABLE,(output_wave-1),output_fre,ENABLE);printf("%d,%d\r\n",output_wave,output_fre);}}else{Wave_Init(0,1,DISABLE,0,1,DISABLE);}}//if(t)LED1=!LED1;delay_ms(100);}}void show_init(){//清屏LCD_Clear(CYAN);POINT_COLOR=BROWN;//设置字体为红色LCD_Fill(0,0,2,320,BROWN);LCD_Fill(0,0,240,2,BROWN) ;LCD_Fill(0,318,240,320,BROWN);LCD_Fill(238,0,240,320,BROWN);LCD_Fill(7,7,9,313,BROWN);LCD_Fill(7,7,233,9,BROWN) ;LCD_Fill(7,311,233,313,BROWN);LCD_Fill(231,7,233,313,BROWN);LCD_DrawLine(0,0,7,7);LCD_DrawLine(233,313,240,320);LCD_DrawLine(233,7,240,0);LCD_DrawLine(7,313,0,320);//通道1 2的初始化POINT_COLOR=RED;//设置字体为红色LCD_Fill(20,20,110,65,MAGENTA);LCD_ShowString(38,35,80,16,16,"Output1"); LCD_Fill(130,20,220,65,MAGENTA);LCD_ShowString(148,35,80,16,16,"Output2");//正弦初始化LCD_Fill(50,80,145,110,LIGHTGREEN) ;LCD_ShowString(67,88,64,16,16,"SineWave"); LCD_Fill (155,80,200,110,RED) ;POINT_COLOR=GREEN;Draw_Circle(55,125,13);LCD_DrawLine(42,125,68,125);LCD_DrawLine(55,112,55,138);POINT_COLOR=BROWN;Draw_Circle(168,125,13);LCD_DrawLine(155,125,181,125) ;LCD_ShowString(72,120,80,16,16,"Fre:0.0KHz");//锯齿初始化POINT_COLOR=RED;LCD_Fill(50,150,145,180,DARKBLUE);LCD_ShowString(67,158,64,16,16,"SawTooth"); LCD_Fill (155,150,200,180,RED) ;POINT_COLOR= GREEN;Draw_Circle(55,195,13);LCD_DrawLine(42,195,68,195);LCD_DrawLine(55,182,55,208);POINT_COLOR=BROWN;Draw_Circle(168,195,13);LCD_DrawLine(155,195,181,195);LCD_ShowString(72,190,80,16,16,"Fre:0.0KHz");//三角初始化POINT_COLOR=RED;LCD_Fill(50,220,145,250,YELLOW) ;LCD_ShowString(63,228,64,16,16,"triangle"); LCD_Fill(155,220,200,250,RED) ;POINT_COLOR= GREEN;Draw_Circle(55,265,13);LCD_DrawLine(42,265,68,265);LCD_DrawLine(55,252,55,278);POINT_COLOR= BROWN;Draw_Circle(168,265,13);LCD_DrawLine(155,265,181,265);LCD_ShowString(72,260,80,16,16,"Fre:0.0KHz");LED0=0;//张长浩POINT_COLOR=DARKBLUE;LCD_ShowString(65,295,168,16,16,"BY:Zhang Changhao^_^");POINT_COLOR= BROWN;}void judge_tongdao(){//通道1 2 的识别操作if((tp_dev.x[0]>19)&&(tp_dev.x[0]<111)&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66)){ printf("\r\n");if(Mode1_Flag){Mode1_Flag=0;Mode1=DISABLE;//fengbi_tongdao();Mode_Show(MODE1);}else{Mode1_Flag=1;if(Mode2_Flag){Mode2=0;Mode2_Flag=0;Mode_Show(MODE2) ;}Mode1=ENABLE;Mode_Show(MODE1);}fengbi_tongdao();}else if((tp_dev.x[0]>129)&&(tp_dev.x[0]<221)&&(tp_dev.y[0]>19)&&(tp_dev.y[0]<66)){if(Mode2_Flag){Mode2_Flag=0;Mode2=DISABLE;//fengbi_tongdao();Mode_Show(MODE2);}else{Mode2_Flag=1;if(Mode1_Flag){Mode1=0;Mode1_Flag=0;Mode_Show(MODE1);}Mode2=ENABLE;Mode_Show(MODE2) ;}fengbi_tongdao();}}void judge_wave(){//三个波的识别操作if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146)&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111)) {if(sinewave_flag){sinewave_flag=0;sinewave_mode=DISABLE;wave_show(sinewave);}else{sinewave_flag=1;if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=0;wave_show(sawtooth) ;}else if(triangle_flag){triangle_flag=0;triangle_mode=0;wave_show(triangle) ;}sinewave_mode=ENABLE;wave_show(sinewave);}}///////////////else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146) &&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181)) {if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=DISABLE;wave_show(sawtooth);}else{sawtooth_flag=1;if(sinewave_flag){sinewave_flag=0;sinewave_mode=0;wave_show(sinewave) ;}else if(triangle_flag){triangle_flag=0;triangle_mode=0;wave_show(triangle) ;}sinewave_mode=ENABLE;wave_show(sawtooth);}}///////////////////////////////////else if((tp_dev.x[0]>49)&&(tp_dev.x[0]<146) &&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251)) {if(triangle_flag){triangle_flag=0;triangle_mode=DISABLE;wave_show(triangle);}else{triangle_flag=1;if(sinewave_flag){sinewave_flag=0;sinewave_mode=0;wave_show(sinewave) ;}if(sawtooth_flag){sawtooth_flag=0;sawtooth_mode=0;wave_show(sawtooth) ;}triangle_mode=ENABLE;wave_show(triangle);}}}void judge_en(){//三种波的使能显示if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201)&&(tp_dev.y[0]>79)&&(tp_dev.y[0]<111)) {if(sinewave_flag&&(Mode1||Mode2)){if(sinewave_en){sinewave_en=0;en_show(sinewave);}else{sinewave_en=1;if(sawtooth_en){sawtooth_en=0;en_show(sawtooth) ;}else if(triangle_en){triangle_en=0;wave_show(triangle) ;}en_show(sinewave);}}else{sinewave_en=0;en_show(sinewave);}}///////////////else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201) &&(tp_dev.y[0]>149)&&(tp_dev.y[0]<181)) {if(sawtooth_flag&&(Mode1||Mode2)){if(sawtooth_en){sawtooth_en=0;en_show(sawtooth);}else{sawtooth_en=1;if(sinewave_en){sinewave_en=0;en_show(sinewave) ;}else if(triangle_en){triangle_en=0;en_show(triangle) ;}en_show(sawtooth);}}else{sawtooth_en=0;en_show(sawtooth);}}///////////////////////////////////else if((tp_dev.x[0]>154)&&(tp_dev.x[0]<201) &&(tp_dev.y[0]>219)&&(tp_dev.y[0]<251)) {if(triangle_flag&&(Mode1||Mode2)){if(triangle_en){triangle_en=0;en_show(triangle);}else{triangle_en=1;if(sinewave_en){sinewave_en=0;en_show(sinewave) ;}if(sawtooth_en){sawtooth_en=0;en_show(sawtooth) ;}en_show(triangle);}}else{triangle_en=0;en_show(triangle);}} //使能判断if(triangle_en==0||sawtooth_en==0||sinewave_en==0){TIM_Cmd(TIM6, DISABLE);TIM_Cmd(TIM2, DISABLE);}}void judge_fre(){// 频率检测if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150){if(sinewave_flag){sinewave_fre+=1;wave_fre(sinewave);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(125-tp_dev.y[0])*(125-tp_dev.y[0])<150){if(sinewave_flag){sinewave_fre-=1;wave_fre(sinewave);}}else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150){if(sawtooth_flag){sawtooth_fre+=1;wave_fre(sawtooth);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(195-tp_dev.y[0])*(195-tp_dev.y[0])<150){if(sawtooth_flag){sawtooth_fre-=1;wave_fre(sawtooth);}}else if((tp_dev.x[0]-55)*(tp_dev.x[0]-55)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150){if(triangle_flag){triangle_fre+=1;wave_fre(triangle);}}else if((tp_dev.x[0]-168)*(tp_dev.x[0]-168)+(265-tp_dev.y[0])*(265-tp_dev.y[0])<150){if(triangle_flag){triangle_fre-=1;wave_fre(triangle);}} //判断频率}void Mode_Show(u8 mode){u16 color;color = POINT_COLOR;if(mode==1)//如果是模式1 就对模式1进行操作{if(Mode1==1){//横打印LCD_Fill(20,20,110,25,BLACK);LCD_Fill(20,60,110,65,BLACK);//竖打印LCD_Fill(105,20,110,65,BLACK);LCD_Fill(20,20,25,65,BLACK);}else{//横打印LCD_Fill(20,20,110,25,MAGENTA);LCD_Fill(20,60,110,65,MAGENTA);//竖打印LCD_Fill(105,20,110,65,MAGENTA);LCD_Fill(20,20,25,65,MAGENTA);}}else{if(Mode2==1){//横打印LCD_Fill(130,20,220,25,BLACK);LCD_Fill(130,60,220,65,BLACK);//竖打印LCD_Fill(215,20,220,65,BLACK);LCD_Fill(130,20,135,65,BLACK);}else{//横打印LCD_Fill(130,20,220,25,MAGENTA);LCD_Fill(130,60,220,65,MAGENTA);//竖打印LCD_Fill(215,20,220,65,MAGENTA);LCD_Fill(130,20,135,65,MAGENTA);}}POINT_COLOR=color;}void wave_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){//横打印LCD_Fill(50,80,145,85,BLACK);LCD_Fill(50,105,145,110,BLACK);//竖打印LCD_Fill(50,80,55,110,BLACK);LCD_Fill(140,80,145,110,BLACK);}else{//横打印LCD_Fill(50,80,145,85,LIGHTGREEN);LCD_Fill(50,105,145,110,LIGHTGREEN);//竖打印LCD_Fill(50,80,55,110,LIGHTGREEN);LCD_Fill(140,80,145,110,LIGHTGREEN);}}else if(wavemode==2)//如果是saw 就对模式2进行操作{if(sawtooth_flag==1){//横打印LCD_Fill(50,150,145,155,BLACK);LCD_Fill(50,175,145,180,BLACK);//竖打印LCD_Fill(50,150,55,180,BLACK);LCD_Fill(140,150,145,180,BLACK);}else{LCD_Fill(50,150,145,155,DARKBLUE);LCD_Fill(50,175,145,180,DARKBLUE);//竖打印LCD_Fill(50,150,55,180,DARKBLUE);LCD_Fill(140,150,145,180,DARKBLUE);}}else if(wavemode==3)//如果是tri 就对模式3进行操作{if(triangle_flag==1){//横打印LCD_Fill(50,220,145,225,BLACK);LCD_Fill(50,245,145,250,BLACK);//竖打印LCD_Fill(50,220,55,250,BLACK);LCD_Fill(140,220,145,250,BLACK);}else{//横打印LCD_Fill(50,220,145,225,YELLOW);LCD_Fill(50,245,145,250,YELLOW);//竖打印LCD_Fill(50,220,55,250,YELLOW);LCD_Fill(140,220,145,250,YELLOW);}}POINT_COLOR=color;}void en_show(u8 wavemode){u16 color;color = POINT_COLOR;if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){if(sinewave_en){LCD_Fill(155,150,200,180,RED);LCD_Fill(155,220,200,250,RED);//切换波形后吧其他波形给关了LCD_Fill(155,80,200,110,GREEN);}else{LCD_Fill(155,80,200,110,RED);}}}if(wavemode==2)//如果是saw 就对模式2进行操作{if(sawtooth_flag==1){if(sawtooth_en){LCD_Fill(155,80,200,110,RED);LCD_Fill(155,220,200,250,RED);LCD_Fill(155,150,200,180,GREEN);}else{LCD_Fill(155,150,200,180,RED);}}}if(wavemode==3)//如果是saw 就对模式2进行操作{if(triangle_flag==1){if(triangle_en){LCD_Fill(155,150,200,180,RED);LCD_Fill(155,80,200,110,RED);LCD_Fill(155,220,200,250,GREEN);}else{LCD_Fill(155,220,200,250,RED);}}}POINT_COLOR=color;}void wave_fre(u8 wavemode){if(wavemode==1)//如果是sine 就对模式2进行操作{if(sinewave_flag==1){LCD_ShowNum(104,120,(sinewave_fre/10),1,16);LCD_ShowNum(120,120,(sinewave_fre%10),1,16);}}if(wavemode==2)//如果是sine 就对模式2进行操作{if(sawtooth_flag==1){LCD_ShowNum(104,190,(sawtooth_fre/10),1,16);LCD_ShowNum(120,190,(sawtooth_fre%10),1,16);}}if(wavemode==3)//如果是sine 就对模式2进行操作{if(triangle_flag==1){LCD_ShowNum(104,260,(triangle_fre/10),1,16);LCD_ShowNum(120,260,(triangle_fre%10),1,16);}}}void fengbi_tongdao(){sinewave_en=0;sawtooth_en=0;triangle_en=0;LCD_Fill(155,150,200,180,RED);LCD_Fill(155,220,200,250,RED);LCD_Fill(155,80,200,110,RED);if(Mode1==DISABLE){TIM_Cmd(TIM2, DISABLE);}if(Mode2==DISABLE){TIM_Cmd(TIM6, DISABLE);}}。

毕业设计(论文)-基于stm32的触摸屏控制设计[管理资料]

毕业设计(论文)-基于stm32的触摸屏控制设计[管理资料]

湖南农业大学东方科技学院全日制普通本科生毕业论文基于STM32的触摸屏控制设计Based on STM32 and Touch Tcreen Control Design学生姓名:学号:年级专业及班级:2008级信息工程(2)班指导老师及职称:学部:理工学部提交日期:2012年5月湖南农业大学东方科技学院全日制普通本科生毕业论文(设计)诚信声明本人郑重声明:所呈交的本科毕业论文是本人在指导老师的指导下,进行研究工作所取得的成果,成果不存在知识产权争议。

除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。

对本文的研究做出重要贡献的个人和集体在文中均作了明确的说明并表示了谢意。

同时,本论文的著作权由本人与湖南农业大学东方科技学院、指导教师共同拥有。

本人完全意识到本声明的法律结果由本人承担。

毕业论文(设计)作者签名:(作者手写签名)年月日目录摘要 (1)关键词 (1)1 前言 (2)ARM应用背景 (2)研究内容 (3)研究成果 (4)2 STM32处理器的概述 (4)STM32简介 (4)STM32的参数 (5)内部资源 (5)3 图片的处理和显示实现方法 (7)液晶显示电路设计: (7)图片的处理 (7)总体方案与硬件整体架构 (7)本例中FSMC的使用 (9)ILI9325 (10)显示实现 (10)TFTLCD字显示 (11)TFTLCD图显示 (12)供电部分电路设计 (13)4 软件设计模块 (14)程序编写步骤 (14)系统初始化 (17)STM32的开发软件 (17)FSMC模块介绍以及初始化程序 (17)屏接口时序的实现 (18)5 运行方法和结果 (19)硬件电路连接 (19)程序编写步骤 (19)现象和结果 (19)6 结论 (20)参考文献 (20)致谢 (20)基于STM32的触摸屏控制设计摘要:伴随着科技的发展,现代电子产品中的单片机和触摸屏在手机、导航仪器、电子测试仪器以及咨询终端等设备中都有很广泛的应用。

基于STM32单片机FSMC接口驱动LCD的配置与分析

基于STM32单片机FSMC接口驱动LCD的配置与分析

修稿日期: 2018-03-13 作者简介: 李 良 ,硕 士 ,毕业于南开大学。主要研究方向:嵌入式 系统设计。
FSMC_NE4 > FSMC_NWE >
FSMC_D1 > FSMC_D3 >
> FSMC_D5
FSMC_D7 > FSMC_D9 > FSMC_D11 > FSMC_D13 > FSMC_D15 >-
存是通过三总线形式进行访问的,即地址总线、数据总线 和控制总线,只是对于不同的控制芯片总线宽度不一样而
已。STM3 2 的 FSMC[1]就 像 5 1 系列单片机的外部总线一 样 ,只不过性能更好,速度更快。本文主要分析基于STM32 芯 片 FSMC接口的ILI9341液晶显示屏的控制过程。
1 硬件连接关系
李 良 ,王 德 生 ,王 小 康 ,姜小存
(火箭军士官学校,山 东 青 州 262500)
摘 要 :液 晶 显 示 无 论 是 在 物 联 网 领 域 还 是 人 们 的 日 常 生 活 中 用 到 的 越 来 越 频 繁 ,液 晶 显 示 器 的 接 口 也 有
多 种 方 式 ,而 FSM C接 口 作 为 驱 动 L C D 显 示 的 一 种 形 式 被 广 泛 应 用 。论 文 主 要 分 析 基 于 STM3 2 单片机 FSMC接 口 的 地 址 映 射 关 系 ,并 对 FSMC接 口 的 软 件 配 置 进 行 总 结 ,为 驱 动 不 同 LC D 提 供 参 考 。 关键词:STM32; FSMC接 口 配 置 ;LCD 显示 中图分类号:TP37 文献标识码: A d〇i:10.3969/j .issn.1002-6673.2018.04.025

DL-STM32自学成才系列教程之十四《点亮LCD液晶屏》

DL-STM32自学成才系列教程之十四《点亮LCD液晶屏》

STM32入门系列教程点亮LCD液晶屏Revision0.01(2011-09-28)原想把本期《点亮LCD液晶屏》教程放在《GPIO编程》之后,以提高大家的兴趣,但考虑到可能网友学习STM32,是想更多地了解STM32内部工作机制,因此在之前的教程,我们先介绍了串口、外部中断、定时器等最基本的外设模块,有了这些基础,相信您再来学习LCD液晶,已经很轻松了。

我们使用的是芯达STM32配套的2.4寸TFT液晶触摸屏,它是山寨手机上的触摸液晶屏,内部驱动IC为ILI9325。

我们操作LCD,实际上就是在操作ILI9325。

有关该芯片的资料,请参考如下两个网址:ILI9325指令说明(中文):/read.php?tid=142考虑到“触摸”涉及到太多的原理,因此把触摸屏单独列出一期教程详细讲解。

这里只讲述如何去点亮LCD液晶屏,如果您看完本期教程,能理解LCD驱动过程,那么笔者心满意足。

要驱动LCD,分两个部分讲解:1、CPU内部模块支持的LCD接口(这里使用FSMC模块)2、LCD控制电路一、STM32的FSMC原理如果是单片机,相信大家再熟悉不过了,直接拿P0或者P1口用作LCD数据总线,再另外拿出几个IO口用作控制信号线——一个LCD控制电路完成了。

STM32相对于单片机,有啥过人之处呢?对于STM32系列的CPU来说,有两种方法给LCD总线赋值。

第一个方法,就是给对应的GPIOx_ODR寄存器赋值——这与单片机一样,单片机也是给P0-P3寄存器赋值,使得信号能从对应的IO端口输出。

而STM32的另一种方法就是使用FSMC。

FSMC全称“静态存储器控制器”。

使用FSMC控制器后,我们可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。

1、FSMC包括哪几个部分?FSMC包含以下四个模块:(1)AHB接口(包含FSMC配置寄存器)(2)NOR闪存和PSRAM控制器(3)NAND闪存和PC卡控制器(4)外部设备接口要注意的是,FSMC可以请求AHB进行数据宽度的操作。

基于STM32的LCD操作

基于STM32的LCD操作

基于STM32的LCD操作在STM32系列微控制器中,通常使用GPIO口来与LCD进行通信。

以下是实现STM32与LCD操作的一般步骤:1.连接硬件:-连接STM32的GPIO口与LCD的数据线,用于传输数据。

-连接STM32的GPIO口与LCD的控制线,用于控制读写操作。

-连接STM32的GPIO口与LCD的使能线,用于使能LCD。

2.配置GPIO:-使用STM32的寄存器来配置相应的GPIO口,将其设置为输出模式。

-设置GPIO口的驱动能力,确保能够将足够的电流传输到LCD。

3.初始化LCD:-发送初始化命令到LCD,初始化其内部寄存器和设置显示模式。

-确定LCD的工作电压和时序,设置相应的寄存器参数。

4.发送数据到LCD:-设置控制线的状态(如RS、R/W和EN)来指示将要发送的数据类型(指令还是数据)。

-将数据通过数据线发送到LCD,通常是通过一个存储器映射的寄存器。

-根据LCD的特性,可能需要发送多个字节的数据或者使用特殊的数据格式(如帧缓冲)。

5.控制LCD的操作:-使用相应的指令来控制LCD的显示模式,如清屏、设置光标位置、显示字符等。

-根据需要,可以实现自定义的功能,如绘制图形、显示动画等。

6.关闭LCD:-在使用完毕后,可以发送相应的指令将LCD置于睡眠或关闭状态,以节省功耗。

-断开与LCD的通信连接,释放相关的资源。

在实际的应用中,还需要考虑以下几个方面:-适配不同型号的LCD:不同型号的LCD可能有不同的控制指令和时序要求,需要针对特定的型号进行设置和适配。

-优化显示效果:可以根据具体需求,使用合适的字体和颜色,以及优化渲染算法、缓冲区管理等来提升显示效果和性能。

-操作LCD的并发性:在多任务的环境下,可能需要使用互斥锁或其他同步机制,以确保多个任务同时操作LCD时不会发生冲突。

-处理异常情况:在操作LCD的过程中,可能会出现异常情况,如通信错误、显示故障等,需要进行相应的错误处理和恢复操作。

自己验证过的STM32的LCD程序

自己验证过的STM32的LCD程序
void LCD_WR_DATA(u16 data)//写16位数据函数
{
LCD_RS_SET;
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
/*****************************************************************************
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(0x22);
}
/*****************************************************************************
///////////////////////////////////////
/* hhhhhhhhhh*/
#include "lcd.h"
#include "stdlib.h"
//#include "font.h"
#include "usart1.h"
u16 POINT_COLOR,BACK_COLOR=WHITE;//画笔颜色,背景颜色
regval|=L2R_U2D; //从左到右,从上到下
regval|=1<<12;
LCD_WriteReg(0X03,regval);
}
/*****************************************************************************

基于STM32的LCD操作

基于STM32的LCD操作

《嵌入式系统》课程报告基于STM32的LCD操作组长:曾昭智姓名组员:邓宁、张小扬、牛洪澄学院光电学院班级电信2班、3班完成日期2014.05.29目录1、原理方案(功能框图介绍) (1)2、电路连线及资源分配 (2)3、所用主要器件或模块说明 (3)4、程序流程图 (4)5、调试心得 (5)6、源代码 (6)1.TFT-LCD原理1.1 TFT-LCD简介TFT-LCD即薄膜晶体管液晶显示器。

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

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

TFT-LCD也被叫做真彩液晶显示器。

上一节介绍了OLED模块,这一节,我们给大家介绍ALIENTEK TFTLCD模块,该模块有如下特点:1,2.4’/2.8’两种大小的屏幕可选。

2,320×240的分辨率。

3,16位真彩显示。

4,自带触摸屏,可以用来作为控制输入。

5,通用的接口,除了ALIENTEK MiniSTM32开发板,该液晶模块还可以使用在优异特、STMSKY、红牛等开发板上。

本节,我们以2.8寸的ALIENTEK TFTLCD模块为例介绍,该模块采用的是显尚光电的DST2001PH TFTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD 屏,分辨率为320×240,采用16位的80并口。

1.2 80并口ALIENTEK TFTLCD模块采用80并口口方与外部链接,采用16位数据线(低了速度太慢,用彩色就没什么效果了)。

该模块的80并口有如下一些信号线:CS:TFTLCD片选信号。

WR:向TFTLCD写入数据。

RD:从TFTLCD读取数据。

基于STM32F103C8T6单片机的LCD显示系统设计

基于STM32F103C8T6单片机的LCD显示系统设计

基于STM32F103C8T6单片机的LCD显示系统设计一、引言随着科技的不断进步,单片机逐渐成为各种电子设备中不可或缺的核心芯片。

而LCD(液晶显示器)作为一种常见的显示设备,广泛应用于各种电子产品中。

本文将介绍一种,该设计能够实现图形和文本的显示,并且具有较高的灵活性和可扩展性。

本文以STM32F103C8T6单片机为基础,通过编程和电路设计实现了LCD的驱动和控制,从而实现了一种简单而实用的LCD显示系统。

二、设计方案1. 硬件设计(1)STM32F103C8T6单片机STM32F103C8T6是一款由意法半导体(STMicroelectronics)生产的32位ARM Cortex-M3内核的单片机,具有丰富的外设资源和强大的计算能力,非常适合用于LCD显示系统的设计。

(2)LCD模块我们选择了一块128x64点阵的LCD模块,该模块具有较大的显示区域和较高的分辨率,能够满足大部分应用需求。

(3)与STM32F103C8T6单片机连接的电路设计根据LCD模块的接口规范,设计一个与STM32F103C8T6单片机相连接的电路,包括数据线和控制线的连接。

使用合适的电平转换电路,将STM32F103C8T6单片机输出的信号适配到LCD模块。

2. 软件设计(1)LCD驱动程序设计设计一个LCD驱动程序,实现与LCD模块的通信和控制。

通过配置STM32F103C8T6单片机的GPIO端口,向LCD模块发送指令和数据,并设置显示模式、显示位置等参数,控制LCD的显示内容。

(2)图形显示程序设计设计一个图形显示程序,实现在LCD上绘制简单的图形,如线段、矩形等。

通过调用相关图形库函数,将需要显示的图形绘制在指定的位置。

(3)文本显示程序设计设计一个文本显示程序,实现在LCD上显示字符串。

通过调用相关文本库函数,将需要显示的字符串按照指定的字体和样式显示在指定的位置。

三、实现与测试根据以上设计方案,进行硬件和软件的实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void LCD_WR_REG(u8 data)
{
LCD_RS_CLR;/写/地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
#else//正常IO
//写寄存器函数
void LCD_WR_REG(u8 data)
{
LCD_RS=0;//写地址
屏的现象,程序与开发板不兼容也会产生同样现象;并且在使用Keil调试的时 候没有进行正确的设置也会导致下载程序无法顺利进行。 所以在调试的时候要确 保程序的正确及对Keil的正确的使用才能顺利完成实验。
调试结果(到屏幕的背景是不停切换的
):
6.
6.1LCD_WR_RE函G数:通过80并口向LCD模块写入8位的寄存器命令#if LCD_FAST_IO==1 //快速IO
这些线的连接,MiniSTM32的内部已经连接好了,我们只需要将 就好了。
3.
TFTLCD
模块插上去
3.1TFT-LCD模块原理图
3.2TFT-LCD模块接口图
4.程序流程图
写入数据
读取数据
5.
调试之前需将MiniSTM32开发板连接至PC并且安装好相应的驱动程序;在
调试程序的时候将错误程序下载到MiniSTM32中会导致LCD屏无法打开或者是白
RS:命令/数据标志(0,读写命令;1,读写数据)。
TFTLCD模块的RST信号线和OLED模块一样, 也是直接接到STM32的复位脚上, 并 不由软件控制, 这样可以省下来一个IO口。另外我们还需要一个背光控制线来控制TFTLCD的背光。所以,我们总共需要的IO口数目为21个。
1.3ILI9320
模块的控制器为ILI9320,该控制器自带显存, 其显存总大小为172820(240*320*18/8), 即18位模式 (26万色)下的显存量。 模块的16位数据线与显寸的对应关系为565方式, 如 下图所示:
1.4GRAM显示方向设置
1.5TFTLCD显示需要的相关设置步骤如下
(1)设置STM32与TFTLCD模块相连接的IO。
LCD_CS=0;
DATAOUT(data);
WR=0;
LCD_WR=1;
(3)通过函数将字符和数字显示到TFTLCD模块上。
这里就是通过我们设计的程序,将要显示的字符送到TFTLCD模块就可以了,这些函数将在软件设计部分向大家介绍。
通过以上三步, 我们就可以使用ALIENTEKT FTLCD模块来显示字符和数字了,并 且可以显示各种颜色的背景。
2.
MiniSTM32开发板底板的LCD接口和ALIENTEK TFTLCD模块直接可以对插,连接如下图:
矩阵不同, 它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰, 使显示液晶屏的静态特性与扫描线数无关, 因此大 大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。
上一节介绍了OLED模块,这一节,我们给大家介绍ALIENTEK TFTLC模D块,该模块有如下特点:
1,2.4'/2.8'两种大小的屏幕可选。
2,320×240的分辨率。
3,16位真彩显示。
4,自带触摸屏,可以用来作为控制输入。
5,通用的接口,除了ALIENTEK MiniSTM32开发板,该液晶模块还可以使用在优异特、STMSK、Y红牛等开发板上。
本节,我们以2.8寸的ALIENTEKT FTLCD模块为例介绍,该模块采用的是显尚光电的DST2001PHT FTLCD,DST2001PH的控制器为ILI9320,采用26万色的TFTLCD屏,分辨率为320×240,采用16位的80并口。
1.280并口
ALIENTEK TFTLCD模块采用80并口口方与外部链接,采用16位数据线(低了速度太慢,用彩色就没什么效果了)。该模块的80并口有如下一些信号线:
CS:TFTLCD片选信号。
WR:向TFTLCD写入数据。
RD:从TFTLCD读取数据。
D[15:0]:16位双向数据线。
RST:硬复位TFTLCD。
嵌入式系统》课程报告
基于
组长:曾昭智 组员:邓宁、张小扬、牛洪澄
光电学院
电信2班、3班
2014.05.29
1、原理方案(功能框图介绍)················································1
2、电路连线及资源分配· ···················································2
3、所用主要器件或模块说明· ···············································3
4、程序流程图· ···························································4
5、调试心得· ·····························································5
这一步,先将我们与TFTLCD模块相连的IO口设置为输出,具体使用哪些IO口,这里需要根据连接电路以及TFTLCD模块的设置来确定。
(2)初始化TFTLCD模块。
其实这里就是上和上面OLED模块的初始化过程差不多。通过向TFTLCD写入一系列的设置,来启动TFTLCD的显示。为后续显示字符和数字做准备。
图中绿色线圈出来的部分就是连接TFTLCD模块的接口,这里在硬件上,TFTLCD模块与MiniSTM32开发板的IO口对应关系如下:
LCD_LED对应PC10;
LCD_CS对应PC9;
LCD _RS对应PC8;
LCD _WR对应PC7;
LCD _RD对应PC6;
LCD _D[17:1]对应PB[15:0];
6、源代码································································6
1.TFT-LCD
1.1TFT-LCD简介
TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单
相关文档
最新文档