目录
具体接线请按照原理图接线
要显示的字符可以用ASCII码来实现或者直接输出字符'xxx'实现
显示任何字符都需要把最高位置1才能显示,例如:在第一行第5位显示,那么地址为: 0x80+0x04
由前面引脚说明可知:RS为寄存器选择,高电平为数据寄存器,低电平为指令寄存器
假如我们选择数据寄存器,那么RS一开始为高电平,R/W可看作一直为高电平,E使能位刚开始为低电平,经过一段时间变为高电平维持一段时间后变为低电平,DB0 ----DB7是数据位 当E使能位变为高电平后tD时间后开始读取数据
#include "reg52.h"
#include <intrins.h>
#define databuffer P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
void check_busy()
{
char temp = 0x80;
databuffer = 0x80;
while(temp & 0x80){
RS = 0;
RW = 1;
EN = 0;
_nop_();//延时一个机器周期
EN = 1;
_nop_();
_nop_();
temp = databuffer;
EN = 0;
_nop_();
}
}
代码分析:首先声明一个中间变量temp来存放来自P00-P07的数据,从LCD1602的模块指令可知读忙标志或地址:D7 = BF(BF = 1为检测忙状态,不可输入数据,BF = 0,可以输入数据)temp和databuffer初始化为0x80就是为了令BF = 1为检测状态,检测后数据输入BF不为1,则temp存放来自databuffer的数据,实现读操作
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
由前面引脚说明可知:RS为寄存器选择,高电平为数据寄存器,低电平为指令寄存器
假如我们选择数据寄存器,RS一开始为高电平经过一段时间后变为低电平,R/W可以看作先为高电平然后变为低电平或者一直为低电平,E使能位则是一开始为低电平,经过一段时间后变为高电平维持一段时间后再变为低电平,DB0---DB7是数据位,在E使能位变为高电平前的tsp2时间开始写入数据
#include "reg52.h"
#include <intrins.h>
#define databuffer P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
//写指令======================
void Write_cmd(unsigned char cmd)
{
check_busy();
RS = 0;//选择指令寄存器,写地址
RW = 0;
EN = 0;
_nop_();
databuffer = cmd;//往P0组写入数据
_nop_();//tsp2
EN = 1;
_nop_();//tpw
_nop_();//tpw
EN = 0;
_nop_();
}
===============================
//写数据=======================
void Write_data(unsigned char dat)
{
check_busy();
RS = 1;//选择数据寄存器,写数据
RW = 0;
EN = 0;
_nop_();
databuffer = dat;//在EN由低变高的时候开始传数据
_nop_();//tsp2
EN = 1;
_nop_();//tpw
_nop_();//tpw
EN = 0;
_nop_();
}
===============================
#include "reg52.h"
#include <intrins.h> //其中有nop函数的定义
/*对于延时很短的,要求在us级的,采用“_nop_”函数,
这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,
可由晶振频率算出延时时间,对于12M晶振,延时1uS。*/
#define databuffer P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
void Delay15ms() //@11.0592MHz
{
unsigned char i, j;
i = 27;
j = 226;
do
{
while (--j);
} while (--i);
}
void Delay5ms() //@11.0592MHz
{
unsigned char i, j;
i = 9;
j = 244;
do
{
while (--j);
} while (--i);
}
//检查忙操作================
void check_busy()
{
char temp = 0x80;
databuffer = 0x80;
while(temp & 0x80){ //如果最高位BF为1,那么就为忙,不能写入数据
RS = 0;
RW = 1;
EN = 0;
_nop_();//延时一个机器周期
EN = 1;
_nop_();
_nop_();
temp = databuffer;//当databuffer给temp传入一个0,temp & 0x80,BF不为1,则开始写入数据
EN = 0;
_nop_();
}
}
//==========================
//写时序操作================
void Write_cmd(unsigned char cmd)
{
check_busy();
RS = 0;//选择指令寄存器,写地址
RW = 0;
EN = 0;
_nop_();
databuffer = cmd;//往P0组写入数据
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Write_data(unsigned char dat)
{
check_busy();
RS = 1;//选择数据寄存器,写数据
RW = 0;
EN = 0;
_nop_();
databuffer = dat;//在EN由低变高的时候开始传数据
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
//==========================
void shouline(unsigned char row,unsigned char col,char *ptr)
{
switch(row){
case 1:
Write_cmd(0x80+0x00+col);
while(*ptr !='\0'){
Write_data(*ptr);
ptr++;
}
break;
case 2:
Write_cmd(0x80+0x40+col);
while(*ptr !='\0'){
Write_data(*ptr);
ptr++;
}
break;
}
}
void Init_LCD()
{
//延时15ms
Delay15ms();
//写指令 38H 不检测忙信号
Write_cmd(0x38);
//延时5ms
Delay5ms();
//以后每次读写操作,均需要检测忙信号
//写指令 38H 显示模式设置
Write_cmd(0x38);
//写指令 08H 显示关闭
Write_cmd(0x08);
//写指令 01H 显示清屏
Write_cmd(0x01);
//写指令 06H 光标移动设置
Write_cmd(0x06);
//写指令 0CH 显示开及光标设置
Write_cmd(0x0C);
}
void main()
{
//char position = 0x80+0x05;//显示位置必须令最高位置1
//char dat = 'c';
Init_LCD();//初始化LCD
//Write_cmd(position);//选择要显示的地址
//Write_data(dat);//选择要显示的字符
shouline(1,5,"NO.1");
shouline(2,2,"wish me luck");
}
1)延时 15ms
(2)写指令 38H( 不检测忙信号 )
(3)延时 5ms
(4)以后每次写指令,读 / 写数据操作均需要检测忙信号
(5)写指令 38H :显示模式设置
(6)写指令 08H :显示关闭
(7)写指令 01H :显示清屏
(8)写指令 06H :显示光标移动设置
(9)写指令 0CH :显示开及光标设置
void Init_LCD()
{
//延时15ms
Delay15ms();
//写指令 38H 不检测忙信号
Write_cmd(0x38);
//延时5ms
Delay5ms();
//以后每次读写操作,均需要检测忙信号
//写指令 38H 显示模式设置
Write_cmd(0x38);
//写指令 08H 显示关闭
Write_cmd(0x08);
//写指令 01H 显示清屏
Write_cmd(0x01);
//写指令 06H 光标移动设置
Write_cmd(0x06);
//写指令 0CH 显示开及光标设置
Write_cmd(0x0C);
}
单例模式--饿汉式饿汉式单例模式代码分析进阶饿汉式单例模式众所周知 单例模式 有很多种实现的方式。最为经典的就是懒汉式和饿汉式,今天就先简单整理一下饿汉式单例。代码··· javapublic class HungrySingleton { //构造函数私有化 private HungrySingleton(){}; //全局访问点 private static final HungrySingleton HUNGRY_SINGLETON = new HungryS_关于单例模式下略略略饿汉
在一个项目中,项目经理不仅是管理者,同时也是执行者,因此项目经理需要制定时间计划、制定项目计划,将要做的事列成清单,决定何人做何事,同时确定适当的优先级,制定最优工作表,将最优先的活动填到日常工作表中,各级管理人员根据具体情况确定这些活动的适当时间段。一、工作时间的估计工作时间估计是项目时间管理的一项重要的基础工作,要在考虑到各种资源、人力、物力、财力、环境等各种因素的情况下,把工作置于独立...
Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用开发佳实践课程。..._课程目录: 01、图像读入、显示与保存 02、图像处理入门基础 03、像素处理 04、使
“农业大数据”专题征文通知全球范围内,运用大数据推动经济发展、完善社会治理、提升政府服务和监管能力正成为趋势。在我国,发展大数据已上升为国家战略,正成为推动经济转型发展...
简介遗传算法基于GA优化BP网络大脑图像分割基于GA优化BP神经网络矿井通风计算_matalab bp-ga算法
cocoa目录存放基本类型和工具。CCAffineTransform功能:二维坐标点平移、缩放等变化功能。CCArray功能:类似std::vector,存放CCObject类型。CCAutoreleasePool功能:自动释放的CCObject对象池。疑问:CCPoolManager为什么需要多个CCAutoreleasePoolCCDictionar
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道。风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时..._西瓜视频公司破产
作者 | 苏宓出品 | CSDN(ID:CSDNnews)25 年前,浏览器之争初起,IE 与网景(Netscape)“大战”四年,最终以网景被 AOL 收购、IE 市场份额节节攀升结束了..._微软强推 edge浏览器 csdn
开始学习Hadoop,首先搭建了一下开发环境,最开始是在单独编写Map-Reduce程序,然后在命令行编译,再通过hadoop命令运行打好的jar包,虽然也能够运行,但是总感觉这样用起来很麻烦,所以今晚又尝试了直接通过eclipse来编辑和运行Map-Reduce程序,瞎弄了一下,居然让我弄成功了,自然走了点弯路,担心以后再走弯路,所以把自己的搭建过程记录于此。1.准备1.1 软件
作者 | 李秋键责编 | 刘静出品 | CSDN(ID:CSDNnews)本篇文章将利用GAN算法的pixpix模型实现对黑白图片进行上色。下面简单介绍一下图片像素知识,和黑白图像一样,彩色图像中的每一层,也有~的值。值表示这个层中没有颜色。如果像素网格所有颜色通道的值都为,那么这个图像像素就是黑色的。神经网络在输入值和输出值之间创建了一种关系。为了能够更为准确地完成着..._ai自动上色
这道超级简单的题目没有任何输入。你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。输入样例:无输出样例:Hello WorldHello New World