第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》
实验准备
课程内容
第七课 控制液晶屏LCD1602
实验准备:
LCD1602 面包板 杜邦线
电阻:10k 8只 或排阻(用于P0上拉)
(或直接使用完整的开发板)
课程内容:
一、 原理图与接线
这里分析下 几个接口信号 V0、RS、RW、EN 表示的意义:
3脚:V0,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。
4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。
5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。
6脚:E,使能信号(LCDE),其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。
7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。
还有就是在单片机开发板上的接线:数据线接P0,控制线用P2中的三个IO
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EP = P2^7;
二、 底层操作
写命令 RS=L,RW=L,D0—D7=命令,EN=高脉冲 H
写数据 RS=H,RW=L,D0—D7=数据,EN=高脉冲H
三、 时序图
这节课引入时序图,其他器件类似,只要看懂时序图,就可以通过编程轻松控制这些器件按自己的需求工作,注意时间轴从左往右。
我们先不读出它的数据的状态或者数据本身。所以只需要看两个写时序:
① 当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
② 当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。
操作步骤:(要对照时序图)
1) RS 确定 写数据还是命令
2) RW写模式 给0
3) P0 放数据或命令,延时5微秒
4) EN 给 1 延时5微秒 再给0 (即是给了脉冲)
这个表的命令也不需要记,在下面例程中LCD初始化部分就有厂家提供的代码.
还有下表是控制操作需要消耗的时间:ns表示纳秒
四、 按时序图编程
一个 _nop_(); 大约1微秒
void lcd_cmd(BYTE cmd)
{ // 写入指令数据到LCD
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
P0 = cmd;
_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_EP = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_EP = 0;
}
void lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_EP = 1;
_nop_();_nop_();_nop_();_nop_();_nop_();
LCD_EP = 0;
}
void lcd_init()
{ //LCD初始化设定
lcd_cmd(0x38); //16*2显示,5*7点阵,8位数据
lcd_cmd(0x0c); //显示开,关光标
lcd_cmd(0x06); //移动光标
lcd_cmd(0x01); //清除LCD的显示内容
}
BYTE code dis1[] = {" WELCOME TO "}; //要放最前面定义
BYTE code dis2[] = {" My C51 "};//要放最前面定义
main()
{
BYTE i;
lcd_init(); // 初始化LCD
delay(10);
while(1)
{
lcd_wcmd(0x06); //向右移动光标
lcd_ wcmd (0x80); //设置显示位置为第一行的第1个字符
i = 0;
while(dis1[ i ] != '\0') // \0 是C语言中字符串最后一个字符
{ //显示字符"WLCOME TO"
lcd_wdat(dis1[ i ]);
i++;
}
lcd_ wcmd (0x80+0x40); //设置显示位置为第二行第1个字符
i = 0;
while(dis2[ i ] != '\0')
{
lcd_wdat(dis2[ i ]); //显示字符" My C51"
i++;
delay(30); //控制两字之间显示速度
}
}
}
可以修改程序 让向左显示 ,或者移出移入
可以在在程序 中 需要的位置加入 延时 让数据稳定
五、增补C语言基础--数组
简单理解:数组是同种类型元素的集合。(特别注意:同种类型)
1. 一维数组定义
int a[10];
这样我们便定义了一个数组a,它分配10个int类型空间。
2.数组的初始化
例程中:
BYTE code dis1[] = {" WELCOME TO "};
定义了一个类型为 BYTE code 的数组,同时做初始化,这数组的各个元素都是一个字符,其中有空格,字母.
3.数组元素的访问
访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,C语言并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界。
例子:
int a[10];
int i;
for (i = 0; i < 10; i++)
{
a[i] = i + 1;
}
至于二维数组,简单可理解为一个XX行YY列的表格,本教程现时还没有用到,所以暂时不作详解.
c语言教程第一课 建立你的第一个KeilC51项目
随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。使用C51肯定要使用到编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。本站提供的单片机c语言教程都是基于keilc51的。
下面结合8051介绍单片机C语言的优越性:
·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;
·不懂得单片机的指令集,也能够编写完美的单片机程序;
·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;
·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;
·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;
·提供small、compact、large等编译模式,以适应片上存储器的大小;
·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;
·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏
·提供常用的标准函数库,以供用户直接使用;
·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;
·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;
以上简单介绍了 KEILC51 软件,要使用KEILC51软件,必需先要安装它,这也是学习单片机编程语言所要求的第一步――建立学习环境。
本站提供无限制版的keil c51下载(此处)(安装的方法在压缩包内有详细说明,这里就不做介绍了)
安装好后,您是不是想建立自己的第一个单片机C语言程序项目呢?下面就让我们一起来建立一个小程序吧,请根据教程一步步的来,你绝对可以在短时间内熟悉c51的。
首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:
(1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1-2。接着弹 出一个标准 Windows 文件对话窗口,如图 1-3。在“文件名”中输入您的第一个 C 程序项 目名称,这里我们用“test”。“保存”后的文件扩展名为 uv2,这是 KEIL uVision2 项目文件扩展名,以后能直接点击此文件以打开先前做的项目。
图 1-2 New Project 菜单
图 1-3 文件窗口
(2)选择所要的单片机,这里选择常用的 Ateml 公司的 AT89c51。而且本单片机c语言教程里的大部分程序都是基于此芯片的,此时屏幕如图 1-4 所示。AT89c51 有什么功能、特点呢?看图中右边有简单的介绍。完成上面步骤后,就可 以进行程序的编写了。
(3)首先在项目中创建新的程序文件或加入旧程序文件。如果您没有现成的程序,那 么就要新建一个程序文件。在 KEIL 中有一些程序的 Demo,在这里我们还是以一个 C 程序 为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。点击图 1-5 中 1 的新建文 件的快捷按钮,在 2 中出现一个新的文字编辑窗口,这个操作也能通过菜单 File-New 或 快捷键 Ctrl+N 来实现。好了,现在能编写程序了。下面是经典的一段程序,呵,如果您看过别的程序书也许也有类似的程序:
#include <AT89X51.H>
#include <stdio.h>
void main(void)
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数
TH1 = 0xE8;//11.0592MHz 1200波特率
TL1 = 0xE8;
TI = 1;
TR1 = 1; //启动定时器
while(1)
{
printf ("Hello World!\n"); //显示Hello World
}
}
图 1-4 选取芯片
图 1-5 新建程序文件
这段程序的功能是不断从串行口输出“Hello World!”字符,先不管程序的语法和意思吧,先 看看如何把它加入到项目中和如何编译试运行。
(4)点击图 1-5 中的 3 保存新建的程序,也能用菜单 File-Save 或快捷键 Ctrl+S
进行保存。因是新文件所以保存时会弹出类似图 1-3 的文件操作窗口,把第一个程序命名
为 test1.c,保存在项目所在的目录中,这个时候您会发现程序单词有了不一样的颜色,说明 KEIL的C语言语法检查生效了。如图 1-6 鼠标在屏幕左边的 Source Group1 文件夹图标上右击弹出 菜单,在这里能做在项目中增加减少文件等操作。选“Add File to Group ‘Source Group 1’” 弹出文件窗口,选择刚刚保存的文件,按 ADD 按钮,关闭文件窗,程序文件已加到项目中了。这个时候在 Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它能展开查看。
图 1-6 把文件加入到项目文件组中
(5)C程序文件已被加到了项目中了,下面就剩下编译运行了。这个项目只是用做学 习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置,它不会生成用 于芯片烧写的 HEX 文件。先来看图 1-7 吧,图中 1、2、3 都是编译按钮,不一样是 1 是用 于编译单个文件。2 是编译链接当前项目,如果先前编译过一次之后文件没有做动编辑改动, 这个时候再点击是不会再次重新编译的。3 是重新编译,每点击一次均会再次编译链接一次,不 管程序是否有改动。在 3 右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮 才会生效。5 是菜单中的它们。在 4 中能看到编译的错误信息和使用的系统资源情况等, 以后我们要查错就靠它了。6 是有一个小放大镜的按钮,这就是开启\关闭调试模式的按钮, 它也存在于菜单 Debug-Start\Stop Debug Session,快捷键为 Ctrl+F5。
图 1-7 编译程序
(6)进入调试模式,软件窗口样式大致如图 1-8 所示。图中 1 为运行,当程序处于停止 状态时才有效,2 为停止,程序处于运行状态时才有效。3 是复位,模拟芯片的复位,程序 回到最开头处执行。按 4 能打开 5 中的串行调试窗口,这个窗口能看到从 51 芯片的串 行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中也有。首 先按 4 打开串行调试窗口,再按运行键,这个时候就能看到串行调试窗口中不断的打印“Hello World!”。最后要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启\关闭调试 模式按钮。然后就能进行关闭 KEIL 等相关操作了。
图 1-8 调试运行程序
最新电子行业资讯、教程以及开发板样片申请,请关注“云汉电子社区”官方微信公众号ickeybbs
相关问答
c51单片机 编程?南邻更可念,布破冬未赎。白毛浮绿水,红掌拨清波。窗含西岭千秋雪,门泊东吴万里船。月下飞天镜,云生结海楼。月出惊山鸟,时鸣春涧中.千山鸟飞绝,万径人...
一个 c51 程序只能有一个什么?一个c51程序只能有一个主函数。对于一个C51单片机的应用code有且只能有一个mian主函数,因为编译器需要识别主函数入口,并编译成二进制程序的入口,程序开始运...
请教各位大虾! c51单片机 中while(1)的用法?while(1){}的话,就是不断执行大括号里的程序;while(1);的话就是程序到此停止,后面的不再执行了,除了中断,再也不动了,就一个分号的区别,分号干掉就...while(...
C51单片机 计时器50ms程序编写?12MHz晶振,经典51核是12分频,因此时钟周期为1μs。50ms=50000μs,因此定时器累加至溢出需要50000个周期。因此65536-50000=15536=0x3CB0因此TH0=0x3C...
C51单片机 中有源蜂鸣器的程序肿么写啊,还有就是,有源蜂鸣器...由于单片机驱动能力有限,常常连接三极管驱动蜂鸣器。这得看三极管的型号,不同的型号程序稍有不同。主要是设置是“1”还是“0”驱动,这得看你的电路的连接。...
c51单片机 对p1口的操作是读还是写操作?51单片机很简单的啊,读的话,直接设置一个变量,比如:unsignedchari;i=P1;直接把P1口的数据给变量,即完成了对P1口的读数据。如果要输出数据;unsigned...
c51 变量定义的四个要素?[存储种类]数据类型[存储类型]变量名其中:存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。数据类...
一个 c51单片机 怎么有人说有4个io口,有人说32个io口,到底多少...[最佳回答].一共有32个IO口,分四个组!所以一组是8个!(这里指的是AT89S51等)AT892051的IO口是少点!
c51单片机 sp口是哪个?是c51单片机的SPI接口,sp是是栈指针。SPI接口,串行外设接口(SerialPeripheralInterface),一种同步外设接口,它可以便单片机与各种外围设备以串行方式进行...
怎么在 单片机C51 语言中使用AT指令?1.首先,需要将AT指令封装成一个函数,该函数需要能够处理应答,并解析应答结果。2.将AT指令封装为一个函数后,就可以在C51程序中使用该函数了,根据...1.首...