26-51单片机-LCD12864液晶显示实验

一 主要涉及到的知识点:

        1.1LCD12864 介绍:

        LCD12864 液晶屏结构上与 LCD1602 一样,只是在行列数与显示像素上区别很LCD12864,

以下简称 12864,注意区分 LCD1602 和 LCD12864。12864是 64行 128 列,当然也有可能会设

计成 64 列 128 行,这里的行列不像 1602 那样,1602 是按照八行四列标准英文字符格式,以一

行十六个字符,两列字符命名,而 12864 是以 128 列像素,64 行像素,也就是128*64 个像素点

组成。就好比是 128 列 64 行的点阵。需要一行一列的去显示像素点。通常显示一个汉字需要

16*16 个像素点,所以 LCD12864 一行最多能显示 8个汉字,最多能显示 4 行。通常显示一个字

符需要 8*8 个像素点,所以 LCD12864一行最多能显示 16 个字符,最多能显示 8 行。当然这是不

依靠后期取模的显示情况,如果通过取模软件取模,然后将 LCD12864 按照 128*64 个像素点来显

示,显示的内容就可能超过之前的,就拿字符来说,可以选择小号字体,通过取模软件将字符数据

取出,然后将这些数据通过在对应的像素点上点亮或熄灭实现不同字体的显示。图像的显示原理也

是这样。常用的 12864 分为带字库和不带字库两种。

        LCD12864 带字库屏共有 20 个引脚,管脚功能如下:

        1.2  LCD12864 带字库的指令;

        1.2.1 功能设定:

        1.2.2 清屏指令:

        1.2.3 进入设定点:

        1.2.4 显示状态开关设置:

        同 LCD1602 一样,LCD12864 内部也含有 DDRAM,与其对应的地址如下:

        第一行:0X80-OX87;(一个汉字占用 2 个字节,共 8 个汉字)
        第二行:0X90-0X97;

        第三行:0X88-0X8F;
        第四行:0X98-0X9F;

1.3 LCD12864的设置:

1.3.1 LCD12864写命令函数定义:

1.3.2 LCD12864读数据函数定义:

1.3.3 LCD12864初始化函数定义:

1.3.4 LCD12864清屏函数定义:

1.3.5 LCD12864显示字符串函数定义:

二 源代码:

2.1 代码文件详情:

2.2 main.c文件:

#include "public.h"
#include "lcd12864.h"
//主函数
int main()
{
    lcd12864_init(); //初始化lcd12864
    lcd12864_show_string(0,0,"李衡加油好嘛!");
    lcd12864_show_string(0,1,"找个好工作!");
    lcd12864_show_string(0,2,"朱朱还在等你!");
    lcd12864_show_string(0,3,"加油加油加油!!");

    while(1)
    {
        
    }
    return 0;
}

2.3 public.c文件:

#include "public.h"

//延时函数定义delay_10us,当time_num_us=1时,相当于10us.
void delay_10us(u16 time_num_us)
{
    while(time_num_us--);
}

//延时函数定义delay_ms,当time_num_us=1时,相当于1ms.
void delay_ms(u16 time_num_us)
{
    u8 i = 0;
    u8 j = 0;
    for(i = 0; i < time_num_us; i++)
        for(j = 101; j > 0; j++);
}
 

2.4 public.h文件:

#ifndef _public_H
#define _public_H

#include "reg52.h"

//对系统默认的数据类型进行重定义
typedef unsigned char u8;
typedef unsigned int  u16;
typedef unsigned long u32;

void delay_10us(u16 time_num_us);
void delay_ms(u16 time_num_us);

#endif

2.5 lcd12864.c文件:

#include "lcd12864.h"

//LCD12864写命令函数定义
void lcd12864_write_cmd(u8 cmd)
{
    LCD12864_RS = 0; //选择命令
    LCD12864_RW = 0; //选择写
    LCD12864_EN = 0;
    LCD128604_PORT = cmd; //准备命令
    delay_ms(1);
    LCD12864_EN = 1; //使能脚E线上升沿写入
    delay_ms(1);
    LCD12864_EN = 0; //使能脚负跳变实现完成写入
}

//LCD12864读数据函数定义
void lcd12864_write_data(u8 dat)
{
    LCD12864_RS = 1; //选择命令
    LCD12864_RW = 0; //选择写
    LCD12864_EN = 0;
    LCD128604_PORT = dat; //准备命令
    delay_ms(1);
    LCD12864_EN = 1; //使能脚E线上升沿写入
    delay_ms(1);
    LCD12864_EN = 0; //使能脚负跳变实现完成写入
}

//LCD12864初始化函数定义
void lcd12864_init(void)
{
    LCD12864_PSB = 1; //选择8为或者4位并口方式
    lcd12864_write_cmd(0x01);//清屏
    lcd12864_write_cmd(0x30);//功能设定,选择8为接口,基本指令集
    lcd12864_write_cmd(0x06);//进入设定点,游标右移1
    lcd12864_write_cmd(0x0c);//显示状态开关设置,整体显示开    
}

//LCD12864清屏函数定义
void lcd12864_clear_screen(void)
{
    lcd12864_write_cmd(0x01);//清屏
}

//LCD12864显示字符串函数定义
void lcd12864_show_string(u8 x,u8 y,u8 *str)
{
    if(y<=0)y=0;
    if(y>3)y=3;
    x&=0x0f; //限制 x,y 不能大于显示范围
    
    switch(y)
    {
        case 0: x|=0x80;break;//第 1 行地址+x 的偏移
        case 1: x|=0x90;break;//第 2 行地址+x 的偏移
        case 2: x|=0x88;break;//第 3 行地址+x 的偏移
        case 3: x|=0x98;break;//第 4 行地址+x 的偏移    
    }
    lcd12864_write_cmd(x);
    while(*str != '\0')
    {
       lcd12864_write_data(*str);
        str++;    
    }    
}

2.6  lcd12864.h文件:

#ifndef _lcd12864_H
#define _lcd12864_H

#include "public.h"

sbit LCD12864_EN = P2^7;
sbit LCD12864_RS = P2^6;
sbit LCD12864_RW = P2^5;

sbit LCD12864_PSB = P3^2;

#define LCD128604_PORT P0

void lcd12864_init(void);
void lcd12864_clear_screen(void);
void lcd12864_show_string(u8 x,u8 y,u8 *str);

#endif

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

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

相关文章

5-51单片机-蜂鸣器实验

一 主要涉及到的知识点: 1. 对系统默认的数据类型进行重定义,u8,u16; 2.延时函数,主要是将传过来的整数进行减减实现延时; 3.还用到了while()循环; 二 代码分析: 1. 首次定义一个变量,主要是为了延时蜂鸣器响亮的时长; 2.通过while()循环,使得Buzzer_Port产生脉冲信号,从而使蜂…

python-numpy(3)-线性代数

一、方程求解 参考资料 对于Ax b 这种方程&#xff1a; np.linalg.inv(A).dot(B)np.linalg.solve(A,b) 1.1 求解多元一次方程一个直观的例子 # AXB # X A^(-1)*B A np.array([[7, 3, 0, 1], [0, 1, 0, -1], [1, 0, 6, -3], [1, 1, -1, -1]]) B np.array([8, 6, -3, 1]…

嵌入式单片机 TTL电平、232电平、485电平的区别和联系

一、简介 TTL、232和485是常见的串口通信标准&#xff0c;它们在电平和通信方式上有所不同&#xff0c; ①一般情况下TTL电平应用于单片机外设&#xff0c;属于MCU/CPU等片外外设&#xff1b; ②232/485电平应用于产品整体对外的接口&#xff0c;一般是片外TTL串口转232/485…

【C语言】每日一题,快速提升(1)!

调整数组使奇数全部都位于偶数前面 题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分 所有偶数位于数组的后半部分 解题思路&#xff1a; 给定两个下标left和right&#xff0c;left放在数组的起始…

Linux三剑客-sed、awk、egrep(上)

一、知识梗概 二、正则表达式 定义&#xff1a;正则表达式是一种强大的文本处理工具&#xff0c;用于在文本中搜索符合特定模式的字符串。它由一系列特殊字符和普通字符组成&#xff0c;可以定义复杂的搜索模式。正则表达式被广泛应用于各种编程语言和文本处理工具中。 简单来…

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件&#xff1a; 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊&#xff0c;除了使用loader外&#xff0c;还使用了plugin const path require("path"); const { VueLoaderPlugin …

涂层翅片铝箔的主要技术指标

涂层铝箔是在非涂层铝箔的基础上进行表面处理后形成的&#xff0c;除了需要具备非涂层铝箔要求的化学成分、机械性能和几何尺寸等性能指标外&#xff0c;还应具备良好的板型和涂层性能。 1、铝箔的板型 涂层铝箔的生产工艺要求铝箔要有良好的板型&#xff0c;这是涂层铝箔生产…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

做一个后台项目的架构

后台架构的11个维度 架构1&#xff1a;团队协助基础工具链的选型和培训架构2&#xff1a;搭建微服务开发基础设施架构3&#xff1a;选择合适的RPC框架架构4&#xff1a;选择和搭建高可用的注册中心架构5&#xff1a;选择和搭建高可用的配置中心架构6&#xff1a;选择和搭建高性…

(七)C++自制植物大战僵尸游戏关卡数据加载代码讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 打开LevelData.h和LevelData.cpp文件。文件位置如下图所示。 LevelData.h 此头文件中定义了两个类&#xff0c;分别是OpenLevelData、LevelData&#xff0c;其中OpenLevelData用于加载文件数据。LevelData解析数据…

vue中预览docx、xlsx、pptx、pdf

前言&#xff1a;其实本来是要做全类型文件预览的&#xff0c;但是一直找不到合适的doc,xlx,ppt预览插件。要是有可以使用的&#xff0c;可以评论推荐给我 我使用的node版本&#xff1a;v18.19.1 参考官网&#xff1a;preview 文件预览 | ran 引入方式&#xff1a; //安装组…

学习笔记之——3DGS-SLAM系列代码解读

最近对一系列基于3D Gaussian Splatting&#xff08;3DGS&#xff09;SLAM的工作的源码进行了测试与解读。为此写下本博客mark一下所有的源码解读以及对应的代码配置与测试记录~ 其中工作1~5的原理解读见博客&#xff1a; 学习笔记之——3D Gaussian Splatting及其在SLAM与自动…

Qt 中默认代码

目录 主函数 widget的声明 widget的定义 form file .pro 文件 主函数 #include "widget.h" ​ #include <QApplication> ​ int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 上面就是 Qt 刚创建的一…

非关系型数据库(缓存数据库)redis的集群

目录 一.群集模式——Cluster 1.原理 2.作用 3.特点 4.工作机制 哈希槽 哈希槽的分配 哈希槽可按照集群主机数平均分配&#xff08;默认分配&#xff09; 根据主机的性能以及功能自定义分配 redis集群的分片 分片 如何找到给定key的分片 优势 二. 搭建Redis群集…

JVM虚拟机(五)强引用、软引用、弱引用、虚引用

目录 一、强引用二、软引用三、弱引用四、虚引用五、总结 引文&#xff1a; 在 Java 中一共存在 4 种引用&#xff1a;强、软、弱、虚。它们主要指的是&#xff0c;在进行垃圾回收的时候&#xff0c;对于不同的引用垃圾回收的情况是不一样的。下面我们就一起来看一下这 4 种引用…

基于R语言实现的负二项回归模型【理解与实现】-理解负二项回归模型和泊松回归模型之间的区别

前言 我们可以在R语言中使用MASS包中的glm.nb函数来拟合负二项模型&#xff0c;以及使用glm函数来拟合泊松模型。以下是一个详细的过程&#xff0c;包括模拟数据的生成、模型的拟合、结果的比较和解释。 需要的包 if (!require("MASS")) install.packages("M…

Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)

文章目录 IP 地址基本概念源IP地址 & 目的IP地址 MAC 地址基本概念源MAC地址 & 目的MAC地址 端口号基本概念源端口号 & 目的端口号 TCP & UDP 协议基本概念TCP 与 UDP 的抉择 网络字节序大端、小端字节序 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alask…

YOLOv8模型剪枝实战:DepGraph(依赖图)方法

课程链接&#xff1a;YOLOv8模型剪枝实战&#xff1a;DepGraph(依赖图)方法_在线视频教程-CSDN程序员研修院 YOLOv8是一个当前非常流行的目标检测器&#xff0c;本课程使用DepGraph&#xff08;依赖图&#xff09;剪枝方法对YOLOv8进行网络剪枝&#xff0c;使其更加轻量和实用…

Qt快速入门(MV架构之TableView + QStandardItemModel + 自定义代理小案例)

Qt快速入门&#xff08;MV架构之TableView QStandardItemModel 自定义代理小案例&#xff09; 关于MV架构的简单介绍 在Qt框架中&#xff0c;代理&#xff08;Delegate&#xff09;、模型&#xff08;Model&#xff09;和视图&#xff08;View&#xff09;之间的关系构成了…

51单片机实验03-单片机定时/计数器实验

目录 一、实验目的 二、实验说明 1、51单片机有两个16位内部计数器/定时器&#xff08;C/T&#xff0c; Counter/Timer&#xff09;。 2、模式寄存器TMOD 1) M1M0工作模式控制位&#xff1b; 2) C/T定时器或计数器选择位&#xff1a; 3&#xff09;GATE定时器/计数器运行…