一、实验目的:
(一)熟悉 LCD1602 与单片机的电路连接;
(二)熟悉 LCD1602 的引脚功能;
(三)掌握 LCD1602 的时序;
(四)掌握单片机对 LCD1602 的控制方法。
二、主要仪器设备及耗材:
(一)电脑一台;
(二)单片机开发板一套。
三、实验原理
(一)控制器接口说明
1.基本操作时序
(1)读状态:输入:RS=L,RWH,E=H 输出:D0~D7=状态字
(2)写指令:输入:RS=L,RW=L,D0D7=指令码,E=高脉沖输出:无
(3)读数据:输入:RSH,RW=H,E=H 输出:D0~D7=数据
(4)写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲输出:无 2.RAM 地址映射图 控制器內部带有 80X8 位(80 字节)的 RAM 缓沖区,对应关系如图 7.1 所 示
(二)LCD1602 电路原理图 LCD1602 电路原理图如图 7.2 所示。
四、实验内容及步骤
(一)实验内容 利用所学的单片机知识LCD1602的知识及电路知识编程实现单片机I/O 口 LCD1602 的显示。
编程实现 LCD1602 第一行显示“My name is XXX”,第 二行示“Number:XXX”。
(二)实验步骤 1.根据电路原理图编写 C 程序,调试并烧写入单片机;
#include <reg51.h>
/*
1.基本操作时序
(1) 读状态:输入:RS=L, RW=H, E=H 输出:D0~D7=状态字
(2) 写指令:输入:RS=L, RW=L, D0D7=指令码, E=高脉沖 输出:无
(3) 读数据:输入:RS=H, RW=H, E=H 输出:D0~D7=数据
(4) 写数据:输入:RS=H, RW=L, D0~D7=数据, E=高脉冲 输出:无
*/
//编程实现 LCD1602 第一行显示“My name is XXX” ,第二行显示“Number:XXX”
//sbit DB=P0 不可以这样定义
//sbit是C51扩展的变量类型
//sbit特殊功能寄存器的一个位的声明,如:sbit LED0=P2^0; 类似于变量 int LED0=9; 是可以赋值的
//如:sbit LED0=P2^0; 要是想对P2^0这个引脚进行高低电平的赋值,不能直接 P2^2=1或P2^2=0;这样赋值
// 要通过sbit特殊功能寄存器位声明后在赋值
//首先,sbit led = P2,这个写法是错误的,虽然编译时不报错,但编译后执行程序时却是错误的。
//sbit 是定义一个引脚的,注意,只是定义一个引脚,而 P2是一个并行口,有8个引脚,是不能sbit 来定义的
//#define 并不是定义引脚的,也不是定义并行口,只是一个宏替换,就是程序中的led 换成P2后再编译。
#define DB P0
sbit RS=P2^6;//数据/命令选择端
sbit RW=P2^5;//读/写选择端
sbit EN=P2^7;//使能端
char table_1[] = " My name is YCB";
char table_2[] = " Number: 113506";
void delay(unsigned int ms)
{
char i;
while(ms--)
for(i=0; i<110; i++);
}
void write_com(char data_)//写指令
{
EN=0;
RS=0; //1表示数据,0表示指令,通过芯片告诉LCD1602,我要使用指令了
RW=0; //1表示读取,0表示写入,在告诉LCD1602,我要用写的方式使用指令了,即写入指令
//LCD1602,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号
DB=data_; //写入指令
//delay(5);
EN=1;
delay(5); //给予EN 5ms的脉冲宽度,LCD1602才开始执行
EN=0; //置零
}
void write_data(char data_)
{
EN=0;
RS=1; //1表示数据,0表示指令,通过芯片告诉LCD1602,我要使用数据了
RW=0; //1表示读取,0表示写入,在告诉LCD1602,我要用写的方式使用数据了,即写入数据
//LCD1602,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号
DB=data_; //写入指令
//delay(5);
EN=1;
delay(5); //给予EN 5ms的脉冲宽度,LCD1602才开始执行
EN=0; //置零
}
void init()
{
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //
write_com(0x06); //读写一个字符后,地址指针+1,光标+1,右移
write_com(0x01); //清屏
}
int main()
{
char i;
init();
write_com(0x80); //从第一行左边开始写入数据
for(i=0; i<15; i++)
{
write_data(table_1[i]);
delay(500);//延迟函数,可在屏幕上看到显示的字符逐个出现
}
write_com(0x80+0x40);//从第二行左边开始写入数据
for(i=0; i<15; i++)
{
write_data(table_2[i]);
delay(500);//延迟函数,可在屏幕上看到显示的字符逐个出现
}
while(1);
}