一、基础知识
/**************** LCD1602和12864显示器 **************/
/*
一、章节目录
1.1 LCD显示器相关原理
1.2 开始学习LCD1602
原理图和数据手册
时序图和底层时序、函数封装
高层时序、函数封装
代码实践和调试
二、LCD12806
三、LCD简介
1.1、显示器,常见显示器
1.2、LCD液晶显示器,原理介绍
1.3、LCD应用领域
!2、电子显示器的原理
1.1 像素(分辨率)
1.2 显存,用于显示的内存
1.3 字模
1.4 字库
1.5 控制器和驱动器
1.6 软件+硬件实现功能
四、开始学习LCD1602
1.1、1602 = 16*2,显示器显示两排,每排16个字符。能显示的字符数是32,但是像素数不是32,因为一个字符是由多个像素组成的。
有可能一个字符 = 5*7,35个像素组成,也有可能有6*8==48个像素组成
1.2、带ASCII码字库,不能显示中文。
当想让LCD1602显示某一字符时,只要将这个字符对应的ascii码发给16032内部控制器,控制器就会去查字库得到字模,
然后将字模发给内部的驱动器去驱动LCD做显示。
1.3、 用途:
1.4、接线图
(1)16个引脚: VO调节背光强弱。 RS\RW\E 3个引脚作为控制信号线, DB0-DB7 8个引脚用于数据通道/数据线的 4个ged+vcc
(2)并行接口:串行就是数据线只有1根,同时只能传输1个bit位,如果要传输多个bit位必须分时传输。一个字节8个bit分8次。
而并行就是数据线有多根,每一根可以传输1个bit位,所以同时可以传输多个bit位。譬如lcd1602有8根数据线,
所以一次同时传输8个bit位。
(3)背光亮度调节
(4)接线确认
五、开发板数据手册
1.接口部分与编程有关的是RS(h:数据/ l:命令选择端),RW(h:读数据选择端/ l:写命令选择端),E三根控制线。
RS=1,D0-D7上传输的是数据
RS=0,D0-D7上传输的是命令
RW=1,表示读
RW=0,表示写
E=1,使能
E=0, 禁止
D0-D7 8根数据线
基本操作时序
1.1 读状态:输入: RS=0,RW=1,E=1 输出:D0-D7=状态字
1.2 写指令:输入: RS=0,RW=1,D0-D7=指令码,E=1高脉冲 输出:无
1.3 读数据:输入: RS=1,RW=1,E=1 输出:D0-D7=数据
1.4 写数据:输入: RS=1,RW=0,D0-D7=数据,E=1高脉冲 输出:D0-D7=状态字
其中,写数据就是对应的ASCII码,
写指令就是设置显示模式。 指令码00111000 功能:设置16*2显示,5*7点阵,8位数据接口
参考lcd1602数据手册
*/
二、数据手册参考
长沙太阳人电子 SMC1602C液晶显示模块 说明书 - 百度文库 (baidu.com)
三、代码实践
分三个文件
1. LCD1602.c文件
/********************* LCD1602 *******************/
#include "LCD1602.h"
/************* 低层时序 ***********/
// 读状态 (读取lcd1602是否忙),并且每一次写指令和写数据时都需要读状态
void Read_Busy(void) // 1000 0000 最高是1时不允许读写 为0时允许读写
{
unsigned char sta; // 用于保存lcd芯片输出的数据
LCD1602_DB = 0XFF; // 初始化成1111 1111 是为了检测数据引脚最高位时1还是0 忙还是不忙
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_EN = 1;
sta = LCD1602_DB;
LCD1602_EN = 0;
}while (sta & 0x80); // 判断最高位是不是1
}
// 写指令
void Write_Order(unsigned char cmd) // 写指令函数,向lcd1602芯片写入控制指令数据cmd
{
Read_Busy();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_DB = cmd;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
// 写数据
void Write_data(unsigned char dat)
{
Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_EN = 0;
LCD1602_DB = dat;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
/***************** 高层时序 ***************/
// 定义 <光标位置> 函数,每一行0-15
void Lcd_setcoord(unsigned char x, unsigned char y) //坐标显示
{
unsigned char addr;
if(y == 0) // y=0表示lcd 第1行 y=1表示lcd第2行
addr = 0x00 + x;
else
addr = 0x40 + x;
Write_Order(addr | 0x80);
}
// 定义函数从 “光标x,y位置” Lcd_setcoord(x, y); 开始显示字符串str
void LCD_Show_Str(unsigned char x, unsigned char y, unsigned char *str)
{
Lcd_setcoord(x, y);
while(*str != '\0')
{
Write_data(*str++);
}
}
// lcd初始化函数
void LCD_Init()
{
Write_Order(0x38);
Write_Order(0x08);
Write_Order(0x01);
Write_Order(0x06);
Write_Order(0x0C);
}
2. LCD1602.h文件
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include <reg51.h>
#define LCD1602_DB P0 // 数据引脚
sbit LCD1602_RS = P2^6;
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;
void Read_Busy(void);
void Write_Order(unsigned char cmd);
void Write_data(unsigned char dat);
void Lcd_setcoord(unsigned char x, unsigned char y);
void LCD_Show_Str(unsigned char x, unsigned char y, unsigned char *str);
void LCD_Init();
#endif
3. main函数文件
#include "LCD1602.h"
void main(void)
{
LCD_Init();
LCD_Show_Str(0, 0, "^_^12345!!!");
LCD_Show_Str(0, 1, "shangshand");
}