标题: LCD1602学习—Proteus仿真(显示操作) [打印本页]

作者: bruce135lee    时间: 2021-7-24 18:17
标题: LCD1602学习—Proteus仿真(显示操作)
学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出


由时序图可知,写操作时(包括写指令、写数据),RS=0;RW=0;再进行I/O口写操作,然后使能端口完成一次高脉冲(——高——低),这是液晶就会执行写操作的内容;
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容


思路:

1、控制液晶显示输出,需要对其进行写数据(写数据前,同样需要先告诉液晶你下一步要在哪里写,因此写数据前,要写命令先设定数据指针)
程序设计方式:
write_com();//写命令函数,
write_date();//写数据函数

2、由于要先进行初始化,(初始化实际就是对液晶写指令,告诉其工作方式等)因此初始化函数里面自然就需要调用写命令函数write_com();
程序结构如下:
int init()
{
  EN = 0;
  write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
  write_com(0X0C);//设置开显示,不显示光标
  write_com(0X06);//写一个字符时,整屏右移
  write_com(0X01);//显示清零
  return 0;
} 
主函数部分程序结构:
int main()
{
  init();//调用初始化函数
  write_com(0x80);//调用写指令函数,设置写数据开始指针(第一行)
  for(x=0;x<6;x++)//数据写入循环程序
  {
    write_date(table[x]);
    delay(150);
  }
  write_com(0x80+0x40); ;//调用写指令函数,设置写数据开始指针(第二行)
  for(x=0;x<17;x++)//数据写入循环程序
  {
    write_date(table1[x]);
    delay(150);
  }
  while(1);
return 0;
}

完整程序如下:
1 #include<reg52.h> 2     int init();    //声明初始化函数 3     int write_com(unsigned char);//声明写命令函数 4     int write_date(unsigned char);//声明写数据函数 5     int delay(unsigned char);//声明延迟函数 6     unsigned char x; 7     sbit RS = P1^0; 8     sbit RW = P1^1; 9     sbit EN = P1^2;10     unsigned char code table[]="HELLO!";11     unsigned char code table1[]="MY name is Terry!";12 13 int main(void)//主函数14 {    15     init();16     write_com(0x80);    17     for(x=0;x<6;x++)18     {19          write_date(table[x]);20         delay(150);21     }22     write_com(0x80+0x40);    23     for(x=0;x<17;x++)24     {25          write_date(table1[x]);26         delay(150);27     }28     while(1);            29     return 0;30 }31 32 int init()//初始化函数体33 {34     EN = 0;35     write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口36     write_com(0X0C);//设置开显示,不显示光标37     write_com(0X06);//写一个字符时,整屏右移38     write_com(0X01);//显示清零39     return 0;40 }41 42 int write_com(unsigned char com)//写命令的函数体43 {44     RS = 0;45     RW = 0;46     P0 = com;47     delay(5);48     EN = 1;49     delay(5);50     EN = 0;51     return 0;        52 }53 54 int write_date(unsigned char date)//写数据的函数体55 {56     RS = 1;57     RW = 0;58     P0 = date;59     delay(5);60     EN = 1;61     delay(5);62     EN = 0;63     return 0;        64 }65 66 int delay(unsigned char xms)67 {68     unsigned char x,y;69     for(x=xms;x>0;x--)70         for(y=110;y>0;y--);71     return 0;72 }





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1