51单片机实现SMC1602液晶屏显示实例

————————————————————————————————————————————

LCD1602

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  • 1602的意思是每行显示16个字符,一共可以显示两行。如果是12232液晶(图形型液晶)则表示由122列32行组成,即共有122*32个点
  • p.s.注意使用温度,通常液晶的工作范围为0~+55℃,存储温度范围为-22~+60℃。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

引脚情况:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

基本操作时序:


状态


输入


输出


读状态

  • RS=0
  • R/W=1
  • E=1
  • D0~D7=状态字

读数据

  • RS=1
  • R/W=1
  • E=1
  • D0~D7=数据

写指令

  • RS=0
  • R/W=0
  • E=1
  • D0~D7=指令码
  • E=1


写数据

  • RS=1
  • R/W=0
  • E=1
  • D0~D7=数据
  • E=1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RAM内部映射:80个字节

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

状态字说明://状态字反应了当前液晶屏的情况,当STA7为1时说明显示器正在忙碌状态,不可进行操作

  • STA0~STA6表示当前地址指针的数值
  • STA7表示读/写使能,=1表示进制,=0表示允许

    p.s.原则上每次对控制器读写操作之前都必须进行读写检测,确保STA7=0,实际操作中由于单片机操作速度慢于液晶控制的反应速度,可以不进行读写检测而只进行简短的延时。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

数据指针设置:

用户可以通过以下的数据地址指针访问内部的80个字节RAM,用来设置数据地址

80H+地址码(0~27H,40~67H)

例:对第一个地址进行操作,0x80+0x01

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

其他指令码:


01H


显示清屏(数据指针清零,所有显示清零)


02H


显示回车(数据指针清零)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

初始化:

  • 显示模式设置:38H

  • 显示开/关及光标设置

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

读写操作时序:

  • 读操作

  • 写操作

  • 操作时间参数

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

操作方式:

  • 对LCD的操作可以分为数据和指令两部分。
  • 通过操作RS,R/W,E,执行四种操作:读状态,读数据,写指令,写数据
  • D0~D7用来输入输出指令码和数据

————————————————————————————————————————————

LCD1602使用实例:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

设计要求:

使用LCD1602显示两行字符,显示两行字,两个按键控制着显示或清屏

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

设计思路:

  • 初始化液晶显示屏 //参照上文"初始化"

    • 打开使能
    • 指令码操作
      • 设置16*2显示,5*7点阵,8位数据结构
      • 开显示,显示光标,不闪烁
      • 读写完字符后地址指针+1,光标+1,整屏显示不移动
      • 清屏
      • 设置地址显示的首字符
  • 初始化中断
    • 打开中断
    • 外部中断0和1
  • 死循环等待中断
  • 按键中断
    • 按键"显示"

      • 循环写入数据(字符数组)
      • 指令"换行"
      • 循环写入第二行数据
    • 按键"清屏"
      • 指令"清屏"
  • 子函数 //参照上文"读写操作时序表"
    • 写数据
    • 写指令

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

实现代码:

 1 #include <reg52.h>
 2 typedef unsigned char uchar;
 3 sbit en = P3 ^ 4;
 4 sbit rs = P3 ^ 5;
 5 uchar code table1[] =
 6 {
 7     "SMC1602 0x01..."
 8 };
 9 uchar code table2[] =
10 {
11     "      Hugh Dong."
12 };
13 void Delay(uchar m)
14 {
15     uchar i, j;
16     for (i = m; i > 0; --i)
17         for (j = 110; j > 0; --j);
18 }
19 /* 写数据 */
20 void write_date(uchar date)
21 {
22     //参考写操作时序图
23     rs = 1; //RS高电平,写数据
24     P2 = date; //写入数据,对应时序图t_SP2数据建立
25     Delay(5);
26     en = 1; //打开使能,给E一个高脉冲,开始写入数据
27     Delay(5);
28     en = 0; //关闭使能,写入数据完成
29 }
30 /* 写指令 */
31 void write_com(uchar com)
32 {
33     //基本原理同写数据
34     rs = 0; //RS低电平,写指令
35     P2 = com;
36     Delay(5);
37     en = 1;
38     Delay(5);
39     en = 0;
40 }
41 /* 初始化LCD */
42 void Init()
43 {
44     en = 1;
45     write_com(0x38); //00111000 设置16*2显示,5*7点阵,8位数据接口
46     write_com(0x0E); //00001110 开显示,显示光标,不闪烁
47     write_com(0x06); //00000110 读写字符后地址指针+1,光标+1,屏幕不移动
48     write_com(0x01); //清屏
49     write_com(0x80 + 0x01); //设置数据地址指针从第一个开始
50 }
51 int main()
52 {
53     /* 初始化LCD */
54     Init();
55     Delay(100);
56     /* 初始化中断 */
57     EA = 1;
58     EX0 = 1;
59     EX1 = 1;
60     /* 死循环 */
61     while(1);
62 }
63 void Display()interrupt 0 using 1
64 {
65     uchar i;
66     for (i = 0; i < 16; ++i) //遍历逐个写入第一行数据
67     {
68         write_date(table1[i]);
69         Delay(20);
70     }
71     write_com(0x02); //换行
72     write_com(0x80 + 0x40); //数据地址指针指向第二行
73     for(i = 0; i < 16; ++i) //逐个遍历写入第二行数据
74     {
75         write_date(table2[i]);
76         Delay(20);
77     }
78 }
79 void Clear() interrupt 1 using 1
80 {
81     write_com(0x01);
82 }
时间: 2024-11-27 00:08:54

51单片机实现SMC1602液晶屏显示实例的相关文章

图形化编程娱乐于教,Kittenblock arduino实例,液晶屏显示

跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知识.会陆续分享图形化编程的经验,希望能够做成一个专题.如果您觉得有用,就给点个赞吧.涉及的软件包括Kittenblock.arduino. 程序解读:数码管计时器,通过延迟时间为一秒,变量加1,完成记录时间 知识点:液晶屏显示,arduino,执行器,结构 重点:液晶屏显示 涉及的软件:Kitten

基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目

一.前言 1.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路 2.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目构思 (1).声明程序变量思维导图 (2).程序子函数思维导图 (3).程序主函数思维导图 二.基于51单片机DS18B20测温LCD1602显示可设时设温调时的项目的Keil软件编写的单片机C语言程序 1 #include<reg52.h>//声明51单片机

STM32 液晶屏 显示字符串 中遇到的一个问题

用STM32控制液晶屏显示电流.电压参数. 我希望的结果是这样的: 可是,实际写出来的效果是这样的. 可以看出,电流参数那一行后面多出了几个字符"Volta",刚好是要下一行需要显示内容的前面一部分. 试着把电流参数值得位数改短一些,比如把前面的20.54改为2.54.显示出来就是正常的.由此想到这个问题的产生可能和要显示的字符串的长度有关.所以就把跟电流显示的相关的代码都看了看,从定义到调用液晶模块的API. char Current_display[15];// 定义一个与电流参数

51单片机A/D转换器实现数字电压表实例

-------------------------------------------- ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 工作原理: ADDA/ADDB/ADDC 输入3位地址,并使ALE=1,将地址存入地址锁存器中 A

i.mx6 lvds接口的DE模式液晶屏驱动调试

我这篇文章主要讲述i.mx6 平台下 采用DE模式的lvds液晶屏的驱动调试, 阅读该文章之前请先阅读如下两篇我转载的文章,这两篇文章是理解我这篇文章的基础知识. 1.        lcd fb参数如何计算: http://blog.csdn.net/liuhuahan/article/details/43447657 2.        camera_lcd之DE和HV模式区别 http://blog.csdn.net/liuhuahan/article/details/43489269 详

基于51单片机的温度控制系统毕设

分享一下单片机毕设课程计参考资料33个,献给大四的朋友,毕业设计就不用愁了,如果有什么不懂的地方可以加群大家一起交流:813238832资料下载的地址:https://bbs.usoftchina.com/thread-208012-1-1.html 1.CDMA通信系统中的接入信道部分进行仿真与分析2.USB接口设计3.毕业设计(论文)OFDM通信系统基带数据4.电气工程系毕业设计开题报告5.电信运营商收入保障系统设计与实现6.基于51单片机的16×16点阵(滚动显示)7.基于51单片机的LE

51单片机学习笔记【五】——1602液晶屏

一.1602液晶屏基础 1.LCD1602简介 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号的点阵型液晶模块.它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片.本次使用型号为SMC1602A LCM的液晶屏. 2.LCD1602接口信号说明 3.控制接口说明 4.指令说明 二.实验例程 1.电路原理图 2.实验说明 本实验通

电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS1302+DS18B20+按键等模块.各个的模块就不在一一介绍,直接讲解这个系统的功能,首先是四个按键,第一个按键是选中需要修改时间位置,在按一次选中下一个,依次类推,第二个按键是对数值进行加一,第三个按键对数值进行减一,第四个按键确认. 先放仿真图 然后是代码: main.c #include <REG52.H> #include <intrins.h> #defin

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码实现触摸屏(串口屏)与单片机的通讯,主要是解决通讯协议的问题.本文使用开放的Modbus通讯协议,以广州易显的HMImaker触摸屏作主机(Master),单片机作从机(Slaver).HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了.触摸屏与单片机之间采用RS-485标准接口直接连接,与多台51单片机MODBUS RTU多机串口通信一.包括如下实例:二