零基础实现LCD1602自定义字符(包教包会)

前言:

作为单片机小白,最痛苦的莫过于从网上良莠不齐的文章中寻找自己所需知识。本人之前就非常想用LCD1602显示自定义字符(想玩点花操作),但苦于自身愚钝,对网上拷来的代码根本就不知道怎么使用,更别说清楚的了解其原理了,于是苦心专研,研究出实现自定义字符的代码。

注:

1.代码部分只讲怎么用(给那些了解基本原理不想太过深入研究只想实现现象的人使用),

至于小白可以看看后面的原理分析和代码讲解(点赞收藏数够就开坑)

2.本人使用的是普中A2版C51单片机(不是此版的单片机注意检查IO口是否不同)

3.以下放出图像证明代码可行性(是我部门作业的截图,懒得再弄):

代码部分:

1.对端口的重命名和宏定义:

#include <REGX52.H>

sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0

2.对LCD写指令和写数据函数:

/**
  * @brief  LCD1602延时函数,可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

3.LCD自定义字符相应函数:

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

/**
  * @brief  在LCD1602指定位置显示自定义字符
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  add  选择展示CGRAM中哪个自定义字符 1~8
  * @param  CG_dat[]存放LCD1602屏幕对应LED亮灭数据,
			CG_dat[9]保存设置CGRAM8个地址中其中一个的第1行的指令
              (规律0x40,0x48,0x50,0x58,0x60,0x58,0x70,0x78)
  * @retval 无
  */
void LCD_makechar(unsigned char Line,unsigned char Column,unsigned char add,unsigned char CG_dat[])
{
	unsigned char i;
	//CGRAM输入自定义字符数据
	for(i=0;i<8;i++)
	{
		LCD_WriteCommand(CG_dat[8]+i);//写入指令:设置CGRAM地址为5*8点阵的第几行
		LCD_WriteData(CG_dat[i]);//把自定义字符第一行的LED灯亮灭数据写入
	}
	LCD_SetCursor(Line,Column);//设置光标位置(确定显示位置)
	LCD_WriteData(add-1);//向DDRAM写入数据(数据为CGRAM中自定义字符的地址)
} 

4.头文件部分:

#ifndef __LCD1602_H__
#define __LCD1602_H__

void LCD_Init();
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteData(unsigned char Data);
void LCD_makechar(unsigned char Line,unsigned char Column,unsigned char add,unsigned char CG_dat[]);

#endif

5.主函数部分:

#include "regx52.h"
#include "LCD1602.h"

unsigned char code CG_dat1[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,0x40};//日
unsigned char code CG_dat2[]={0x04,0x1F,0x04,0x0E,0x15,0x0E,0x04,0x00,0x48};//本
unsigned char code CG_dat3[]={0x00,0x07,0x02,0x04,0x0B,0x03,0x00,0x00,0x50};//石
unsigned char code CG_dat4[]={0x02,0x1F,0x12,0x17,0x15,0x12,0x15,0x00,0x58};//皮
unsigned char code CG_dat5[]={0x00,0x02,0x07,0x02,0x07,0x00,0x00,0x00,0x60};//土
unsigned char code CG_dat6[]={0x1F,0x04,0x04,0x0C,0x16,0x05,0x04,0x00,0x68};//不
unsigned char code CG_dat7[]={0x17,0x08,0x07,0x15,0x0F,0x05,0x12,0x06,0x70};//海
unsigned char code CG_dat8[]={0x05,0x10,0x07,0x12,0x07,0x0A,0x17,0x02,0x78};//洋

void main()
{
	LCD_Init();
	while(1)
	{
		LCD_makechar(1,1,1,CG_dat1);
		LCD_makechar(1,2,2,CG_dat2);
		LCD_makechar(1,3,3,CG_dat3);
		LCD_makechar(1,4,4,CG_dat4);
		LCD_makechar(1,5,5,CG_dat5);
		LCD_makechar(1,6,6,CG_dat6);
		LCD_makechar(1,7,7,CG_dat7);
		LCD_makechar(1,8,8,CG_dat8);
	}
}

6.LCD自定义字符函数操作说明(必看):

1.把对端口的重命名和宏定义,对LCD写指令和写数据函数,LCD自定义字符相应函数放入创建的LCD1602.c文件中,复制头文件代码创建LCD1602.h

2.LCD自定义函数参数的填入:

# Line,Column是设置自定义字符在哪一行哪一列显示的

# add是选择展示CGRAM中哪个自定义字符

#  CG_dat[ ] LCD1602屏幕对应字符LED亮灭的8组数据+设置CGRAM8个地址中其中一个的第1行的指令(这句话看不懂没关系,你只需知道如何得到字符LED亮灭的8组数据和add与CG_dat[8]的对应关系规律即可)

以"今"字为例,得到字符LED亮灭的8组数据方法如下:

1.打开字模取模软件新建图像(8*8),并绘制你想要的汉字

 2.点击C51格式生成数据并赋值数据到创建的CG_dat1[ ]中

如上面主函数部分CG_dat1[ ]={0x04,0x0A,0x15,0x00,0x1F,0x01,0x02,0x04,};

(现在只有 LCD1602屏幕对应字符LED亮灭的8组数据,还要加上设置CGRAM8个地址中其中一个的第1行的指令)

3.值得注意的是:注意参数是横向取模

然后(8*8)点阵左边三列不能绘制(这个很重要!!!!!!)

add与CG_dat[8]的对应关系规律如下:

1对应0x40                      2对应0x48

3对应0x50                      4对应0x58

5对应0x60                      6对应0x68

7对应0x70                      8对应0x78

如我要把"今"字设置在CGRAM的第一个地址,则add为1,根据对应关系可得CG_dat[8]=0x40

所以"今"字创建的数据为

unsigned char code CG_dat1[]={0x04,0x0A,0x15,0x00,0x1F,0x01,0x02,0x04,0x40};

要是实在看不懂就看看主函数就懂了

代码运行效果:

 由于只能定义8个字符,所以海洋两个字有点丑,见谅哈

另外提一下小技巧就是复杂的汉字(无法用单个5*8点阵显示的)可以用两个点阵来同时显示

笔者有话:

1.如果成功实现LCD1602自定义字符,别忘了给视频点个赞哦!!!!!

(拜托拜托,这对我非常重要,这文章都肝了一晚上都T_T)

2.等过几天看看文章的反响如何,好的话速更LCD1602基本原理,自定义字符实现原理以及实现LCD1602滚动字幕和显示5*10点阵的字符等一系列函数

3.最近几天真的被日本的那些政客的丑恶嘴脸和恶劣行径恶心坏了,日本擅排核污水这一自私,疯狂,反人类,反自然的行为,必将受到全人类和大自然的惩罚!!!!——8月24后日本排海的第二天晚上记下

### 使用 IPTABLES 配置特定 IP 段访问端口 为了实现通过 IPTABLES 允许特定 IP 段访问某个端口的功能,可以按照以下方法操作: #### 1. 创建规则以允许指定的 IP 段访问目标端口 可以通过 `-s` 参数来定义源地址范围,并结合 `--dport` 来限定目标端口号。例如,如果要允许来自 IP 范围 `192.168.1.0/24` 的设备访问端口 `3306`,则可执行如下命令: ```bash iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT ``` 此命令的作用是接受来自子网 `192.168.1.0/24` 中的所有主机对端口 `3306` 的 TCP 连接请求[^1]。 #### 2. 禁止其他所有 IP 访问该端口 为了让上述规则生效并确保安全性,还需要阻止除指定 IP 段外的所有流量尝试连接到这个端口。这一步骤通常放在最后一条匹配规则之后完成: ```bash iptables -A INPUT -p tcp --dport 3306 -j DROP ``` 这条指令会丢弃任何未被前面规则显式许可的数据包到达端口 `3306` 上[^2]。 #### 完整脚本实例 下面给出一个完整的例子用于演示如何设置 MySQL 数据库服务器(默认监听于 3306 端口),使其仅仅能够由本地网络内的客户端机器进行远程管理而拒绝外部世界的未经邀请者接入: ```bash #!/bin/bash # 清理现有规则 (谨慎使用, 可能中断当前会话) iptables -F # 开放 SSH(22号端口),防止断开SSH连接 iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 授权局域网中的计算机访问数据库服务 iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT # 屏蔽其余一切针对3306端口的入站请求 iptables -A INPUT -p tcp --dport 3306 -j DROP # 启用回环接口通信以及已建立或相关联的链接保持畅通无阻状态 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 默认策略设为DROP以防万一遗漏某些潜在威胁项 iptables -P INPUT DROP ``` 以上脚本首先清除了现有的防火墙规则;接着开放了必要的 SSH 和 MySQL 数据库服务入口;再设定好内外部防护屏障后才最终确立起整个系统的安全基线架构体系结构[^3]。 ### 注意事项 - 在实际部署前务必测试新加入的过滤条件不会误伤合法业务流程。 - 如果操作系统重启可能会丢失临时性的 iptables 修改成果,因此建议保存配置文件或者利用工具如 `service iptables save` 命令永久保留更改记录。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码当草吃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值