找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1663|回复: 0
打印 上一主题 下一主题
收起左侧

LCD1602学习—Proteus仿真(显示操作)

[复制链接]
跳转到指定楼层
楼主
ID:937858 发表于 2021-7-24 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习关键:先看懂液晶操作时序图(写操作:写命令、写数据)
读状态
输入
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 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表