FPGA实现LCD1602控制

目录

注意!

本工程采用野火征途PRO开发板,外接LCD1602部件进行测试。

有偿提供代码!!!可以定制功能!!!

联系方式见底部

一、基础知识

1.1 引脚信息

1.2 指令

1.2.1 清屏

1.2.2 归位(返回)

1.2.3 输入方式设置

1.2.4 显示模式控制

1.2.5 光标、画面位移

1.2.6 功能设置

1.2.7 CG RAM地址设置

1.2.8 DD RAM地址设置

1.2.9 写数据

1.3 常用指令

1.4 内置字符与自定义字符显示原理

1.5 LCD1602初始化过程

二、部分代码

2.1 LCD1602循环滚动显示0-9-a-z-A-D

2.2 LCD1602显示自定义字符“仰以殊观”

三、实测

3.1 LCD1602循环滚动显示0-9-a-z-A-D

3.1.1 第一行显示0-9-a-z-A-D

3.1.2 第二行显示0-9-a-z-A-D

3.1.3 滚动显示

3.2 LCD1602显示自定义字符“仰以殊观”

四、联系我


注意!

本工程采用野火征途PRO开发板,外接LCD1602部件进行测试。

有偿提供代码!!!可以定制功能!!!

联系方式见底部

一、基础知识

1.1 引脚信息

VSS电源地
VDD电源正极
V0偏压(可不接或接地或接电位器调整电压)
RS寄存器选择(Register Select,选择数据或命令寄存器)
RW读/写
E使能
D0-D78位数据
A背光正极
K背光负极

1.2 指令

1.2.1 清屏

运行时间(250Khz): 1.64 µs

功能:清DDRAM和AC值。

1.2.2 归位(返回)

运行时间(250Khz): 1.64 µs

功能:AC= 0, 光标、画面回HOME位。

1.2.3 输入方式设置

运行时间(250Khz): 40 µs

功能:设置光标、画面移动方式。

其中:I/D =1: 数据读、写操作后,AC自动增一;

           I/D =0: 数据读、写操作后,AC自动减一;

           S = 1:数据读、写操作,画面平移;

           S = 0: 数据读、写操作,画面不动。

1.2.4 显示模式控制

运行时间(250Khz): 40 µs

功能:设置显示、光标及闪烁开关。

其中:D表示显示开关:D = 1为开,D = 0为关;

           C表示光标开关:C = 1为开,C = 0为关;

           B表示闪烁开关:B = 1为开,B = 0为关。

1.2.5 光标、画面位移

运行时间(250Khz): 40 µs

功能:光标、画面移动,不影响DDRAM。

其中:S/C = 1: 画面左移一个字符位;

           S/C = 0: 画面右移一个字符位;

           R/L = 1: 光标左移一个字符位;

           R/L = 0:光标右移一个字符位。

1.2.6 功能设置

运行时间(250Khz): 40 µs

功能:工作方式设置(初始化指令)。

其中:DL = 1:8位数据接口;

           DL = 0:4位数据接口;

           N = 1:两行显示;

           N = 0:一行显示;

           F = 1:5 × 10点阵字符;

           F = 0:5 × 7点阵字符。

1.2.7 CG RAM地址设置

运行时间(250Khz): 40 µs

功能:设置CG RAM地址。A5 ~ A0 = 0 ~ 3FH

1.2.8 DD RAM地址设置

运行时间(250Khz): 40 µs

功能:设置DD RAM地址;

         N = 0:一行显示,A6 ~ A0 = 0 ~ 4FH

         N = 1: 两行显示,首行A6 ~ A0 = 00H ~ 2FH ,次行A6 ~ A0 = 40H ~ 67H

1.2.9 写数据

运行时间(250Khz): 40 µs

功能:根据最近设置的地址性质,数据写入DD RAM或CG RAM内。

1.3 常用指令

'h38:功能设置(初始化指令,设置数据接口位数-1.3.6)

'h08:显示关闭(所有显示1.3.4)

'h01:显示清屏(清DDRAM和AC(AddressCount地址计数器)值-1.3.1)

'h06:显示光标及画面移动设置(控制读写后AC自动增减一,控制画面平移或不动-1.3.3)

'h0c:显示开及光标设置(控制显示开关,光标开关,闪烁开关-1.3.4)

'h18:画面左移(1.3.5)

1.4 内置字符与自定义字符显示原理

a)        DDRAM就相当于显示映射,最多可以显示2行*40列=80个字符,但是屏幕上只支持显示2行*16列=32个字符,显示字符时直接把想要显示数字或字母的ASCII值赋给D0-D7即可。

b)         CGROM中存储了00-ff个字符(其中00-07字符可以由CGRAM定义),用户将地址写入到DDRAM,相当于是把地址写入了CGROM中,然后CGROM将字符输出到DDRAM进行显示。

c)         CGRAM可以存储自定义字符,下图为DDRAM数据,CGRAM地址与写入字模码之间关系

        1、字符码(DDRAM数据)0 ~ 2位与CGRAM地址3 ~ 5位对应(要么是000,要么是001);

        2、CGRAM地址0 ~ 2位生成字模数据行位置(一个字符8行,一次输入一行,注意第八行为游标位置)

        3、字符码3位的赋值状态并不影响用户自定义

        4、用户自定义字符码的范围为00H ~ 07H或者08H ~ 0FH,也就是说字符码00H与08H对应同一 组用户自定义字符字模;

d)       自定义字符输入完毕后,将自定义字符的地址赋值给DDRAM即可显示自定义字符

字符码CGRAM地址
0x000x00-0x07
0x010x08-0x0f
0x020x10-0x17
0x030x18-0x1f
0x040x20-0x27
0x050x28-0x2f
0x060x30-0x37
0x070x38-0x3f

1.5 LCD1602初始化过程

        a)        程序烧录到FPGA后首先复位15ms

        b)        15ms后进入INIT初始化状态

        c)        INIT初始化状态分别写0x38 0x08 0x01 0x06 0x0c

每次写指令或数据间隔时间均远大于处理时间,故不用考虑读忙信号

二、部分代码

2.1 LCD1602循环滚动显示0-9-a-z-A-D

 // -------------------状态机控制LCD数据/指令赋值	
always @(posedge I_clk or negedge I_rst_n) beginif (!I_rst_n) beginO_lcd_data <= 8'd0;endelse begincase(S_state_c)IDLE		:begin O_lcd_data <= 8'h38; O_lcd_rs <= 0;end//初始化指令,设置lcd1602模式为8位数据接口;两行显示,5*7点阵(硬件限制)S1			:begin O_lcd_data <= 8'h01; O_lcd_rs <= 0;end//清屏(清DDRAM以及AC计数器)S2			:begin O_lcd_data <= 8'h06; O_lcd_rs <= 0;end//控制读写后AC自动增减一,控制画面不动S3			:begin O_lcd_data <= 8'h0c; O_lcd_rs <= 0;end//控制显示开,光标关,闪烁关ROW1_ADDR	:begin O_lcd_data <= 8'h80; O_lcd_rs <= 0;endWRITE		:begin O_lcd_data <= S_data_display; O_lcd_rs <= 1;endROW2_ADDR	:begin O_lcd_data <= 8'hc0; O_lcd_rs <= 0;endstop		:begin O_lcd_data <= 8'h18; O_lcd_rs <= 0;end//控制画面左移default:;endcaseendend

2.2 LCD1602显示自定义字符“仰以殊观”

一开始用的字模软件生成的01序列,但是5*8点阵来显示汉字有点太挤了,看不出来字形,所以将“仰殊观”这三个汉字拆成了两部分,其中“仰”的第一部分用一个5*8点阵显示,第二部分和“以”的左边一个竖用一个5*8点阵显示,“以”的右边部分用一个5*8点阵显示,“殊观”两个字分别用两个5*8点阵显示

// -------------------字符显示寄存器S_data_display赋值
/*
向CGRAM写入数据*/always @(*) begincase(S_char_cnt)//-------------仰-------------'d0: S_data_display   = 8'h05;'d1: S_data_display   = 8'h0a;'d2: S_data_display   = 8'h1a;'d3: S_data_display   = 8'h0a;'d4: S_data_display   = 8'h0b;'d5: S_data_display   = 8'h0a;'d6: S_data_display   = 8'h08;'d7: S_data_display   = 8'h00;//------------仰以------------'d8: S_data_display   = 8'h1d;'d9: S_data_display   = 8'h15;'d10: S_data_display  = 8'h15;'d11: S_data_display  = 8'h1d;'d12: S_data_display  = 8'h11;'d13: S_data_display  = 8'h11;'d14: S_data_display  = 8'h11;'d15: S_data_display  = 8'h00;//-------------以-------------'d16: S_data_display  = 8'h04;'d17: S_data_display  = 8'h04;'d18: S_data_display  = 8'h14;'d19: S_data_display  = 8'h14;'d20: S_data_display  = 8'h14;'d21: S_data_display  = 8'h0a;'d22: S_data_display  = 8'h11;'d23: S_data_display  = 8'h00;//-------------殊-------------'d24: S_data_display  = 8'h1f;'d25: S_data_display  = 8'h04;'d26: S_data_display  = 8'h0b;'d27: S_data_display  = 8'h15;'d28: S_data_display  = 8'h01;'d29: S_data_display  = 8'h02;'d30: S_data_display  = 8'h04;'d31: S_data_display  = 8'h00;//-------------殊-------------'d32: S_data_display  = 8'h14;'d33: S_data_display  = 8'h1f;'d34: S_data_display  = 8'h04;'d35: S_data_display  = 8'h1f;'d36: S_data_display  = 8'h0e;'d37: S_data_display  = 8'h15;'d38: S_data_display  = 8'h04;'d39: S_data_display  = 8'h00;//-------------观-------------'d40: S_data_display  = 8'h1f;'d41: S_data_display  = 8'h11;'d42: S_data_display  = 8'h0a;'d43: S_data_display  = 8'h04;'d44: S_data_display  = 8'h0a;'d45: S_data_display  = 8'h11;'d46: S_data_display  = 8'h00;'d47: S_data_display  = 8'h00;//-------------观-------------'d48: S_data_display  = 8'h1f;'d49: S_data_display  = 8'h15;'d50: S_data_display  = 8'h15;'d51: S_data_display  = 8'h04;'d52: S_data_display  = 8'h0c;'d53: S_data_display  = 8'h15;'d54: S_data_display  = 8'h07;'d55: S_data_display  = 8'h00;default:S_data_display = "P";endcaseend

三、实测

3.1 LCD1602循环滚动显示0-9-a-z-A-D

这里采用的方法是将DDRAM的2行40列全部显示0-9-a-z-A-D(10+26+4=40),然后让屏幕滚动起来

3.1.1 第一行显示0-9-a-z-A-D

LCD1602循环显示0-9-a-z-A-D(一)

3.1.2 第二行显示0-9-a-z-A-D

LCD1602循环显示0-9-a-z-A-D(二)

3.1.3 滚动显示

LCD1602循环显示0-9-a-z-A-D(三)

3.2 LCD1602显示自定义字符“仰以殊观”

这里采用的方法是用excel自己排列每个汉字的01序列,然后写入CGRAM中。

          
        
          
           
         
        
       
 
        
       
      
         
      
     
   
 
           
      
    
    
      
       
 

LCD1602显示自定义字符“仰以殊观”

四、联系我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【有效的括号】

有效的括号 一、题目二、思路三、代码 一、题目 二、思路 利用栈先进后出的特点存储左括号&#xff1a;后面遍历遇到的左括号要先闭合 用map存储左括号与右括号的对应关系&#xff0c;利用键值对快速查找右括号进行匹配 三、代码 使用.has()方法判断当前遍历的字符是否是右括…

项目架构知识点总结

项目架构知识点总结 【一】重要注解【1】SpringBootApplication&#xff08;1&#xff09;⭐️ComponentScan 注解&#xff08;2&#xff09;⭐️EnableAutoConfiguration 注解&#xff08;3&#xff09;⭐️SpringBootConfiguration 注解&#xff08;4&#xff09;Inherited 注…

vite+cesium+天地图

创建vite项目 直接在地址栏输入cmd进入命令行&#xff08;vite项目默认为vue3&#xff09; # yarn yarn create vite 项目名称 --template vue 创建成功后依次执行 yarn install yarn dev 安装cesium和vite-plugin-cesium 没有加版本号默认为最新版本 加版本号如cesium1.1…

sql注入的专项练习 sqlilabs(含代码审计)

在做题之前先复习了数据库的增删改查&#xff0c;然后自己用本地的环境&#xff0c;在自己建的库里面进行了sql语句的测试&#xff0c;主要是回顾了一下sql注入联合注入查询的语句和sql注入的一般做题步骤。 1.获取当前数据库 2.获取数据库中的表 3.获取表中的字段名 一、sql…

WordPress 后台开发技巧:向文章发布页右侧添加自定义菜单项

案例图片 这个案例向你介绍了如何在文章发布页的右侧边栏增加一个新的自定义菜单项。具体用它实现什么功能&#xff0c;就看你的需要了。 代码 function add_custom_menu_item() { add_meta_box(custom_menu_item, 这里是菜单项名称, display_custom_menu_item, post, side, …

基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)

这是项目的初始页面 接下来我先写下我的初始项目搭建 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 首先我们打开页面&#xff0c;准备搭建项目的初始准备 1.New Project 2.随后点击Next&#xff0c;勾…

AttributeError: ‘list‘ object has no attribute ‘text‘

AttributeError: ‘list‘ object has no attribute ‘text‘ 目录 AttributeError: ‘list‘ object has no attribute ‘text‘ 【常见模块错误】 【解决方案】 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引&#xff0c;而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询&#xff0c;从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日&#xff0c;2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至&#xff0c;各路精英齐聚一堂&#xff0c;围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会&#xff0c;尽享…

Java面试八股之什么是spring boot starter

什么是spring boot starter Spring Boot Starter是Spring Boot项目中的一个重要概念。它是一种依赖管理机制&#xff0c;用于简化Maven或Gradle配置文件中的依赖项声明。Spring Boot Starter提供了一组预定义的依赖关系&#xff0c;这些依赖关系被封装在一个单一的包中&#x…

十日Python项目——第三日(用户中心——邮箱验证、修改密码)

#前言&#xff1a; 在最近十天我会用Python做一个购物类项目&#xff0c;会用到DjangoMysqlRedisVue等。 今天是第三天&#xff0c;主要负责撰写用户中心部分&#xff0c;以及优化登录部分。若是有不懂大家可以先阅读我的前两篇博客以能够顺承。博客&#xff1a;十日Python项…

前端江湖:从菜鸟到大侠的修炼手册

在这个数字编织的梦幻世界里&#xff0c;前端&#xff0c;这个听起来就带着几分仙气与神秘感的词汇&#xff0c;实则是每一位互联网探险家手中的魔法杖。它不仅连接着代码的冰冷逻辑与用户的炽热情感&#xff0c;更在无数次的点击与滑动间&#xff0c;绘制出一幅幅绚丽多彩的交…

Godot入门 05收集物品

创建新场景&#xff0c;添加Area2D节点&#xff0c;AnimatedSprite2D节点 &#xff0c;CollisionShape2D节点 添加硬币 按F键居中&#xff0c;放大视图。设置动画速度设为10FPS&#xff0c;加载后自动播放&#xff0c;动画循环 碰撞形状设为圆形&#xff0c;修改Area2D节点为Co…

Go语言常见序列化协议全面对比

先说结论 从易用性、性能、内存占用、编码后大小等几个方面综合考虑 ProtoBuf 胜出。 Gob 从性能和 I/O 带宽占用上都和 ProtoBuf 差不多&#xff0c;唯一劣势是编解码时内存占用较多。考虑到不用再写 IDL 带来的易用性&#xff0c;如果整个系统内不存在使用除 Go 以外其他语言…

外卖霸王餐系统推荐,哪家的系统比较稳定呢?

以下是一些较为稳定且有一定用户基础的外卖霸王餐系统&#xff0c;你可以根据自身需求进一步考察和选择&#xff1a; - **饭否霸王餐**&#xff1a;有专门的APP&#xff0c;如在应用宝上其开发商为南京有惠鲸选电子商务有限公司。它覆盖了多个城市&#xff0c;提供美团、饿了么…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外&#xff0c;还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相&#xff0c;成为赛场上另一道亮丽的风景线。 在新时代的浪潮中&#xff0c;中国制造业坚…

AlibabaCloudAI

快速体验 Spring Cloud Alibaba AI JDK要求最低17 1.SpringAI Spring AI 旨在简化包含人工智能相关功能的应用程序的开发&#xff0c;避免不必要的复杂性。 Spring AI 的核心是提供抽象&#xff0c;作为开发 AI 应用程序的基础。这些抽象有多种实现方式&#xff0c;只需极少…

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统

PACS&#xff0c;即图像存储与传输系统&#xff0c;是应用于医院中管理医疗设备如CT&#xff0c;MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动&#xff0c;集成了医疗设备&#xff0c;图像存储和分发&#xff0c;数字图像在重要诊断和会诊时的显示&a…

Redis的五种数据类型与命令

目录 引言 一 Redis的特性 二 Redis的安装 三 Redis的优点 四 Redis的五种数据类型与命令 五 Redis的配置文件 引言 Redis是什么&#xff1f; Remote Dictionary Service(远程字典服务器) Redis 是一个开源的(BSD许可)的&#xff0c;C语言编写的&#xff0c;高性能的数…

计算机网络实验-RIP配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 路由信息协议&#xff08;Routing Information Protocol&#xff0c;RIP&#xff09;是一种基于距离向量&#xff08;Distance-Vector&…