LCD1602按照5x7点阵显示字符,可显示一些简单的汉字

2023-05-16

!本博客是 《LCD1602自定义点阵字符》的学习笔记以及补(chao)充(xie)

LCD1602能存8个自定义字符, 首地址分别为0X40,0X48,0X50,0X58,0X60,0X68,0X70,0X78;

也就是说0x40到0x7F都是用来存自定义字符的

每个字符都是5x7的点阵,以0x40为例
在这里插入图片描述

每个地址为一行(按字节寻址),但是每一行只有第五位有效,行也是前五行有效 行也是前七行有效

存储和显示都是两步实现
一步write_command()确定地址
第二步write_data()确定操作数

write_command()和write_data()都是lcd1602经常写的函数,详见后面代码

要存储自定义字符需要两步

  1. 向lcd1602发送命令,定位行
  2. 写入每行对应的数据

比如将十储存到首地址为0x40

write_command(0x40); // line1
write_data(0x04);
write_command(0x41); // line2
write_data(0x04);
write_command(0x42); // line3
write_data(0x3F);
write_command(0x43); // line4
write_data(0x04);
write_command(0x44); // line5
write_data(0x04);
write_command(0x45); // line6
write_data(0x04);
write_command(0x46); // line7
write_data(0x04);

在这里插入图片描述

显示自定义字符也是这个步骤

  1. write_command(0x80+[0x40第二行]+第几个字符);
  2. write_data(第几个自定义字符,也可以看ascii码表,前八个是自定义字符);

在这里插入图片描述
显示非自定义字符和自定义字符步骤一样

可以取模软件将自定义字符存到一个数组里面,然后两个函数用于修改和显示自定义字符

// custom_code is between on 0 and 7
void ch_custom_char(uchar *char_lattice, uchar custom_code)
{
  int i;
  for(i=0;i<8;i++)
  {
    write_command(0x40+custom_code*8+i); // set to the i-th line
    write_data(char_lattice[i]); // write a line bit
  }
}
void display_custom_char(uchar n, uchar custom_code)
{
  write_command(0x80+n); // set to the n-th char
  write_data(custom_code); // display the custom_code char
}

还可以将显示字符串的函数完善一下,将自定义字符串也自动识别显示。
我就懒得实现了。
下面是一个算是完整能用的代码

/* Main.c file generated by New Project wizard
 *
 * Created:   周四 5月 27 2021
 * Processor: 80C31
 * Compiler:  Keil for 8051
 */

#include <reg51.h>
#include<intrins.h>
#define DATA_BUS  (P0) 
// Define P3 pins
sbit RS = P2^0;
sbit RW=P2^1;
sbit E=P2^2;
// Define new types
typedef unsigned char   uchar;
typedef unsigned int    uint;

// Function Prototypes
void check_busy(void);
void LCD_init(void);
void write_command(uchar com);
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint);
void write_data(uchar _data);
void ch_custom_char(uchar *char_lattice, uchar custom_code);
void display_custom_char(uchar n, uchar custom_code);
uchar lu[] = {0x00,0x01,0x01,0x05,0x01,0x07,0x00};/*"业",2*/
uchar ye2[] = {0x00,0x30,0x34,0xB4,0x28,0xFC,0x00};/*"业",2*/

void main(void)
{
  LCD_init(); 
  while(1)
  { //string(0x80,"1900301517!");
    //string(0xC0,"  LuHongye");
    ch_custom_char(lu,1);
    display_custom_char(0,0);
	ch_custom_char(ye2,2);
    display_custom_char(1,2);

    delay(100); 
    write_command(0x01);
    delay(100);       
  }
 }

/*******************************************
    LCD1602 Driver mapped as IO peripheral
*******************************************/  
// Delay
void delay(uint j)
{ 
  uchar i = 60;
  for(; j>0; j--)
  {
    while(--i);
    i = 59;
    while(--i);
      i = 60;
  }
}

// Test the Busy bit
void check_busy(void)
{ 
  do
  {
     DATA_BUS = 0xff;
     E = 0;
     RS = 0; 
     RW = 1;
     E = 1;
     _nop_();
  } while(DATA_BUS & 0x80);
  E = 0;
 }

// Write a command
void write_command(uchar com)
{ 
  check_busy();
  E = 0;
  RS = 0;
  RW = 0;
  DATA_BUS = com;
  E = 1;
  _nop_();
  E = 0;
  delay(1);
}

// Write Data
void write_data(uchar _data)
{
  check_busy();
  E = 0;
  RS = 1;
  RW = 0;
  DATA_BUS = _data;
  E = 1;
  _nop_();
  E = 0;
  delay(1);   
}

// Initialize LCD controller
void LCD_init(void)
{
  write_command(0x38); // 8-bits, 2 lines, 7x5 dots
  write_command(0x0C); // no cursor, no blink, enable display
  write_command(0x06); // auto-increment on
  write_command(0x01); // clear screen
  delay(1);
}

// Display a string
void string(uchar ad, uchar *s)
{
  write_command(ad);
  while(*s>0)
  {
    write_data(*s++);
    delay(100);
  }
}
// custom_code is between on 0 and 7
void ch_custom_char(uchar *char_lattice, uchar custom_code)
{
  int i;
  for(i=0;i<8;i++)
  {
    write_command(0x40+custom_code*8+i); // set to the i-th line
    write_data(char_lattice[i]); // write a line bit
  }
}

void display_custom_char(uchar n, uchar custom_code)
{
  write_command(0x80+n); // set to the n-th char
  write_data(custom_code); // display the custom_code char
}

参考博客:《LCD1602自定义点阵字符》

2023年5月10日更新
偶尔点进来看了一边,发现好像有很多错误,做了点修改
行也是前五行有效修改为`行也是前七行有效

write_command(0x40); // line1
write_data(0x40);
write_command(0x40); // line2
write_data(0x40);
write_command(0x40); // line3
write_data(0x40);
write_command(0x40); // line4
write_data(0x40);
write_command(0x40); // line5
write_data(0x40);
write_command(0x40); // line6
write_data(0x40);
write_command(0x40); // line7
write_data(0x40);

(我复制粘贴的时候不急的改参数了吧,应该没改错吧)
修改为

write_command(0x40); // line1
write_data(0x04);
write_command(0x41); // line2
write_data(0x04);
write_command(0x42); // line3
write_data(0x3F);
write_command(0x43); // line4
write_data(0x04);
write_command(0x44); // line5
write_data(0x04);
write_command(0x45); // line6
write_data(0x04);
write_command(0x46); // line7
write_data(0x04);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LCD1602按照5x7点阵显示字符,可显示一些简单的汉字 的相关文章

  • Choco-slover的使用

    一 相关资料 choco slover github源代码以及工具下载网址 https github com chocoteam choco solver choco slover 官网文档 https choco solver org c
  • python 进入虚拟环境 source activate 时候报错 Badly placed ()'s

    当想要进入python的指定虚拟环境 venv bin 时使用 source activate报错 source activate Badly placed 39 s 因为当前Linux使用的是 csh 或者fish shell时是无法使用
  • IDEA javadoc快捷键

    思悠悠 xff0c 恨悠悠 xff0c 恨到归时方始休 月明人依楼 白居易 长相思 汴水流 设置快捷键FIle gt Setting gt Keymap gt Other 搜索 Fix doc xff0c 右键 xff1a Add Keyb
  • 常见的关系型数据库(最全收录)

    天子呼来不上船 xff0c 自称臣是酒中仙 杜甫 饮中八仙歌 1 OracleOracle是1983年推出的世界上第一个开放式商品化关系型数据库管理系统 它采用标准的SQL结构化查询语言 xff0c 支持多种数据类型 xff0c 提供面向对
  • Docker报错,(default) No default Boot2Docker ISO found locally, downloading the latest release...

    环境简述 xff1a 系统 xff1a Windows 10家庭版 安装 Hyper V 后 xff0c 安装 Docker For Windows 还是不好使 后面选择下载了 xff0c Docker Toolbox xff0c 一路 n
  • golang学习笔记 casbin授权库学习记录

    目录 权限控制管理模型ACLRBACABAC Casbin介绍Casbin概述Casbin工作原理请求策略匹配器效果 Casbin结合golang基本使用添加policy结合gorm适配器使用对policy经行增删改查 自定义匹配函数 权限
  • 【洛谷】P1626象棋比赛

    题目描述 有 span class hljs keyword N span 个人要参加国际象棋比赛 xff0c 该比赛要进行 span class hljs keyword K span 场对弈 每个人最多参加两场对弈 xff0c 最少参加
  • 四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566

    概述 交叉编译大概的意思是指 在PC x86 x64 的机器上编译其他平台如ARM平台的代码 xff0c 这个过程叫做交叉编译 对于交叉编译 xff0c 我们首先确定目标平台的架构 xff0c RK3566的架构是ARMv8 xff0c 6
  • 关于金蝶组件各类报错问题

    最近维护金蝶K3wish xff0c 遇到个别客户端的组件报错问题 xff0c 现整理问题解决方法 xff1a 1 打开金蝶的追踪程序 xff0c 在本机金蝶安装盘下搜索 xff1a KdMainDBG exe程序 xff1b 2 加载进入
  • Charles + Postern 安卓模拟器抓包

    首先 xff0c 要注意的是 xff0c 在安卓7 0以后 xff0c Fiddle和charles这些抓包工具安装的证书 xff0c 会被默认不相信 xff0c 所以按照很多旧的抓包工具的配置过程 xff0c 没有办法成功抓包 今天就在这
  • HTML(一天学完)总结。附上html思维导图

    3 24 偷懒了几天 昨天加今天看完了狂神说的html 因为html和mysql是一起学的 xff0c 我看腻了mysql就去看html 在这里写一篇总结 附上html思维导图 HTML Hyper Text Markup Language
  • TGP漏洞:lol无法正常登录问题

    今天下午发现了个有趣的现象 xff0c 本来是要设置路由器的 xff0c 结果路由器设置好后 xff0c 上网之类的都正常 但就是玩不了lol xff0c 登进去总是提示与服务器无法连接 xff0c 您的网络有问题 好郁闷啊 xff0c 我
  • 代码参数里的 payload 是什么意思???

    首先解释一下什么是 payload payload 字面意思 有效载荷 xff0c 有效负荷 xff0c 有效载重 payload 维基百科payload中的解释 xff1a 在计算机科学与电信领域 xff0c 负载 xff08 英语 xf
  • 树莓派 Volumio 3.5触摸屏(GPIO) 配置教程

    最近咸鱼淘了一个树莓派3B 买成210血亏哦 200以下差不多 做数播 装的Volumio系统 和少帅的i2c转同轴的板 连同壳子140 43 后来又淘了一个3 5寸的TFT小屏幕3 5inch RPi Display LCD wiki 我
  • Ubuntu 16.04 LTS 一键安装VNC

    Ubuntu 16 04 LTS 安装VNC xff0c 在百度和谷歌找了很多教程 xff0c 不是太老 xff0c 就是说的驴唇不对马嘴 xff0c 所以忍不住写一些以正视听 Ubuntu 16 04 LTS是最近出的LTS版本系统 xf
  • OpenMP简介

    01 OpenMP简介 OpenMP xff08 开放式多处理 xff09 是一种应用程序编程接口 xff08 API xff09 xff0c 支持C xff0c C 43 43 和Fortran中的多平台共享内存 多 处 理
  • windows10 ubuntu18.04 CUDA9.2 caffe tensorflow pytorch安装

    文章目录 windows10 安装ubuntu18 04 系统安装1 制作U盘启动盘2 更改英文路径3 更新源4 设置root账号5 安装NVIDIA驱动6 CUDA安装7 CUDNN安装8 Anaconda安装9 Pytorch安装10
  • 场景分类资料

    1 https blog csdn net Wayne2019 article details 78629204 2 场景分类 xff08 1 xff09 研究方法 一 两个步骤 xff08 一 xff09 从图像中获得表现图像场景的图像特
  • ubuntu如何降级到之前的版本

    找出系统已经安装的内核版本 xff0c 在终端里输入命令 xff1a dpkg get selections grep linux image 然后会显示系统中已安装的内核 xff0c 例如 xff1a linux image 3 0 0
  • 你真的了解 bash 的 exec 命令吗?

    前言 bash exec 命令不太常用 xff0c 我对它提供的功能也仅知一二 xff0c 没有掌握全貌 最近遇到了几个问题 xff0c 从问题出发研究了一通找到 exec 命令头上 xff0c 问题迎刃而解后 xff0c 才对 exec

随机推荐