LCD1602代码解析

代码写作步骤:

(1)理解时序图,根据时序图编写命令写入行(write_cmd)模块以及数据写入行程序(write_dat)
LCD1602代码解析_第1张图片
(2)初始化LCD:
1、 功能设定:write_com(0x38)LCD1602代码解析_第2张图片

设定数据总线位数、显示的行数及字型。
DL:0=数据总线为 4 位 ,1=数据总线为 8 位
N:0=显示 1 行, 1=显示 2 行
F:0=5×7 点阵/每字符 1=5×10 点阵/每字符

2、显示开关控制命令: write_com(0x0f)
LCD1602代码解析_第3张图片
控制显示器开/关、光标显示/关闭以及光标是否闪烁
D:0=显示功能关, 1=显示功能开
C:0=无光标 1=有光标
B:0=光标闪烁 1=光标不闪烁

3、显示模式设置:write_com(0x06)
LCD1602代码解析_第4张图片
设定每次写入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是 否移动。
I/D:0=写入新数据后光标左移 ,1=写入新数据后光标右移
S:0=写入新数据后显示屏不移动 ,1=写入新数据后显示屏整体右移 1 个 字符
4、清屏指令: write_com(0x01)
LCD1602代码解析_第5张图片
<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII 码 20H;
<2> 光标归位,即将光标撤回液晶显示屏的左上方;
<3> 将地址计数器(AC)的值设为 0。

(3)写入数据:
如果是多个字符,采用for循环
(4) 整个代码如下:

#include
typedef unsigned char uchar;
typedef unsigned int  uint;
sbit Lcden = P2^7;
sbit Lcdrs = P2^6;
sbit Lcdwr = P2^5;
uchar code display[] = "I like study" ;
void delay(uint i)
{
  while(i--);
  }
void write_com(uchar com)//按照时序图设置RS、R/W、EN的高低电平
{
  Lcdrs = 0;
  Lcdwr = 0;
  Lcden = 0;
  P0 = com;
  delay(1000);//延时没有严格的限制,只要表格中要求的时间即可
  Lcden = 1;
  delay(1000);
  Lcden = 0;
}
void write_dat(uchar dat)
{
  Lcdrs = 1;
  Lcdwr = 0;
  Lcden = 0;
  P0 = dat;
  delay(100);
  Lcden = 1;
  delay(100);
  Lcden = 0;
}
void Init()
{
 write_com(0x38);//设定8位数据线,显示两行,5*7的点阵/字符
 write_com(0x0f);// 控制显示开关
 write_com(0x06);//每次写入数据狗光标右移,整屏不移动
 write_com(0x01);//清屏指令
}
void main()
{
uchar i,num;
Init();
write_com(0x80+0x10);//设定初始地址。  显示地址只有0x00~0x0f和第二行0x40~0x4f;其他地址在屏幕右边,
//不显示出来,如果要让整个屏幕从右边显示出来,就需要将初始地址设置在屏幕右边,
//然后通过屏幕整体向左移动来实现
for(i=0;i<12;i++)
 {
   write_dat( display[i] );
   delay(100);
 }
 for(num=0;num<16;num++)
 {
     write_com(0x18);//整屏向左移动
  delay(10000);  
 }
 while(1);//有这个程序后,显示屏不会闪烁显示。如果没有这个程序,不将程序停留在这成死循环,
 //则LCD会闪烁显示文字。 
}

你可能感兴趣的:(LCD1602代码解析)