STM32单片机应用与全案例实践(第2版)课件 第14章 液晶显示在STM32中的应用-基于固件库_第1页
STM32单片机应用与全案例实践(第2版)课件 第14章 液晶显示在STM32中的应用-基于固件库_第2页
STM32单片机应用与全案例实践(第2版)课件 第14章 液晶显示在STM32中的应用-基于固件库_第3页
STM32单片机应用与全案例实践(第2版)课件 第14章 液晶显示在STM32中的应用-基于固件库_第4页
STM32单片机应用与全案例实践(第2版)课件 第14章 液晶显示在STM32中的应用-基于固件库_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第14章液晶显示在STM32中的应用——基于固件库学习内容提要1STM32与液晶模块12864的接口实现——延时法2STM32与液晶模块12864的接口实现——查询状态法3基于液晶模块12864的菜单程序4矩阵键盘的接口实现重点——STM32与液晶模块的接口矩阵键盘的接口难点——液晶模块的多样化应用(菜单、图形显示)小贴士——字模提取软件

按键去抖动人机界面——按键输入与液晶显示关于人机界面1人机界面又称“人机接口”、“用户界面或使用者界面”HMI——Human-machine

Interface单片机应用系统中用于输入和输出的功能模块输入——最常用的是按键、鼠标输出——最常用的是发光二极管、数码管、液晶显示

声音提示(如蜂鸣器)

2凡参与人机信息交流的领域都存在着人机界面。现在大量运用在工业与商业上。好的人机接口会帮助使用者更简单、更正确、更迅速的操作设备,也能使设备发挥最大的效能并延长使用寿命好的人机界面可以大大改善“用户体验”,提高产品竞争力。同样的硬件,可以创意无限!STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的两种接口方法1延时法——就是按照时序要求通过延时函数实现各种时序关系,也就是通过延时以等待“忙”状态结束优点:简单缺点:在时序要求较高的场合,有可能会出现意外、失常

2查询状态法——通常情况下,功能模块大多会提供一个“忙”状态信号或引脚,可以随时获取该模块的当前状态如果是“忙”状态,则不能对它进行写入操作,否则,可以进行写操作对12864液晶模块而言,可通过查询状态字的忙状态位的方式以获取“忙”状态信号液晶模块跟其他功能模块一样,接口设计中最重要的是时序配合、读出写入时的应答处理。STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的硬件接口1HP12864F模块——带汉字字库(有些模块是不带汉字库的)该模块的控制器为ST7920,因此指令系统与ST7920系列完全一致该模块的电源电压范围较宽:3.0—7.0V,信号电压为:2.7-5.5V可以适用于5V单片机系统和3.3V单片机系统自带亮度调节电位器设计,可以自行焊接一个10K的小型电位器。只有通过它调整至合适的对比度,才能正常显示该模块的引脚与大多数12864模块的引脚完全兼容2与STM32的硬件接口——有并行接口方式和串行接口方式在串行接口方式中,4、5、6三脚的功能定义有所变化,分别是:①4脚:片选信号;②5脚:串行数据;③6脚:串行时钟本例使用的是串行接口方式模块4脚与STM32单片机的GPIOB的PB8相连;模块5脚与STM32单片机的GPIOB的PB9相连;模块6脚与STM32单片机的GPIOB的PB10相连。模块的PSB脚在模块上直接焊接为低电平端(串行方式)模块的RST脚可以不接液晶模块的电源和背光使用+5V电源STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识128641对12864的操作————读忙状态(同时读出指针地址内容),初始化之后每次对12864的读写均要进行忙检测——写命令:所有的命令可以查看指令表。写地址也是写指令——写数据:操作对象有DDRAM、CGRAM、GDRAM——读数据:操作对象也是DDRAM、CGRAM、GDRAM2DDRAM、CGRAM、GDRAM——DDRAM:(DataDisplayRam),数据显示RAM,往里面写啥,屏幕就会显示啥。CGRAM:(CharacterGenerationRAM),12864内部提供了64×2B的CGRAM,允许用户自定义4个16×16字符,每个字符占用32个字节GDRAM:(GraphicDisplayRAM):图形显示RAM,这一块区域用于绘图,往里面写啥,屏幕就会显示啥,它与DDRAM的区别在于,往DDRAM中写的数据是字符的编码,字符的显示先是在CGROM中找到字模,然后映射到屏幕上,而往GDRAM中写的数据时图形的点阵信息,每个点用1bit来保存其显示与否STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识128643DDRAM——12864内部有4行×32字节的DDRAM空间但是某一时刻,屏幕只能显示2行×32字节的空间那么剩余的这些空间干啥用呢?它们可以用于缓存,在实现卷屏显示——提高刷新频率4DDRAM结构——80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FHA0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFHB0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH想想,这是为什么?黄色部分对应上半屏显示白色部分对应下半屏显示对应一屏显示第一行:80H、81H、82H、83H、84H、85H、86H、87H第二行:90H、91H、92H、93H、94H、95H、96H、97H第三行:88H、89H、8AH、8BH、8CH、8DH、8EH、8FH第四行:98H、99H、9AH、9BH、9CH、9DH、9EH、9FHSTM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识128645DDRAM中字符与汉字显示与地址的对应关系——关于DDRAM的三点注意————每次对DDRAM的操作单位是一个字,也就是2个字节,当往DDRAM写入数据时,首先写地址,然后连续送入2个字节的数据,先送高字节数据,再送低字节数据。读数据时也是如此,先写地址,然后读出高字节数据,再读出低字节数据(读数据时注意先假读一次)——显示ASCII码半宽字符时,往每个地址送入2个字节的ASCII编码,对应屏幕上的位置就会显示2个半宽字符,左边的为高字节字符,右边的为低字节字符——显示汉字时,汉字编码的2个字节必须存储在同一地址空间中,不能分开放在2个地址存放,否则显示的就不是你想要的字符。每个字中的2个字节自动结合查找字模并显示字符CDRAM用于图形显示,那么点和地址的关系又是如何,请认真自学吧!STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识12864612864模块串行读写的时序——一开始先传输启始字节,启始字节前五位为“同步位”字符串(五个连续的“1”),此时传输计数将被重置并且串行传输将被同步,再跟随的两个位字符串(第六、第七位)分别指定传输方向位(RW)及寄存器选择位(RS),最后第八位则为“0”。在接收到包含同步位及RW和RS信息的启始字节后,每一个八位的指令(数据)将被分为两个字节发送接收:高4位(DB7—DB4)的数据将会被放在第一个字节的LSB部分,而低4位(DB3—DB0)的数据会被放在第二个字节的LSB部分,其余的四位则以“0”填充STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识12864712864的核心是一个字节的写入和读出——下面是写入一个字节的函数,注意其时序延时方式实现时序配合voidSend_Byte(u8bbyte)//写入1字节(数据或命令)函数{u8i,t;for(i=0;i<8;i++) //一个字节8位{ if((bbyte)&0x80)//取出最高位 SID_H;//当前位为1,此处为宏语句,具体看教材的程序

else SID_L; //当前位为0,同上说明 SCLK_H; //时钟上升沿写入 t=0x10;//t的值要根据系统的时钟调整至合适的值 while(t--);//延时等待写入完成(时序需要)

SCLK_L; //时钟信号回到低电平,为下次跳变做准备 bbyte<<=1;//左移1位,取出要写入的下一位

}}STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识12864812864的写指令或数据接口函数——按照6的时序要求,写出写入指令或数据的接口函数如下voidWrite_Char(u8start,u8ddata)//写命令或数据函数{u8start_data,Hdata,Ldata;if(start==0) //参数start=0,则表示ddata为指令,否则为数据start_data=0xf8;//写指令,11111000——00写入命令

elsestart_data=0xfa;//写数据,11111010——01写入数据Hdata=ddata&0xf0;//取高四位。高低四位均作为一个字节的低4位Ldata=(ddata<<4)&0xf0;//取低四位。高低四位分两次发送Send_Byte(start_data);//发送起始信号Delaynms(10); //适当延时,延时时间1以上即可Send_Byte(Hdata);//发送高四位Delaynms(5);Send_Byte(Ldata);//发送低四位Delaynms(5);}回忆一下,在6中,5个1后是写入读出位、寄存器选择位STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——初识12864912864的指令系统——下面以基本指令为例说明(扩展指令请自己查资料学习)——清屏指令(0x01):DDRAM写满0x20,指针地址写0x00。屏幕显示空白(即清屏)——回车指令(0x02/0x03):地址指针内容写0x00——进入模式:000001I/DS:设置读写数据之后光标、显示移位的方向内部有2个可编程位,I/D表示读写一个字符后数据指针是加一还是减一。I/D=1指针加一,I/D=0指针减一。S=1开启整屏移动——显示、光标、闪烁开关:0000001DCB:D=1:显示开(Display)

C=1:光标开(Cursor)

B=1:光标位置闪烁开(Blink),B=0则为关闪烁——光标显示移位控制:0001S/CR/LXX——功能设置:001DLX

RE

XX切换基本指令集与扩展指令集。DL=1表示8位接口,DL=0表示4位接口RE=1表示开启扩展指令,RE=0表示使用基本指令开启基本指令则设置为0x30,开启扩展指令则设置为0x34STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析1范例程序框架——由于没有读取12864状态,所以只有写操作整个程序需要涉及调整的文件只有两个——main.c包含了液晶模块的基本接口函数和延时函数(粗略延时,不够精准,可根据需要调整为精准以us为单位的延时函数)——stm32f10x_conf.h设置本例涉及到的STM32的外设模块的头文件。即必须使用以下两个外设头文件#include"stm32f10x_gpio.h" //使用GPIO头文件(PB端口被使用)#include"stm32f10x_rcc.h" //使用RCC头文件(系统时钟初始化函数)串行接口使用GPIOB的PB8、PB9、PB10——PB8 ——

CS 片选——PB9 ——

SID 串行数据——PB10——

SCLK 时钟(上升沿有效)STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析2相关引脚及其操作的宏语句——主要是与液晶模块串行接口的三个引脚,采用宏定义,简便#defineDAT_128 GPIO_Pin_9 //数据引脚#defineSID_HGPIO_SetBits(GPIOB,DAT_128)//输出高电平

#defineSID_LGPIO_ResetBits(GPIOB,DAT_128)//输出低电平#defineCS_128 GPIO_Pin_8 //片选引脚

#defineCS_H GPIO_SetBits(GPIOB,CS_128)//设置高电平

#defineCS_L GPIO_ResetBits(GPIOB,CS_128)//设置低电平#defineSCLK_128GPIO_Pin_10//时钟引脚#defineSCLK_HGPIO_SetBits(GPIOB,SCLK_128)//设置高电平#defineSCLK_LGPIO_ResetBits(GPIOB,SCLK_128)//设置低电平使用宏语句是一种形象直观、简便的好方法,学会它!STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析312864的初始化——复位、显示方式、清屏、有关计数器归零等voidLcd_Init(void){Delaynms(50);//等LCM讲入工作状态(必须,否则初始化无效)

CS_H;//按照时序要求,必须高电平才能选中液晶模块Write_Char(0,0x30);//8位介面,基本指令集

Write_Char(0,0x0c);//显示打开,光标关,反白关

Write_Char(0,0x01);//清屏

Write_Char(0,0x02);//清屏,将DDRAM的地址计数器归零

Write_Char(0,0x80);//清屏,将DDRAM的地址计数器归零

Delaynms(50);}对STM32对液晶等外围模块进行初始化以前,必须确保这些模块已完成复位,否则,初始化无效或无法初始化。这一点要重视!这些参数代表啥命令,请自行查阅资料消化STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析412864的文字显示坐标设置——设置文字显示时的坐标//功能描述:设置LCD显示的起始位置,X为行,Y为列//参数:X行(0~4),Y列(0~16)voidLCD_Set_XY(u8X,u8Y){u8address;switch(X){ case0:address=0x80+Y;break; case1:address=0x90+Y;break; case2:address=0x88+Y;break; case3:address=0x98+Y;break; default:address=0x80+Y;break;}Write_Char(0,address); //写命令函数(第一个参数0代表写命令)}这些参数代表啥命令,还记得吗?STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析512864的文字显示——在指定行列显示文字//功能描述:中英文字符串显示函数//参数:X为列坐标,Y为行坐标//用内码表示的汉字、ASCII码表示的字符组成的数组(字符串)voidLCD_Write_String(u8X,u8Y,uc8*s){LCD_Set_XY(X,Y);while(*s) //取出显示的ASCII码或汉字内码{ Write_Char(1,*s);//写数据,显示该字符

s++; Delaynms(1);}}STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析612864的图形显示——在指定坐标显示一个点(pixel)、图形voidDisplay_Img(u8const*img){u8i,j;for(j=0;j<32;j++)//32行for(i=0;i<8;i++)//8块(64列){Write_Char(comm,0x34);//扩展

Write_Char(comm,y+j);Write_Char(comm,x1+i);Write_Char(comm,0x30);//基本Write_Char(dat,img[j*16+i*2]);Write_Char(dat,img[j*16+i*2+1]);}for(j=32;j<64;j++)//另32行for(i=0;i<8;i++)//另8块(64列){Write_Char(comm,0x34);Write_Char(comm,y+j-32);Write_Char(comm,x2+i);Write_Char(comm,0x30);Write_Char(dat,img[j*16+i*2]);Write_Char(dat,img[j*16+i*2+1]);}Delaynms(10);Write_Char(comm,0x36); //打开图形指令}如何理解上述程序————扩展指令、基本指令——图形方式下的坐标与数据写入STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析712864的图形显示的几点说明——在指定坐标显示一个点(pixel)、图形要使用绘图功能需要开启扩展指令。然后写地址,再读写数据先开启扩展指令集(0x36\0x34),然后写入地址,这里的地址与DDRAM中的略有不同,GDRAM中的地址有2个,分别是列地址/水平地址X和行地址/垂直地址Y然后回复到基本指令状态(不是必须的),再连续写入2个字节的图形数据设定绘图RAM(GDRAM)地址到地址计数器(AC)垂直地址范围AC5...AC0(80H-BFH,共64行)水平地址范围AC3...AC0(80H-8FH,共16块)水平地址16块,每块又分成8列,所以共8列×16=128列操作的时候,先输入垂直地址,再输入水平块地址,然后再输入水平数据,可连续输入两个字节再看前面的程序,能懂了吗?STM32与液晶模块12864的接口实现——延时法STM32与液晶模块12864的软件接口——范例程序分析8程序运行效果演示——文字和图形右侧图片数据来自网络,可自行选取BMP图片以显示不同的图形STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法1状态法原理——12864液晶模块对外提供状态信号,可以通过读取状态字来获得液晶模块的当前状态,其中最主要的是“忙”状态信息。通过查询“忙”状态信息,然后再对液晶模块进行写入操作,可以确保万无一失。因此,这种实现方法往往被推荐使用2模块化设计——本例还特别考虑了延时的精确性问题为了解决延时的精确性,使用STM32内部的SysTick的普通计数模式对延迟进行管理。这样,一方面确保了在接口函数中为保证时序配合的精准性而使用延时的需要;另一方面,绝大多数项目中,通常也需要使用延时功能。因此,增加延时函数是合理的为了增加程序的可维护性,本节的接口程序还采用了模块化方式,将延时、液晶模块接口、主函数等分文件实现模块化是程序设计的主流方向STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法3硬件连接——同“延时法”例子程序中有详细注释,能方便看出硬件连接关系STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法4程序框架——带框部分为需要调整或修改的文件主文件SysTick延时函数头文件液晶模块接口函数头文件STM32外设头文件配置头文件SysTick延时函数源文件液晶模块接口函数源文件STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法5程序代码——状态检查重点讨论状态检查、STM32系统时钟初始化其他程序的分析,请自行阅读程序中的注释//功能:LCD忙检查voidCheck_Busy(void){doSend_Byte(0xfc);//11111,RW(1),RS(0),0while(0x80&Receive_Byte());}voidWrite_LCD_Command(u8cmdcode){CS_H;Check_Busy();Send_Byte(0xf8);Send_Byte(cmdcode&0xf0);//高4位Send_Byte((cmdcode<<4)&0xf0);//低4位delay_ms(2);CS_L;}检查状态函数在写命令函数中的应用读状态寄存器命令——0xfcReceive_Byte()从液晶模块读1字节函数函数值为1字节,最高位为1,说明状态为忙STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法6-1程序代码——STM32系统时钟初始化不使用固件库默认时钟(72M),而使系统时钟可选voidStm32_Clock_Init(u8pll){ErrorStatusHSEStartUpStatus;//将外设RCC寄存器重设为缺省值RCC_DeInit();RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON——外部高速晶振HSE晶振打开(ON)HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE起振if(HSEStartUpStatus==SUCCESS)//SUCCESS:HSE晶振稳定且就绪

{RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1即AHB时钟HCLK=系统时钟RCC_PCLK2Config(RCC_HCLK_Div1);//RCC_HCLK_Div1——PCLK2=HCLKRCC_PCLK1Config(RCC_HCLK_Div2);//RCC_HCLK_Div2,PCLK1=HCLK/2FLASH_SetLatency(FLASH_ACR_LATENCY_2);//FLASH存储器延时时钟周期数,2FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH预取指使能

//设置PLL时钟源及倍频系数RCC_PLLMul_9——PLL输入时钟x9STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法6-2程序代码——STM32系统时钟初始化(接6-1)switch(pll){case2:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);break;case3:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_3);break;case4:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_4);break;case5:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_5);break;case6:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);break;case7:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_7);break;case8:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_8);break;case9:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);break;default:RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_2);break;}RCC_PLLCmd(ENABLE);//使能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//PLL准备好否RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟为:PLLwhile(RCC_GetSYSCLKSource()!=0x08){}//0x08:PLL作为系统时钟成功}}STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法接口的算法6-3程序代码——STM32系统时钟初始化(接6-2)STM32系统时钟自由设置的关键要领选择外部晶振并启动设置AHB时钟——HCLK设置高速外设时钟——PCLK2设置低速外设时钟——PCLK1设置PLL倍频系数——要注意,不是简单乘以2、3、4、设置PLL使能选择PLL作为系统时钟——SYSCLKFLASH存取的设置可使用默认值(不设置也行)时钟设置是STM32单片机系统开发最基础、最重要的第一步,时钟不正常,系统不可能正常工作使用固件库开发STM32系统,默认情况下是使用外部晶振,时钟72M——#defineSYSCLK_FREQ_72MHz72000000,改变这个地方,也可以改变默认时终值。这个你知道吗?STM32与液晶模块12864的接口实现——状态法STM32与液晶模块12864的状态法范例的实际运行1运行效果——自定义字符演示STM32系统中基于液晶模块的菜单驱动程序菜单的基本概述1程序实现的两种方式————种是基于命令行方式,即通过输入指令驱动程序实现相应功能最大缺点是必须精确掌握指令,对操作者而言,它不是十分方便——是基于菜单方式,即通过选择不同的菜单实现程序的不同功能只要通过选择不同的菜单项,就可以实现不同的功能,因此,它便于操作,成为程序实现的主流方式掌握基于菜单(菜单驱动)的程序开发技术是十分必要2菜单的常见形式——弹出菜单、下拉菜单、图标菜单、多级菜单、浮动菜单等本例讨论的是一个在嵌入式系统中常用的光标菜单作为一个演示范例,只讨论了一级菜单形式,在此基础上,完全可以仿照着继续写出二级菜单、三级菜单,以适应各种复杂的的要求STM32系统中基于液晶模块的菜单驱动程序菜单设计要求1菜单的样式——通过一个按键控制箭头上下移动,即该建相当于上下移动光标控制键;通过另外一个按键选中当前菜单项,该建相当于回车确认键——按键1——用于实现光标移动功能(箭头上下移动)——按键2——用于实现选择确认(回车键)功能左侧箭头表示当前菜单项每个菜单项对应一个功能STM32系统中基于液晶模块的菜单驱动程序菜单设计算法1①显示菜单的初始画面(如下图)②不停捕捉按键1或按键2。——如果是按键1,则首先清屏,然后将箭头放在菜单的第二项位置的整个菜单显示出来,这样感觉是光标下移了;如果光标已经位于最后一个菜单项,则移到第一个菜单项——如果是按键2,则表示选中光标所在的菜单项,则执行对应的功能不难看出,菜单的切换其实与动画的原理十分相似STM32系统中基于液晶模块的菜单驱动程序硬件电路1——上下移动键——PA0WK_UP与引脚PA0相连,对应系统板上标号为KEY2的按键,它是高电平有效,注意GPIO的正确配置——下拉输入——回车确认键——PE4KEY0与引脚PE4相连,对应系统板上标号为KEY3的按键,它是低电平有效,注意GPIO的正确配置——上拉输入——指示灯1——PE6LED0与引脚PE6相连,对应程序中的LED2——指示灯2——PE5LED1与引脚PE5相连,对应程序中的LED1STM32系统中基于液晶模块的菜单驱动程序系统实物及运行效果1STM32系统中基于液晶模块的菜单驱动程序基于模块化的程序框架1需要新建或者修改调整的文件有:delay.c,delay.h,menuandkey.c,menuandkey.h,st12864.c,st12864.h,stm32f10x_conf.h,以及main.c等8个源程序文件。①delay.c,delay.h——2个文件:主要是延时函数的定义和说明②st12864.c,st12864.h——2个文件:主要液晶模块的接口函数的定义和说明③menuandkey.c,menuandkey.h——2个文件:主要是按键和发光二极管接口函数的定义和说明④stm32f10x_conf.h——1个文件:主要是STM32所使用的外设的头文件的配置⑤main.c——1个文件:主要是程序的主函数、系统时钟等初始化的函数其中,delay.c,delay.h,st12864.c,st12864.h与上例完全相同,所以本节不予讨论STM32系统中基于液晶模块的菜单驱动程序程序代码分析1菜单实现代码——在menuandkey.c,menuandkey.h显示菜单函数——参数:为光标所在项的序号,1表示第1项,类推voidDisplayMenu(u8cur){Display_LCD_String(0,MenuItem_0,1);//选择菜单提示switch(cur)//根据该参数在相应的菜单项前显示箭头符{case1:MenuItem_1[1]=26; //字符->的ASCII码

MenuItem_2[1]=0x20;

MenuItem_3[1]=0x20;//空格 Display_LCD_String(1,MenuItem_1,1);//显示菜单项1 Display_LCD_String(2,MenuItem_2,1);//显示菜单项2 Display_LCD_String(3,MenuItem_3,1);break;//显示菜单项3case2:MenuItem_1[1]=0x20;MenuItem_2[1]=26;MenuItem_3[1]=0x20;Display_LCD_String(1,MenuItem_1,1); Display_LCD_String(2,MenuItem_2,1);Display_LCD_String(3,MenuItem_3,1);break;case3:MenuItem_1[1]=0x20;MenuItem_2[1]=0x20;MenuItem_3[1]=26; Display_LCD_String(1,MenuItem_1,1);Display_LCD_String(2,MenuItem_2,1); Display_LCD_String(3,MenuItem_3,1);break;} }STM32系统中基于液晶模块的菜单驱动程序程序代码分析2菜单实现代码——在menuandkey.c,menuandkey.h按键扫描并处理——参数cur为当前菜单项序号(1-3)voidKeyPressed(u8cur){u8flag=0;DisplayMenu(cur);//第1次显示菜单while(1){if(flag){DisplayMenu(cur);flag=0;}//flag=1,则刷新菜单显示switch(KEY_Scan())//扫描按键{case0:flag=0;break;//没有按键case2:flag=0;ExecuteFunction(cur);break;//ENTER回车键处理case3:flag=1;//下移键处理,如果已在最后一项则卷回第一项

if(cur==3)cur=1;

elsecur++;//新的光标显示项

break;}}}此处涉及到的按键扫描程序KEY_Scan()请自行阅读教材,不再予以讨论STM32系统中矩阵键盘的接口实现什么是矩阵键盘1按键、矩阵按键及其特性一般的应用系统,通常只需要少量的按键,这时可以通过独立按键的形式实现,即一个GPIO引脚连接一个按键有的应用系统可能需要的按键较多,例如,既需要10个数字键、也需要其他多个功能按键的系统。显然,在这种情况下,如果继续采用独立按键的形式,GPIO口线会显得很紧张、不够用,这时候使用矩阵键盘,就比较合适。按键越多,矩阵键盘能节省口线的效果越明显。例如:4×4矩阵键盘可以有16按键,而只使用了4+4=8条GPIO口线2矩阵按键的工作原理矩阵键盘采用行列结构,在行列相交的地方,安排一个按键程序设计的核心是动态扫描和捕捉。具体思想是:逐行输出低电平,然后逐列判断是否低电平,如果某列为低电平,则表明该行该列对应的那个按键被按下,按键被捕捉,键码(键值,即对应是哪个键的代号)被识别根据识别的键码,执行相应的操作上述过程是一个循环过程STM32系统中矩阵键盘的接口实现什么是矩阵键盘3范例中的矩阵按键电路图STM32系统中矩阵键盘的接口实现什么是矩阵键盘4矩阵按键与STM32的连接关系行输出每次一行为低电平,列读入。连接关系见注释可知——列扫描读入#defineKEY4GPIO_ReadInputDat

温馨提示

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

评论

0/150

提交评论