网站首页 > 技术教程 正文
1、 LCD1602模块,实现功能:在LCD1602指定地方显示字符、数字、字符串、printf函数重映射。
1.1在Keil 4中点击菜单Manage->Component(或者点击下图所示菜单栏中的按钮),在弹出的对话框Groups选项中添加LCD1602组。
同时在项目文件夹下创建LCD1602文件夹,用于存放LCD1602.c和.h文件,然后再在LCD1602组中添加LCD1602.c文件,如图所示。
1.2、在LCD1602.h中申明接口函数:
void lcd_init(); //LCD1602初始化函数
void lcd_showstr(uint x, uint y, uchar * str); //在x,y位置显示字符串
void lcd_showchar(uint x, uint y, uchar ch); //在x,y位置显示字符
void lcd_shownum(uint x, uint y, int num,uint count); //在x,y位置显示无符号数字
1.3、完成上述接口函数的代码。此处需要根据LCD1602手册中的读写操作时序,编写代码完成写指令、写数据等基本操作,这些基本操作不对外开放,因此不需在.h文件中申明。.h文件中申明的函数调用这些基本操作完成初始化、显示字符字符串等功能。
1)、在.c文件中首先申明控制LCD的针脚,本例中使用端口P3的5-7针脚,对应LCD允许、读写、数据指令。代码如下:
sbit LCD_EN = P3^5; //LCD允许
sbit LCD_RW = P3^6; //LCD读写,H:读,L:写
sbit LCD_RS = P3^7; //LCD指令数据,H为数据,L为指令
2)、完成写指令基本操作(此函数不在.h中申明,外部不能调用):
void lcd_sendcmd(uchar command)
{
LCD_EN = 0; // LCD允许置0,此时不允许
LCD_RS = 0; //RS端口置0,表示即将交互的是指令
LCD_RW = 0; //RW置0,表示写入LCD
P2 = command; //设置8位并行数据,电气原理图P2连接LCDDB0-8
delay_ms(5); //延时5ms
LCD_EN = 1; //数据准备好之后使能LCD
delay_ms(5); //延时5ms
LCD_EN = 0; //LCD允许端口置0,在数据写入并延时后失能LCD。
//上述过程参照芯片厂商给出的时序图完成。
}
3)、完成写数据基本操作(此函数不在.h中申明,外部不能调用):
void lcd_senddate(uchar date)
{
LCD_EN = 0; //LCD使能,此时LCD不允许数据交互
LCD_RS = 1; //RS端口置0,表示 即将交互的为数据
LCD_RW = 0; //RW置0,表示写入LCD
P2 = date; //设置8位并行数据,电气原理图P2连接LCDDB0-8
delay_ms(5); //延时5ms
LCD_EN = 1; //数据及设置准备好之后,使能LCD进行数据交互
delay_ms(5); //延时5ms
LCD_EN = 0; //交互完成使能LCD。
//上述过程参照芯片厂商给出的时序图完成。
}
4)、完成初始化接口函数代码(此函数在.h文件中申明,外部可以调用):
void lcd_init()
{
LCD_EN = 0; //在进行数据准备工作前将LCD失能,防止程序运行发生意外。
lcd_sendcmd(0x38); //设置16*2显示,5*7点阵,8位数据接口。
lcd_sendcmd(0x0c); //设置开显示,不显示光标
lcd_sendcmd(0x06); //写入一个8位数据后,光标自动加1,或者说显示地
//址自动加1
lcd_sendcmd(0x01); //显示清0,数据指针清0
//函数中指令码请参照LCD1602数据手册。
}
5)、完成显示字符串接口函数代码(此函数在.h文件中申明,外部可以调用,其余的接口函数此处不一一列出):
void lcd_showstr(uint x, uint y, uchar * str)
{
if(y>1 || x>16)
{
//输入参数错误,此处暂时不添加代码,在serial模块完成之后,可以调
//用printf函数将错误信息输出到串口显示在电脑屏幕上。
return;
}
lcd_sendcmd(0x80+x+y*0x40);//设置数据指针起点,也就是显示的位置
while(*str != '\0')
{
lcd_senddate(*str); //发送显示的数据
str++; //字符串指针自增
}
}
6)、知识点:
a、字符串其实是由字符组成的数组;编译器会在字符串末尾添加’\0’表示字符串结束,因此上面函数中使用while(*str != '\0')来判断字符串是否结束。
b、上述lcd_showstr函数形参变量类型uint、uchar在头文件reg52.h中进行了定义,#define uchar unsigned char;#define uint unsigned int。如果没有定义,此函数中uint应该修改为unsigned int ;uchar应修改为unsigned char。
c、delay_ms函数在模块delay模块中由其他人员完成。此处只需要包含delay.h文件并且调用即可,充分体现了模块化编程的优势。
d、在lcd1602.h文件中按照惯例使用#ifndef #endif包含所写代码,防止重复包含造成的编译器报错。
#ifndef __LCD1602_H_
#define __LCD1602_H_
//此处为.h文件的内容。
#endif
e、在模块编制完成之后自行创建mian函数进行调试,调试完成后只需编写接口函数调用手册即可。别人根据手册对应函数即可完成LCD的各种显示功能。即使在别的项目中只要包含了LCD1602.h和.c文件,几乎不需要进行修改就能直接使用。
猜你喜欢
- 2024-11-03 同学先别急着看单片机,先看看这个软件吧
- 2024-11-03 基于proteus的51单片机开发实例37-DAC0832
- 2024-11-03 单片机常用电路3-按键检测、LED驱动电路
- 2024-11-03 51单片机教程 第一个51程序 :点亮一个发光二极管(含代码)
- 2024-11-03 1. 基于proteus的51单片机开发实例(2)--闪烁的灯光
- 2024-11-03 1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下
- 2024-11-03 1. 基于proteus的51单片机开发实例30-模块化程序设计
- 2024-11-03 从一个简单的项目,学会单片机的使用:51单片机设计的8路抢答器
- 2024-11-03 售前/售后技术支持工程师简历专业技能怎么写
- 2024-11-03 proteus软件下载教程:proteus的电路仿真和虚拟模型仿真的区别
你 发表评论:
欢迎- 最近发表
-
- linux日志文件的管理、备份及日志服务器的搭建
- Linux下挂载windows的共享目录操作方法
- Linux系统中的备份文件命令(linux系统中的备份文件命令有哪些)
- 麒麟KYLINOS|通过不同方法设置用户访问文件及目录权限
- 「Linux笔记」系统目录结构(linux目录的结构及含义)
- linux中修改归属权chown命令和chgrp命令
- 工作日报 2021.10.27 Android-SEAndroid权限问题指南
- Windows和Linux环境下,修改Ollama的模型默认保存路径
- 如何强制用户在 Linux 上下次登录时更改密码?
- 如何删除Linux文件夹中除某些扩展名之外的所有文件?
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)