收藏 分销(赏)

基于stm32在lcd上显示sd卡中bmp图片的设计.doc

上传人:w****g 文档编号:2247764 上传时间:2024-05-23 格式:DOC 页数:43 大小:2.79MB 下载积分:12 金币
下载 相关 举报
基于stm32在lcd上显示sd卡中bmp图片的设计.doc_第1页
第1页 / 共43页
基于stm32在lcd上显示sd卡中bmp图片的设计.doc_第2页
第2页 / 共43页


点击查看更多>>
资源描述
上海第二工业大学 实 训 报 告 课程名称: 电信专业综合实践 学生姓名: 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 第六章 系统调试结果及问题分析 35 6.1 系统调试后的实验现象 35 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显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。现基于STM32在液晶显示屏幕上显示文本及图形。 目前,显示技术和显示工业的发展迅速。显示技术是传递视觉的信息技术。液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。 截至目前,我国在液晶显示取得较大进步,我国LCD产业已经走过了近30年的历程.经历几次大的投资浪潮之后,我国内地已经成为世界最大的TN-LCD(扭曲液晶显示器)生产基地和主要的STN-LCD(超扭曲液晶显示器)生产基地,并且从2003年开始,涉足TFT-LCD(薄膜晶体管液晶显示器)领域. 1.2 本课题设计内容 本次设计采用STM32ISO开发板,实现一个从SD卡读取图片内容及汉子库在LCD显示屏上显示由按键控制图片切换的功能。本实验用到的硬件部分主要有STM32开发板、USB线、LCD液晶模块、SD卡、J-Link仿真器等主要部分组成。STM32开法板涉及Keil5程序的读取,SD卡读取裁剪过的图片,最后通过J-Link仿真器加载后,在LCD显示屏上显示相关内容,中英文内容提示通过设置延时衔接,图片通过按键直接控制。 第二章 实验方案总体设计 2.1详细设计Key2 STM32开发板 SD卡 蜂鸣器 LED灯 LCD液晶模块 Key1 按键区 组成框图: 2.2相关硬件简介 本节实验功能简介:开机的时候先初始化SD卡,如果SD卡初始化完成,则读取扇区0的数据,然后通过串口打印到电脑上。如果没初始化通过,则在LCD上提示初始化失败。 同样用DS0来指示程序正在运行。 所要用到的硬件资源如下: l STM32开发板 l USB线 l LCD液晶模块 l SD卡 l J-Link仿真器 2.2.1 STM32开发板 STM32F103系列属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。芯片集成定时器,CAN,ADC,SPI,I2C,USB,UART,等多种功能。 分为三大类: LD(小于64K), MD(小于256K), HD(大于256K), STM32F103VET6类属第三类。 STM32F103ZET6芯片介绍 ●基于ARM Cortex-M3核心的32 位微控制器,LQFP-144封装. ●512K 片内FLASH(相当于硬盘),64K片内RAM(相当于内存) ,片内FLASH 支持在线编程(IAP). ●高达72M 的频率,数据,指令分别走不同的流水线,以确保 CPU运行速度达到最大化 .  ●通过片内BOOT区,可实现串口下载程序(ISP). ●片内双RC 晶振,提供8M和32K 的频率. ●支持片外高速晶振(8M),和片外低速晶振(32K).其中片外低速晶振可用于 CPU 的实时时钟,带后备电源引脚,用于掉电后的时钟行走. ●42个16位的后备寄存器(可以理解为电池保存的RAM),利用外置的纽扣电池,和实现掉电数据保存功能. ●支持 JTAG,SWD调试.配合廉价的J-LINK,实现高速低成本的开发调试方案. ●多达80个IO(大部分兼容5V逻辑),4个通用定时器,2个高级定时器,2个基本定时器,3路SPI接口,2路I2S 接口,2路I2C接口,5路USART,一个USB从设备接口,一个 CAN接口,SDIO接口,可兼容SRAM,NOR和NAND Flash 接口的16位总线-FSMC. ●3路共16通道的12位AD输入,2路共2 通道的12位 DA 输出.支持片外独立电压基准. ●CPU操作电压范围:2.0-3.6V STM32开发板引脚图 2.2.2 USB线 USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。所以设备枚举成HID类设备。USB鼠标就是标准的USB-HID设备。不过操作系统阻止了应用程序直接访问USB鼠标返回的报告。所以本例使用自定义HID设备。一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据(仅指数据内容)。 USB是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口即插即用和热插拔功能。USB接口可连接127种外设,如鼠标和键盘等。USB是在1994年底由英特尔等多家公司联合在1996年推出后,已成功替代串口和并口,已成为当今电脑与大量智能设备的必配接口。USB版本经历了多年的发展,到如今已经发展为3.0版本. 对于大多数工程师来说,开发USB2.0 接口产品主要障碍在于:要面对复杂的USB2.0协议、自己编写USB设备的驱动程序、熟悉单片机的编程。这不仅要求有相当的VC编程经验、还能够编写USB接口的硬件(固件)程序。所以大多数人放弃了自己开发USB产品。为了将复杂的问题简单化,西安达泰电子特别设计了USB2.0协议转换模块。USB20D模块可以被看作是一个USB2.0协议的转换器,将电脑的USB2.0接口转换为一个透明的并行总线,就象单片机总线一样。从而几天之内就可以完成USB2.0产品的设计。 本实验用到的USB线 2.2.3 液晶显示器LCD 控制器简介 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。LCM(LCD Module)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。LCD,由于液晶显示屏功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互。由于 STM32 内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32 芯片通过驱动芯片来控制液晶屏和触摸屏。以本实验3.2 寸液晶屏(240*320)为例,它使用 ILI9341 芯片控制液晶屏,通过 XPT2046 芯片控制触摸屏。LCD 为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED 控制器就是用来控制液晶屏中的 LED 背光源。 液晶显示器在内部电路结构上主要有以下几个部分构成: 1、 驱动板(也叫主板):主要是用以接收、处理从外部送进来的模拟(VGA)或者数字(DVI)视频信号,并通过屏线送出信号去控制液晶屏(PANEL)正常工作。驱动板上含有MCU单元,它是液晶显示器的检测控制中心和大脑。 2、 电源板:用于将90~240V 的交流电压转变为12V、5V、3V 等的直流电供给显示器工作。 本实验用的STM32开发板 3、 背光板(也叫高压板):用于将主板或电源板输出的12V 的直流电压转变为PANEL 需要的高频的1500~1800V 的高压交流电,用于点亮PANEL的背光灯。电源板和背光板有时会做在一起也就是所谓的电源背光二合一板。 4、 液晶屏:液晶显示用模块,它是液晶显示器的核心部件,其包含液晶板和驱动电路。其中,液晶屏是液晶显示器内部最为关键的部件,它对液晶显示器的性能和价格具有决定性的作用。 本实验对应的背光板程序(程序很多不一一列举,仅取部分) (1) ILI9341控制器结构 液晶屏的控制芯片内部结构非常复杂 ,最主要的是位于中间GRAM(Graphics RAM),可以理解为显存。GRAM 中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把 GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 接口与 MCU 进行通讯,MUC 通过 8080 接口与 ILI9341进行通讯,从而访问它的控制寄存器(CR)、地址计数器(AC)、及 GRAM。 (2)像素点的数据格式 图像数据的像素点由红(R)、绿(G)、蓝(B)三原色组成,三原色根据其深浅程度被分为0~255 个级别,它们按不同比例的混合可以得出各种色彩。ILI9341 最高能够控制 18 位的 LCD,但为了数据传输简便,我们采用它的 16 位控制模式,以 16 位描述的像素点。按照标准格式,16 位的像素点的三原色描述的位数为 R:G:B =5:6:5,描述绿色的位数较多是因为人眼对绿色更为敏感。 (3)ILI9341的通讯时序 目前,大多数的液晶控制器都使用 8080 或 6800 接口与 MCU 进行通讯,它们的时序十分相似,本实验以 ILI9341 使用的 8080 通讯时序进行分析. ILI9341 的 8080 接口有 5 条基本的控制信号线: l 用于片选的 CSX 信号线; l 用于写使能的 WRX 信号线; l 用于读使能的 RDX 信号线; l 用于区分数据和命令的 D/CX 信号线; l (用于复位的 RESX 信号线。 见图 23-2。 使用18条数据线的8080接口写命令时序 由图可知,写命令时序由 CSX 信号线拉低开始,D/CX 信号线也置低电平表示写入的是命令地址(可理解为命令编码,如软件复位命令:0x01),以 WRX 信号线为低,RDX 信号为高表示数据传输方向为写入,同时,在数据线[17:0]输出命令地址,在第二个传输阶段传送的为命令的参数,所以 D/CX 要置高电平,表示写入的是命令数据。 当我们需要向 GRAM 写入数据的时候,把 CSX 信号线拉低后,把 D/CX 信号线置为高电平,这时由 D[17:0]传输的数据则会被 ILI9341 保存至它的 GRAM 中。 (4)给整个屏幕上色 再次回到 ILI9341_Init 函数,它调用完 ILI9341_REG_Config()初始化了液晶屏后,向ILI9341 发送了一个命令——写 GRAM 内容,即后面发送的数据都被解析为显示到屏幕像素点的数据。代码中使用 for 循环把语句 ILI9341_Write_Data(GBLUE)执行了 320*240 次,即把所有像素点都显示为 GBLUE 颜色。 (5)液晶屏画点函数 LCD_Init ()初始化了液晶屏后,可以控制液晶上每个像素点的颜色。如果能够实现一个画点函数,在指定的(x,y)坐标像素点上显示指定的颜色,那么就能够实现一切液晶屏最复杂的显示功能,如在液晶屏指定位置显示形状、文字、图像,都可以通过调用画点函数或以类似 的 方 式 控 制 液 晶 的 像 素 点 。 本 实 验 中 的 画 点 函 数 ILI9341_SetPointPixel() 在bsp_ili9341_lcd.c 文件中定义,见代码清单 (5)。 代码清单(5): ILI9341_SetPointPixel()函数 代码清单(5) 2.2.4 J-Link ARM主要特点 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,Cortex M0/M1/M3/M4, Cortex A5/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。产品规格:电源USB供电,整机电流 <50mA 支持的目标板电压 1.2 ~ 3.3V,5V兼容 目标板供电电压 4.5 ~ 5V (由USB提供5V) 目标板供电电流 最大300mA,具有过流保护功能 工作环境温度 +5℃~ +60℃ 存储温度 -20℃ ~ +65℃ 湿度 <90%尺寸(不含电缆) 100mm x 53mm x 27mm 重量(不含电缆)70g 电磁兼容 EN 55022, EN 5502 。 J-Link连接线 2.2.5 SD卡 SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。SD记忆卡虽然体积小质量轻,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。SD卡控制器主要实现两大功能,一是产生控制时序,复位、初始化以及设置SD卡;二是从SD卡中读出或写入数据。当处理器对初始化使能寄存器IER写使能操作时,主控模块启动SDlnit(复位/初始化模块),由SDlnit完成SD卡的初始化工作;当处理器将命令和地址分别写入命令控制寄存器CCR和地址偏移寄存器AOR时,主控模块启动SDcmd(命令控制)模块并将命令和地址传递给后者,由SDcmd模块完成与命令相应的操作。初始化模块SDlnit的作用是完成SD卡的初始化工作。当总线接口模块使能SDlnit后,SDinit通过SPITrans模块向SD卡发送复位命令(CMD40),然后等待复位命令的回执。如果复位成功(返回值为Ox01),则继续向SD卡发送初始化命令(CMD41),然后等待初始化命令的回执并将执行结果返回给主控模块以便通知处理器。对SD卡进行读写或其他操作前应首先将其初始化。命令控制模块SDCmd的作用是完成SD卡命令、参数、命令校验值的发送和命令回执的读取(如果是读写操作,还要进行数据的发送和接收)。主控模块使能SDCmd前会将SD命令、参数传递给后者。这样SDCmd使能后,首先将得到的命令、参数通过主控模块发送到SD卡,然后等待命令回执。如果当前命令是读、写之外的其他命令,则将执行结果返回给主控模块即可;如果是读、写命令,则收到正确的命令回执后,还要将数据接收并存至缓存或发送到SD卡。选择器模块Mux的作用是根据当前操作从SDlnit模块和SDCmd模块的输出信号中选择一路送至SPITrans模块。双口RAM是SD控制器的缓存,用来存储要送到SD卡和从SD卡上读取的数据。 SD记忆卡的结构 SD记忆卡具有机械式写入保护开关,以免至关重要的数据意外丢失。卡两侧的导槽可防止其插反了方向,一个凹口可防止器械掉落或撞击时,卡跳出其插孔。肋条可保护金属触点,以减少静电所引起的损坏可能性,或触碰损坏,如擦伤等。 端子护板: 保护结构可防止处理和插入期间,直接去针接触。 写入保护开关 可设置滑动开关来保护数据 可设置滑动开关来保护数据 可正确插入的楔形设计 这种形状有助于用户插入正确的方向。 凹口设计:当卡受到物理冲击时,可防止卡从主设备上掉落 导槽:可保证正确地插入主设备 2.3相关硬件原理图 硬件原理图表示电路板上各器件之间连接,主要涉及了硬件接口及硬件配置以及相应的连接线,方便了解STM32开发板的内部结构及相应芯片构造。 SD卡电路原理图: SD卡一般支持2种操作模式: (1)SD卡模式; (2)SPI模式; SD卡初始化过程:   (1)初始化STM32的SPI接口 使用低速模式 2. 延时至少74clock  (2)发送CMD0,需要返回0x01,进入Idle状态  (3)循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态  (4)设置读写block大小为512byte   (5)把STM32的SPI设置为高速模式。 SD卡的复位:  (1)上电时要延时足够长的时间给SD卡一个准备过程,根据不同的卡设置不同的 延时时间,SD卡初始化第一步在发送CMD命令之前,在片选有效的情况下首先要发送至少74个时钟,否则将有可能出现SD卡不能初始化的问题。 (2)然后发送CMD0,如果返回正确(0x01),在发送CMD1,如果返回正确(0x00)则初始化成功 . (本实验SD初始化对应的部分程序) SD卡(最大支持32GB外扩) LCD液晶屏 USB 转串口 STM32电源电路由电容滤波、三端电压、电容滤波组成,其中的电容作用都是一样滤除电路中寄生的锯齿波,不同电容的容值通过的频率不一样,所以电路中使用了不同容值的电容把所有的锯齿波变为平滑的脉动波。 电源 在STM32F103系列的GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BSRR)和一个32位锁定寄存器(GPIOx_LCKR)。 GPIO口 按键电路 通过按键来选择系统的功能,完成对系统的访问控制。本实验使用了 两个按键,分别定义为上(key1)、下键(key2),上、下两个按键是对设置或访问的液晶显示对象进行选择,key1控制BMP图片顺序显示,key2控制BMP图片逆序显示,这样便实现了用按键来实现对系统的设置,按键电路的实现比较简单,具体电路实现如下: KEY1(控制本实验的图片翻页-下翻) KEY2(控制本实验的图片翻页-下翻) LED灯(本实验图片页脚为奇数时LED灯亮) 第三章 设计流程图 本实验设计流程是基于实验原理、实际的操作过程及实验现象的基础上绘制的。 第四章 硬件设计 4.1中英文显示部分设计 显示屏要显示内容设置,由于程序中有定义的中英文显示程序(如下),实验程序较多,此处只显示部分程序,为定义字符及字符串,所以 SD 卡根目录命名为“HZLIB.bin”的汉子字库文件保存到SD 卡中,STM32 芯片通过文件系统读取汉字字库文件即可获得字库的数据。 4.2 BMP图片部分设计 BMP图片格式BMP文件格式,又称为位图(Bitmap)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。它是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP 文件所占用的空间很大。而且JPEG 是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。图像的扫描方式是按从左到右、从下到上的顺序。 BMP文件保存了一幅图像中所有的像素。BMP格式可以保存单色位图、16色或256色索引模式像素图、24位真彩色图象,每种模式中单一像素点的大小分别为1/8字节,1/2字节,1字节和32字节。目前最常见的是256位色BMP和24位色BMP。Windows所使用的BMP文件,在开始处有一个文件头,大小为54字节。保存了包括文件格式标识、颜色数、图像大小、压缩方式等信息,由于本实验我们仅讨论24位色不压缩的BMP,所以文件头中的信息基本上不需要注意,只有&#8220;大小&#8221;这一项比较有用。本实验使用240x320像素bmp的图片,对应图片格式形式如下: 240*320像素BMP图片格式设置 BMP格式图片对应程序设置(仅取部分程序) 4.3 SD卡读取的内容 由于本实验的LCD显示的相关内容是从SD卡读取的,所以这里需将程序目录里的“需放置SD卡文件”用读卡器读进SD卡,再将SD卡插入STM32开发板的卡槽内,待程序加载后仿真时相应程序直接调用汉子字库及BMP格式图片。SD卡读取的内容包括以下部分: 第五章 软件设计 5.1主函数部分程序设计 #include "stm32f10x.h" //库函数 #include "bsp_lcd.h" #include "bsp_bmp.h" #include "bsp_led.h" #include "bsp_key.h" void Delay(__IO uint32_t nCount) //简单的延时函数 { for(; nCount != 0; nCount--); //当自变量不等于0时,自变量依次递减 } int i=0; //初始值i=0 int main ( void ) { Sd_fs_init(); //初始化SDIO LCD_Init (); //LCD 初始化 Key_GPIO_Config(); //key配置 LED_GPIO_Config(); //LED配置 ILI9341_DispString_EN_CH ( 20, 5, "lcd ¸高利 石燕 张冰", macBACKGROUND, macRED ); //在第20行,第五列显示lcd,高利,石燕,张冰,背景为黑色,字体为红色 Delay(0xAFFFFF); ILI9341_DispString_CH ( 50, 50, "上海第二工业大学", macBACKGROUND, macRED ); Delay(0xAFFFFF); //在第50行,第50列显示上海第二工业大学,背景为黑色,字体为红色 ILI9341_DispString_EN_CH ( 30, 90, 欢迎您--", macBACKGROUND, macRED );Delay(0xAFFFFF);//在第30行,第90列显示欢迎您—背景为黑色,字体为红色 ILI9341_DispString_EN( 40, 120, "begin", macBACKGROUND, macGREEN );Delay(0xAFFFFF); //在第40行,第120列显示begin 背景为黑色,字体为绿色 while(1){ LED1( ON ); //LED灯亮 if( Key_Scan(macKEY1_GPIO_PORT,macKEY1_GPIO_PIN) == KEY_ON ){ i++; if(i>13) i=13; } //按key1键,图片按顺序显示下一 张图片,直到i=13 if( Key_Scan(macKEY2_GPIO_PORT,macKEY2_GPIO_PIN) == KEY_ON ){ i--; if(i<0) i=0;} ////按key2键,图片按顺序显示上一张图片,直到i=0 switch(i) // 用于多分支选择的switch语句 switch(表达式){       case 常量表达式1:  语句1;      case 常量表达式2:  语句2;      case 常量表达式n:  语句n;      default:  语句n+1;} { case0: Lcd_show_bmp(0,0,"/wildfire_1.bmp"); break; //显示wildfire_1.bmp图片 case 1: Lcd_show_bmp(0, 0,"/logo1_1.bmp");break; //显示logo1_1.bmp图片 case 2: LED1( OFF );Lcd_show_bmp( 0,0,"/pic1_1.bmp");break;//灯灭,显示pic1_1.bmp图片 case3: LED1( ON ); Lcd_show_bmp( 0,0,"/pic2_1.bmp");break;//灯亮,显示pic2_1.bmp图片 case 4: LED1( OFF );Lcd_show_bmp( 0,0,"/pic3_1.bmp");break;//灯灭,显示pic3_1.bmp 图片 case5: LED1( ON ); Lcd_show_bmp( 0,0,"/pic4_1.bmp");break; //灯亮,显示 pic4_1.bmp图片 case 6: LED1( OFF );Lcd_show_bmp( 0,0,"/pic5_1.bmp");break;//灯灭,显示pic5_1.bmp图片 case7: LED1( ON ); Lcd_show_bmp( 0,0,"/pic6_1.bmp");break;//灯亮,显示pic6_1.bmp图片 case8: LED1( OFF );Lcd_show_bmp( 0,0,"/pic7_1.bmp");break;//灯灭,显示pic7_1.bmp图片 case 9: LED1( ON ); Lcd_show_bmp( 0,0,"/pic8_1.bmp");break;//灯亮,显示pic6_1.bmp图片 case10: LED1( OFF );Lcd_show_bmp( 0,0,"/pic9_1.bmp");break;//灯灭,显示pic9_1.bmp图片 case11: LED1( ON ); Lcd_show_bmp( 0,0,"/pic10_1.bmp");break;//灯亮,显示pic10_1.bmp图片 case 12: LED1( OFF ); Lcd_show_bmp( 0,0,"/pic11_1.bmp");break; default:;//灯灭,显示pic10_1.bmp图片 } } } /* ------------------------------------------end of file---------------------------------------- */ 主程序这里用到了switch语句,以达到按键key1和key2控制BMP图片页数上翻下翻的目的,switch语句后面圆括号中表达式的值,然后用此值依次与各个case语句的表达式比较,即执行其后的语句,然后不断进行判断,继续执行后面所有的case后的语句。若圆括号中表达式都不等,则执行default后面的语句,然后退出switch语句,程序流程转向开关语句的下一个语句。 在实验操作的过程中,由于要按下按键,每按一次由上面程序可以看出i会对应不同的数,从而会对应switch(i)中不同的情况,从而对应不同的BMP图片,由i的不同控制本实验图片的切换。下面是不同的BMP图片在i变化时对应出现的情况: 5.2按键程序设计 这里由于USER文件里没有bsp_key.c,为了能使按键被调用,需要重建路径,在USER文件里加入bsp_key.c文件,以达到兼容的目的,当USER中出现bsp_key.c时,重新加载后便可正常使用按键,这里由于设计需要KEY1和KEY2两个键,则需对相关程序进行修改。 注:源程序key.c中只有key1键发挥作用,这里由于实验设计需要,进行了相应的程序修改、添加,使得key1和key2都可以在程序下载后发挥作用,从而控制实验现象。 USER/bsp_key.c路径创建过程如下: USER文件下加入bsp_key.c后,按键程序才可以真正意义上被调用,程序加载后,按键才可以发挥作用,否则对应库函数无法被调用。 Key 路径的生成bep_key.c正常加入后USER文件下显示 由于本实验在设计是用到了LED灯及蜂鸣器,由于USER文件下无相应文件,均按照此处路径创建添加,以实现相应的功能,最终添加完成的USER文件下显示 由于本实验要用到key1和key2两个键,以控制图片的切换,则需对原有程序进行相应的修改,这里对应更改后的key.c程序如下: #include "bsp_key.h" /// 不精确的延时 static void Key_Delay(__IO u32 nCount) { for(; nCount != 0; nCount--); } /** * @brief 配置按键用到的I/O口 * @param 无 * @retval无 */ void Key_GPIO_Config(void) //按键配置 { GPIO_InitTypeDef GPIO_InitStructure; /*开启按键端口(PA)的时钟 */ RCC_APB2PeriphClockCmd(macKEY1_GPIO_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin = macKEY1_GPIO_PIN; // IO 口做输入口时,不用设置输出频率 //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(macKEY1_GPIO_PORT, &GPIO_InitStructure); } /* * 函数名:key _Scan * 描述:检测是否有按键按下 * 输入: GPIOx:x可以使A,B,C,D或者E * GPIO_Pin:待读取的端口位 * 输出:KEY_OFF(没按下按键)、KEY_ON(按下按键) */ uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) { /*检测是否有按键按下 */ if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { /*等待按键释放 */ while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; } /*********************************************END OF FILE**********************/ 使用KEY1和KEY2键的程序 #ifndef __KEY_H #define __KEY_H #include "stm32f10x.h" #define KEYI_PA0 #define macKEY1_GPIO_CLK RCC_APB2Periph_GPIOA #define macKEY1_GPIO_PORT GPIOA #define macKEY1_GPIO_PIN GPIO_Pin_0 #define KEY2_PC13 #define macKEY2_GPIO_CLK RCC_APB2Periph_GPIOC #define macKEY2_GPIO_PORT GPIOC #define macKEY2_GPIO_PIN
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服