关键词:
前言
从51到STM32F4学习这么久了,总算找到点头绪了,目前学习了GPIO,中断,定时器,看门狗的基本使用,所以想试着看看能不能做个什么东西,就是想复习一下最近学习的知识。正好上学期单片机课程设计做过一个可以蓝牙、按键校准、带温度显示的时钟,所以我想看能不能将程序移植到STM32上呢?说做就做,经过三天的时间,几次的程序修改和调试,终于成功了!
由于STM32内部定时器的精度还是很高的(一小时慢1s),所以就没有使用DS1302时钟芯片(关键是手里没有),显示上和课程设计做的有些不一样,没有增加日期和星期显示,就时间、闹钟和温度的显示。
1602液晶介绍
工业字符型液晶,能够同时显示16x02即32个字符。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
可见用STM32的3.3v电平驱动显示完全没问题,看到这我就放心了,代码经过多次的修改后,终于成功显示了,所以还是要多看看数据手册。
硬件电路连接
程序设计
1.控制线宏定义,通过位带操作,以后就可以像51那样RS=1来操作了,是不是很熟悉呢?这里还将数据线的8个端口定义为了一个LCD_DB
#define LCD_RS PAout(1)
#define LCD_RW PAout(4)
#define LCD_EN PAout(6)
#define LCD_DB GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15
2.LCD相连的GPIO配置,将数据线端口配置为OD(开漏)输出模式,可以做双向IO使用,在检测LCD是否忙时,需要读取D7位的状态
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef IO_Init;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE,ENABLE);
/*控制线初始化 : */
IO_Init.GPIO_Mode=GPIO_Mode_OUT; //输出
IO_Init.GPIO_OType=GPIO_OType_PP; //推挽模式
IO_Init.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_6;
IO_Init.GPIO_PuPd=GPIO_PuPd_UP; //
IO_Init.GPIO_Speed=GPIO_Speed_2MHz; //GPIO_Speed_2MHz
GPIO_Init(GPIOA,&IO_Init);
/*数据线初始化*/
IO_Init.GPIO_Mode=GPIO_Mode_OUT;
IO_Init.GPIO_OType=GPIO_OType_OD; //开漏输出可双向
IO_Init.GPIO_Pin=LCD_DB;
IO_Init.GPIO_PuPd=GPIO_PuPd_UP; //上拉
IO_Init.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOE,&IO_Init);
/*测试 : 高电平3.3v
LCD_RS=1;
LCD_RW=1;
LCD_EN=1;
GPIO_SetBits(GPIOE,LCD_DB); */
}
3.实现P1=0xff功能的函数,带参数
void GPIO_OutData(u8 Dat)
{
u16 tmp;
tmp = 0;
tmp =Dat;
tmp <<= 8; //数据左移到高8位
GPIO_Write(GPIOE,tmp); //数据写入到GPIOE高8位
}
4.检测LCD是否忙
void LCD_CheckBusy(void)
{
u8 sta;
GPIO_OutData(0xff);
LCD_RS=0;
LCD_RW=1;
do{
LCD_EN=1;
delay_ms(5);
sta = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_15);
LCD_EN =0;
}while(sta & 0x80);
}
5.向LCD写一字节数据
/* LCD_RS = 1, LCD_RW = 0 */
void LCD_WriteData(u8 Dat)
{
LCD_CheckBusy(); //忙则等待
LCD_RS=1;
LCD_RW=0;
GPIO_OutData(Dat);
LCD_EN=1;
delay_ms(1);
LCD_EN = 0;
}
6.向LCD写一字节命令
/*LCD_RS = 0, LCD_RW = 0*/
void LCD_WriteCmd(u8 Cmd)
{
LCD_CheckBusy(); //忙则等待
LCD_RS = 0;
LCD_RW = 0;
GPIO_OutData(Cmd);
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
7.LCD初始化
void LCD_Init(void)
{
LCD_WriteCmd(0x38);
LCD_WriteCmd(0x0C);
LCD_WriteCmd(0x06); /*显示光标移动设置*/ delay_ms(1);
LCD_WriteCmd(0x01); /*显示清屏*/
}
8.LCD清屏
void LCD_ClearScrren(void)
{
LCD_WriteCmd(0x01);
}
9.根据xy坐标,写入对应的数据位置
void LCD_SetCursor(u8 x, u8 y)
{
u8 addr;
if (y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
LCD_WriteCmd(addr | 0x80);
}
10.根据xy坐标显示一个字符
void LCD_DisChar(u8 x,u8 y,u8 ch)
{
LCD_SetCursor(x,y); //字符显示位置设定
LCD_WriteData(ch);
}
11.显示两位的数字
void LCD_DisNumber(u8 x,u8 y,u8 Num)
{
LCD_SetCursor(x,y);
LCD_WriteData(0x30+Num/10);
LCD_SetCursor(x+1,y);
LCD_WriteData(0x30+Num%10);
}
12.显示字符串
void LCD_DisString(u8 x,u8 y,u8 *str)
{
LCD_SetCursor(x, y);
while(*str != '\0')
{
LCD_WriteData(*str++);
}
}
主函数
int main(void)
{
delay_init(168);
LED_Init();
LCD_GPIO_Config();
LCD_Init();
LCD_ClearScrren();
while(1)
{
delay_ms(500);
LED1_ON;
LCD_DisString(0,0,"abcdefghijklmnop");
delay_ms(500);
LED1_OFF;
LCD_DisNumber(0,1,56);
LCD_DisChar(2,1,'a');
LCD_DisString(3,1," Hello World!");
}
}
实际显示效果:
显示非常完美,和51驱动没有什么区别
总结:
参考资料:
欢迎查看我以前的单片机学习笔记:
51单片机1602液晶显示的ds1302实时时钟+proteus仿真(代码片段)
51单片机1602液晶显示的DS1302实时时钟+Proteus仿真Proteus仿真实例代码/*********************************/#include<reg52.h>#include<intrins.h>#include<string.h&g 查看详情
资料分享基于stm32无线蓝牙大棚温湿度监测控制系统设计基于stm32无线远距离红外通信系统设计
基于STM32无线蓝牙大棚温湿度监测控制系统设计前言:随着科技的发展,农业科技也一步步走进我们的生活。蔬菜大棚的增多,人们对其性能要求也越来越高。特别是要提高其生产效率,对大棚的自动化程度要求... 查看详情
labview控制arduino驱动1602液晶显示屏(基础篇—10)
...LIAT中的LCD显示函数库,通过LabVIEW软件获取电脑上的时钟并传输给ArduinoUno控制板, 查看详情
lcd1602相关资料简述
LCD1602液晶显示屏因为想用STM32做一个万年历,所以在此之前先去了解了一下LCD1602的一些基础操作用法,在此简单介绍一下,都是制作万年历所需要用到的基础硬件资料。它是字符型液晶,能够同时显示16x02即32个字符,一般分为1... 查看详情
基于stm32的智能蓝牙温控风扇控制系统设计-毕设课设
1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式;2.设置有4个按键,按键1可以设置自动和手动2种模式切换;按键2为温度上下限的设置键;按键3为设置状态下的加一键,手动模... 查看详情
51单片机实现smc1602液晶屏显示实例
...思是每行显示16个字符,一共可以显示两行。如果是12232液晶(图形型液晶)则表示由122列32行组成,即共有122*32个点p.s.注意 查看详情
如何用stm32驱动诺基亚5110显示屏?
...模块,国内厂家也生产有类似的兼容产品。该产品除应用于移动电话外,也可广泛应用于各类便携式设备的显示系统。单片机控制显示,人机交互界面显示,数据采集显示等电子设计场合。Nokia5110手机规格参数工... 查看详情
基于stm32的多功能时钟1——时钟显示
...! 接着上一章多功能时钟(绪论)的内容,在这一章中,我将介绍多功能时钟的时钟显示部分。话不多说,我们正式开始吧~ 多功能时钟,时钟显示功能是... 查看详情
1602液晶显示
液晶有1,2端为电源。15、16为背光源。为防止直接加5V电压烧坏背光灯,在15脚串接一个10欧的电阻用于限流。液晶3端为液晶对照度调节端。通过一个10k欧电位器接地来调节液晶显示的对照度。液晶的4端为液晶控制器写数据/读数... 查看详情
5♥☆基于stm32的智能手环√★☆(代码片段)
...体设计思路2.5、各功能模块程序实现原理分析2.5.1、LCD1602液晶显示模块电路设计 查看详情
5♥☆基于stm32的智能手环√★☆(代码片段)
...体设计思路2.5、各功能模块程序实现原理分析2.5.1、LCD1602液晶显示模块电路设计 查看详情
stm32tf卡延长距离
参考技术A50-100米。stm324g模块没有专用PA和LNA芯片,所以传输距离只能在50-100米。通过ToF激光测距传感器检测距离,并将距离的值实时显示在LCD1602液晶显示屏上。 查看详情
(stm32学习总结)—lcd—液晶显示
...到屏幕上再反射到人眼的显示工具。常见的有CRT显示器、液晶显示器、LED点阵显示器及OLED显示器本章讲解的内容涉及对FSMC的控制,若您不了解FSMC外设,可以先学习前面的《FSMC—扩展外部SRAM》章节。液晶显示器液晶显示器,... 查看详情
esp3212.i2clcd1602液晶显示实验(liquidcrystal_i2c库)
上一篇:【ESP32】11.雨滴探测实验(ADC)前言:先放电路连接图:很多同学之前应该接触过LCD1602模块,不过这里为了减少占用IO,使用了具有IIC总线的LCD1602模块。 IIC总线之前的文章也有介绍:【ESP32】10.PCF8591数模转换器实验... 查看详情
esp3212.i2clcd1602液晶显示实验(liquidcrystal_i2c库)
上一篇:【ESP32】11.雨滴探测实验(ADC)前言:先放电路连接图:很多同学之前应该接触过LCD1602模块,不过这里为了减少占用IO,使用了具有IIC总线的LCD1602模块。 IIC总线之前的文章也有介绍:【ESP32】10.PCF8591数模转换器实验... 查看详情
stm32改用内部时钟缺点
...用外部时钟源来保证其稳定的运行。但是,在一些特殊的应用场景下,可以考虑将STM32改用内部时钟,以简化设计和降低成本。那么,将STM32改用内部时钟的缺点有以下几个方面:1.稳定性较差:内部时钟受到温度、电压等因素的... 查看详情
esp32+时钟、闹钟、温度+micropython程序(2020-10-09)
参考技术A【硬件】:ESP32芯片、DS3231时钟芯片、五方向按键(带set和rst按键)、有源蜂鸣器、LCD1602液晶屏(带PCF8574芯片,注意不是背光可调多种颜色的那种RGB1602)【软件】:microPython1、开始自动检测WIFI,检测到之后,自动从... 查看详情
单片机课程设计——《基于at89s52单片机和ds1302时钟芯片的电子时钟(可蓝牙校准)》
...2液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期、时间的校准。具有走时精确,功耗低,显示直观,调整简单方便等优点。功能描述基本显示:第一行为日期,依次为:年-月-日-... 查看详情