一文助你进阶使用 LCD1602 液晶显示屏

文章介绍了在STM32平台上对LCD1602液晶显示屏的自定义函数封装,包括数字转换、字符输出和字符串输出函数,以及宏定义,以简化LCD的使用。同时,解答了关于BusOut定义、字符直接输出、高低位发送和主函数示例的问题。
摘要由CSDN通过智能技术生成

一、前文回顾

在上一期中,我们了解了我们了解了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就好了。
显示的话只需要调用初始化函数及显示函数即可。对于一些特殊命令(如清屏、换行)则需要命令发送函数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值