STC51入门笔记(郭天祥C语言)

您所在的位置:网站首页 mcu屏幕是什么意思 STC51入门笔记(郭天祥C语言)

STC51入门笔记(郭天祥C语言)

2024-03-08 12:49| 来源: 网络整理| 查看: 265

       声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。 作者:sumjess 一、液晶概述:

       液晶(LiquidCrystal) 是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。        液晶显示器(LiquidCrystalDisplay,LCD)的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。为叙述简便,通常把各种液晶显示器都直接叫做液晶。        各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名的。比如:1602的意思是每行显示16个字符,一共可以显示两行;类似的命名还有0801, 0802,1601等,这类液晶通常都是字符型液晶,即只 能显示ASCII码字符,如数字、大小写字母、各种符号等。12232液晶属于图形型液晶,她的意思是液晶由122列、32行组成,即共有122X32个点来显示各种图形,我们可以通过程序控制这122X32个点中的任一个点显示或不显示。类 似的命名还有12864,19264,192128,320240等,根据客户需要,厂家可以设计出任意数组合的点阵液晶。        液晶体积小、功耗低、显示操作简单,但是它有一个致命的弱点,其使用的温度范围很窄,通用型液晶正常工作温度范围为0°C+55°C,存储温度范围为-20°C+60°C,即使是宽温级液晶,其正常工作温度范围也仅为-20°C+70°C,存储温度范围为-30°C+80°C,因此在设计相应产品时,务必要考虑周全,选取合适的液晶。        本章主要介绍三种具有代表性的常用液晶,同时详细讲解并行操作方式和串行操作方式。市场上使用的1602液晶以并行操作方式居多,但也有并、串口同时具有的,用户可以选择用并口或串口操作。12232液晶同样也有这两种操作方式。只有并行接口的1602液晶接口如图7.1.1所示,其显示状态如图7.1.2所示。并、串口兼有的12232液晶接口如图7.1.3所示,其显示状态如图7.1.4所示 在这里插入图片描述 在这里插入图片描述        12864液晶串行接口与并行接口共用,用户可选择其中一种方式操作,其接口图如图7.1.5所示,其显示状态如图7.1.6所示。 在这里插入图片描述

二、常用1602液品操作实例:

       1602液晶的讲解以并行操作为主,设计两个程序,一个是在液晶的任意位置显示字符,另一个是滚动显示一串字符。        本教材实验使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASCII字符集字库,只 有并行接口,无串行接口。 1、接口信号说明        1602型液晶接口信号说明如表7.2.1所示。 在这里插入图片描述 2、主要技术参数(见表 7.2.2 ) 在这里插入图片描述 3、基本操作时序 读状态 输入:RS=L, R/W=H, E=H 输出:D0~D7=状态字。 读数据 输入:RS=H, R/W=H, E=H 输出:无。 写指令 输入:RS=L, R/W=L, D0~D7=指令码,E=高脉冲 输出:DO, D7=数据。 写数据 输入:RS=H, R/W=L, D0~D7=数据, E=高脉冲 输出:无。 4、RAM地址映射图 控制器内部带有80B的RAM缓冲区,对应关系如图7.2.1所示。 在这里插入图片描述        当我们向图7.2.1中的000F、404F地址中的任一处写入显示数据时,液晶都可立即显示出来,当写入到1027或5067地址处时,必须通过移屏指令将它们移入可显示区域方可正常显示。 5、状态字说明(见表7.2.3) 在这里插入图片描述        注意:原则上每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不进行读/写检测,或只进行简短延时即可。

6、数据指针设置 控制器内部设有一个数据地址指针,用户可以通过它们访问内部的全部80B的RAM,如表7.2.4所示。 在这里插入图片描述 7、其他设置(见表 7.2.5 ) 在这里插入图片描述 8、初始化设置        (1) 显示模式设置(见表 7.2.6) 在这里插入图片描述        (2) 显示开/关及光标设置(见表 7.2.7) 在这里插入图片描述 9、写操作时序(见图 7.2.2)        分析时序图可知操作 1602液晶的流程如下: (1) 通过RS 确定是写数据还是写命令。写命令包括使液晶的光标显示/不显 示、光标闪烁/不闪烁、需/不需要移屏、在液晶的什么位置显示,等等。写数据是指要显示什么内容。 在这里插入图片描述 (2) 读/写控制端设置为写模式,即低电平。 (3) 将数据或命令送达数据线上。 (4) 给E一个高脉冲将数据送入液晶控制器,完成写操作。 关于时序图中的各个延时,不同厂家生产的液晶其延时不同,我们无法提供准确数据,大多数基本都为纳秒级,单片机操作最小单位为微秒级,因此我们在写程序时可不做延时,不过为了使液晶运行稳定,最好做简短延时,这需要大家自行测试以选定最佳延时。 TX-1C实验板上1602液晶与单片机接口如图7.2.3所示。 在这里插入图片描述 接口说明如下: (1) 液晶1,2端为电源;15,16为背光电源;为防止直接加5V电压烧坏背光灯,在15脚串接一个10Ω电阻用于限流。 (2) 液晶3端为液晶对比度调节端,通过一个10kΩ电位器接地来调节液晶显示对比度。首次使用时,在液晶上电状态下,调节至液晶上面一行显示出黑色小格为止。 (3) 液晶4端为向液晶控制器写数据/写命令选择端,接单片机的P3.5口。 (4) 液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入命令和显示数据,因此此端始终选择为写状态,即低电平接地。 (5) 液晶6端为使能信号,是操作时必需的信号,接单片机的P3.4口。 【例7.2.1】用C语言编程,实现在1602液晶的第一行显示"123456789Sumjess",在第二行显示" 1 00:00:00 "。新建文件Sumjess2.5_1.c,程序代码如下:

#include //编译器自带的库用 < > 编译器包含C52的定义 #include //编译器自带的库用 < > 循环移位函数等 #include //编译器自带的库用 < > 标准输入输出函数 #include //编译器自带的库用 < > C语言标准库函数 #include "delay_Sum.h" //后加的库用 “ ” 延时函数、显示器延时函数 #include "74hc595_Sum.h" //后加的库用 “ ” 74hc595芯片操作 #include "boardinit_Sum.h" //后加的库用 “ ” 数码管硬件芯片定义 #include "1602_Sum.h" //后加的库用 “ ” 1602函数 void main() { char e[16]={"123456789Sumjess"}; uchar m=0; boardinit(); //数码管硬件初始化 lcdinit_1602(); //1602初始化 while(1) { m=rand(); Disp_1602(1,1,e,16); Disp_1602(1,2," 00:00:00 ",16); write_twoline_1602(2,(int)m); delay(1000); } }

库函数如下:

/* * 文 件 名:1602led.c.c * 芯 片:1602液晶 * 晶 振:11.0592MHz * 创 建 者:XK * 创建日期:2011.8.6 * 修 改 者: * 修改日期: * 功能描述:1602,写数据函数 */ #include #include "1602_Sum.h" #include "delay_Sum.h" #include "74hc595_Sum.h" sbit rs_1602=P2^5; //1602rs信号 sbit rw_1602=P2^6; //1602rw信号 sbit e=P2^4; /* void write_zl(uchar zl) { rs=0; P0=zl; delay(5); e=1; delay(5); e=0; } void write_sj(uchar sj) { rs=1; P0=sj; delay(5); e=1; delay(5); e=0; } */ void write_order_1602(uchar order_data) { e=0; rs_1602=0; P0=order_data; e=1; delay(1); e=0; } void write_data_1602(uchar data_1602) { e=0; rs_1602=1; P0=data_1602; e=1; delay(1); e=0; } / //功能:按指定位置显示一串字符 /// //输入: //列显示地址x_1602(取值范围1-16) //行显示地址y_1602(取值范围1-2), //指定字符串指针*p_1602, //要显示的字符个数count_1602 (取值范围1-16) /// // 子函数使用例子: Disp_1602(1,1," TEMP: . ",16); //在1602第一行第一列写16个字符,既字符串数据 / void Disp_1602(unsigned char x_1602,unsigned char y_1602,unsigned char *p_1602,unsigned char count_1602) { unsigned char i; for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3