索引
一、前文回顾
在上一期中,我们了解了我们了解了LCD1602的主要参数、管脚组成、各管脚的功能与作用、以及在执行写语读操作时的时序;同时借助其数据手册,在初始化函数中完成了LCD相关参数的配置,实现了在4位数据模式下向LCD屏传输数据,并且显示出来。我们编写了以下函数:
- 触发发送函数【void toggle_enable()】;
- 检测忙函数【void LCD_Check_Busy()】;
- 写入命令函数【void display_to_COM(char value)】;
- 写入数据函数【void display_to_LCD(char value)】;
- 初始化函数【void LCD_init()】;
以便我们在main.cpp文件中可以调用。(当然,对于在不同场景下的不同需求,初始化函数中的命令也可以根据命令表做相应的更改)
具体内容可参见一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)。
当然,如果只以目前的函数来说,虽然满足基本使用需求,但对于一些复杂的需求,处理起来便会过于繁琐,不易于使用,因此,基于前传,我们可以对一些函数进行封装以便更好地使用。
二、自定义函数封装
2.1 数字转换函数【char Num_transfer(int number)】
顾名思义,该函数就是根据字模库将数字转换为对应的十六进制数字。
char Num_transfer(int number) {
int trans_num;
switch (number) {
case 0:
trans_num = 0x30; // 显示 0
break;
case 1:
trans_num = 0x31; // 显示 1
break;
case 2:
trans_num = 0x32; // 显示 2
break;
case 3:
trans_num = 0x33; // 显示 3
break;
case 4:
trans_num = 0x34; // 显示 4
break;
case 5:
trans_num = 0x35; //显示 5
break;
case 6:
trans_num = 0x36; // 显示 6
break;
case 7:
trans_num = 0x37; // 显示 7
break;
case 8:
trans_num = 0x38; // 显示 8
break;
case 9:
trans_num = 0x39; // 显示 9
break;
default:
break;
}
return trans_num;
}
2.2 数字输出函数【void print_number(char num)】
void print_number(char num) { display_to_LCD(Num_transfer(num)); }
2.3 字符转换函数【char Char_transfer(char character)】
char Char_transfer(char character) {
char number, result = 0x41, i;
for (i = 'A'; i <= 'z'; i++) // 选定该字符是否在 A ~ z 内
{
if (character == i) { // 找到该字符
number = result; // 赋值输出
break; // 该寻找的循环停止
}
result++;
}
return number;
}
2.4 字符串输出函数【void print_sentence(char *sent)】
这个函数可以帮助你无需转换为字符对应的十六进制数字,直接传入一个字符串即可实现在LCD上呈现。
void print_sentence(char *sent) {
char *p = sent;
while ((*p) != '\0') { // 使用该指针遍历整个字符串
display_to_LCD(Char_transfer(*p)); // 使用上述函数输出
p++;
}
}
2.5 宏定义
值得一提的是,在 LCD.h 中,我们可以定义一些数字来增强我们是代码可读性:
#define change_line (0xc0) // 换行
#define space (0x20) // 空格
#define dot (0x2E) // 小数点
#define colon (0x3A) // 冒号
#define clear_all (0x01) // 清屏
#define middle_line (0x2D) // 连接线'-'
三、问题解答
上一篇博客发送后,收到了广泛关注。在此谢谢诸位!你们的支持就是对笔者最大的鼓励!
同时,大家也发出了许多问题,再此对优质问题做一小结。
Q1
Q:关于BusOut data,BusOut博主是如何定义的?没看到。
A:在检测忙函数函数中有BusOut的定义,命名为data,用于控制LCD上D4~D7的输入值(0或1)。问号处需要对应自己的单片机自己设置引脚哈。这个变量是对所有代码都适用的。
这里用于向单片机输入信息。这个信息可以由用户在程序中输入一个八进制数字来定义。例如在写入命令函数中,通过输入两次四位二进制数字,可以向lcd发送一个八位的二进制数据。这个数据在经过发送给lcd后可以用于控制参数;同理,在写入数据函数中,通过两次输入,可以发送一个八位二进制数字,在字模库中找到这个二进制数字所对应的字符,便可以知道希望lcd输出什么字符。
如果BusOut不太明白也可以上网找找资料了解一下下~~~
Q2
Q:请问一下,如果我需要直接用lcd1602printf一些字符应该如何调用函数并使用呢?
A:目前可以通过传入对应我的十六进制数字来显示字符;对于更方便地使用,可以参看前文博客中的函数哈~~~
Q3
Q:请问如何先写入高四位,再写入低四位,能给个例子吗?
A:这个问题可以参看写入命令函数及写入数据函数。将data右移4位,低四位溢出,只保留高四位;将data发送,高四位超出范围(只接了4个引脚),只发送低四位。之后分两次发送便可将一组8位的命令或数据发送。
以写入命令函数为例:
void display_to_COM(char value)
{
RS = 0; // 设置为低电平来写命令
RW = 0; // 设置为写
data = (value) >> 4; // 数值右移4位,发送高四位
toggle_enable(); // 发送
data = (value); // 数值跟0x0F相与,发送低四位
toggle_enable(); // 发送
}
顺序是:发送高四位——发送——发送低四位——发送。
Q4
Q:就是LCD那个能不能求一个主函数啊想做一下参考……我的LCD现在只会亮,我想看一下怎么让它显示一些东西
A:main.cpp参考LCD.h就好了。
显示的话只需要调用初始化函数及显示函数即可。对于一些特殊命令(如清屏、换行)则需要命令发送函数。