一、 学习要点(串行多总线类外设):
1、 正确分析时序图;
2、 多总线(多条数据线区别于DHT11这类单总线控制线不算)操作的传感器,要区单总线的传感器DHT11等,单总线时位操作的而“多总线”是字节操作的,不用8次for循环处理数据;
3、 判忙函数中,检测P0^7引脚时要提前赋值P0=0XFF,因为51单片机检测高电平时,首先要给检测的引脚赋值高电平;
4、 操作时序既要遵循也要适时的加入小延时等待机器响应。
二、手册分析
二、手册分析
1、结构块图
2、引脚功能图
5、指令寄存器(IR)和数据寄存器(DR):(图2-5)
模块内部具有两个 8 位寄存器:指令寄存器(IR)和数据寄存器(DR)。用户可以通过 RS 和 R/W 输入信号的组合选择指定的寄存器,进行相应的操作。下表中列出了组合选择方式:(手册有误,已更正)
6、 忙标志位 BF:忙标志 BF=1 时,表明模块正在进行内部操作,此时不接受任何外部指令和数据。当 RS=0、R/W=1 以及 E 为高电平时,BF 输出到 DB7。每次操作之前最好先进行状态字检测,只有在确认 BF=0 之后,MPU 才能访问模块
7、显示数据寄存器:DDRAM 地址与 LCD 显示屏上的显示位置的对应关系如:执行显示移位操作时,对应的 DDRAM 地址也发生移位,每行 16 个字符的显示,共有 2 行。移位前的地址对应关系。
8、指令说明:
3、设置输入模式:
三:编程
1、程序效果:
2、程序.c文件
#include “LCD1602.h”
#include “string.h”
void InspectBusyFlag( ) ;
void Delayxms(unsigned int t) //@11.0592MHz
{
unsigned char i, j;
unsigned int x;
for(x=0;x
nop();
i = 4;
j = 146;
do
{
while (–j);
} while (–i);
}
}
void Wr_OneByte2Lcd1602(char DatorCmd,char val)
{
InspectBusyFlag( );
Delayxms(1);
RS = DatorCmd; //0、指令寄存器 1、数据寄存器
RW = 0; //0读操作、1写操作
EN = 1;
P0 = val;
nop();nop();nop();
EN = 0;
Delayxms(1);
}
void Rd_OneByte2Lcd1602(char DatorCmd,char val)
{
EN = 0;
RS = DatorCmd; //0、指令寄存器 1、数据寄存器
RW = 0; //0读操作、1写操作
EN = 1;
nop();
P0 = val;
}
void InspectBusyFlag( ) //检查忙标志位,BF=1表示正在忙碌中
{
P0 = 0xff;
RS = 0;
RW = 1;
EN = 1;
Delayxms(1);
while (0x80&P0);
EN = 0;
}
void LCD1602_Init(void)
{
Wr_OneByte2Lcd1602(CMD,0x38);
Delayxms(5);
Wr_OneByte2Lcd1602(CMD,0x38);
Wr_OneByte2Lcd1602(CMD,0x01);
Wr_OneByte2Lcd1602(CMD,0x06);
Delayxms(5);
Wr_OneByte2Lcd1602(CMD,0x0C);
}
void Display_CharOnLcd(unsigned char x,unsigned char y,char val)
{
if( 0==y )
{
Wr_OneByte2Lcd1602(CMD,0x80 + x);
}
else
{
Wr_OneByte2Lcd1602(CMD,0xC0 + x);
}
Wr_OneByte2Lcd1602(DAT,val);
}
void Display_StrOnLcd1602(unsigned char x,unsigned char y,char p)
{
char num,i;
num = strlen§;
for(i=0;i
Delayxms(2);
Display_CharOnLcd(x+i,y,
}
}
源代码下载地址:
链接:https://pan.baidu.com/s/1_hDX77OjdoBO1MZ1Gr7O2A
提取码:5n4q