找回密码
 立即注册

QQ登录

只需一步,快速开始

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

教大家怎么写一个液晶1602的程序(绝对很简单!!)

  [复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-11 01:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天,小编给各位电子爱好者伙伴讲解这么一个程序,也许你看了郭天祥的10天学会单片机后感觉好多代码都不能亲手动手去写对吗?其实自己写代码写模块都是有一定的方法的,掌握了一定的方法,以后不管写什么,你都会如鱼得手,小编总结了一个很多人都头疼的问题,如何写一个液晶显示的程序呢?代码好长!!!!怎么办?害怕了?没有动力干了?小编告诉你,你立马有动力,不再惧怕类似1602的模块!!请往下看。
首先:
要写一个液晶1602的程序,我们需要明白液晶有三个端口是要写入相关的数据的;分别是E、RS、RW。
数据手册内容众多,小编就不一一阐释了;

所以,请看lcd1602数据手册:http://www.51hei.com/mcu/827.html
接着:

看完了数据手册,有木有发现灵感?是不是好多都是可以看着自己就可以敲出来?
好了,我们开始写程序:
写液晶的时候分为以下步骤:
1、写指令(看看数据手册里有的)
void writecmd(uchar com)  
{
E=0;       //为什么要写这一条呢,看看时序图就清楚了
RS=0;
RW=0;
P0=com;   
delay(2);  //延时一下会稳定很多,后面一条也是一样的
E=1;  
delay(2);
E=0;
}
//以上的P0就是液晶送数据的端口,当然你可以是P2口,看你的       电路是怎么样那就怎么改,至于为什么是com,这是个自定义形式参数来的,也可以改成别的,但是不能是关键字,这个参数传的就是你想要写的指令;下面写数据的P0是你想要写的数据。详情看看大程序便知

2、写数据(同样数据手册也有)
void writedata(uchar dat)//写数据,函数名随便你定义看得懂就行
{  
  E=0;     //写数据和写命令的方法差不多,复制过来。照着数据手            //册的写数据要求去写!
  RS=1;
  RW=0;
  P0=dat;
  delay(2);
  E=1;  
  delay(2);
  E=0;

}

3、初始化(一样的,数据手册也有,照写)
void init(void)              
{  delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x38);
writecmd(0x08);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
好了一个液晶的基本操作就是这三部分组成的,不难吧?
接下来来看看我们如何显示如图所示的字符:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

//这三个引脚参考资料
sbit E=P2^7;                //1602使能引脚
sbit RW=P2^6;                //1602读写引脚        
sbit RS=P2^5;                //1602数据/命令选择引脚

uchar tab1[]=" www.51hei.com  ";  //要显示什么就在这儿改
uchar tab2[]="LCD1602 test ok!";  //[size=15.5555562973022px]要显示什么就在这儿改

void delay(uint del)   //延时1ms
{
uint i,j;
for(i=0;i<del;i++)
   for(j=0;j<=168;j++);
}
void writecmd(uchar com)  //写指令
{
E=0;
RS=0;
RW=0;
P0=com;
delay(2);
E=1;  
delay(2);
E=0;
}
void writedata(uchar dat)//写数据
{  
  E=0;
  RS=1;
  RW=0;
  P0=dat;
  delay(2);
  E=1;  
  delay(2);
  E=0;

}
void init(void)               //初始化
{
delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x38);
writecmd(0x08);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
void main()
{  uchar j;
  init();
  writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  for(j=0;j<16;j++)  //有16个字符,要循环16次
  {
   writedata(tab1[j]);
        delay(2);
  }
  writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H

  for(j=0;j<16;j++)   //有16个字符,要循环16次
  { writedata(tab2[j]);
         delay(2);
  }
  while(1);         //让液晶显示就一直停在这里。

}


好了,你们可以照着我这个程序去修改得到你们想要的显示结果,同样也可以发挥一下你们的想法,如何让液晶进行移屏显示呢?怎么样做出移动的效果呢?有待大家的努力噢!小编最主要的目的是要告诉大家,任何模块拿起来都不要惧怕,把数据手册看一遍,看不懂再看一遍,然后看看别人是怎么写的,自己动手改一遍,再写一遍,转化为自己的东西,这样就可以学到经验了。

评分

参与人数 4黑币 +25 收起 理由
老愚童63 + 10 很给力!
康德 + 5 赞一个!
only大煞风景 + 5 赞一个!
qjzyx + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏61 分享淘帖 顶17 踩
回复

使用道具 举报

沙发
ID:72398 发表于 2017-12-20 15:11 | 只看该作者
太好了受益很深;
回复

使用道具 举报

板凳
ID:262674 发表于 2017-12-20 19:02 | 只看该作者
简洁明了,谢谢分享!
回复

使用道具 举报

地板
ID:266116 发表于 2017-12-24 17:35 | 只看该作者
谢谢,你说的很易学懂!
回复

使用道具 举报

5#
ID:157975 发表于 2017-12-24 18:04 | 只看该作者
太谢谢了,正在犯愁。多谢大侠
回复

使用道具 举报

6#
ID:260785 发表于 2017-12-24 19:47 | 只看该作者
简洁明了,谢谢分享!
回复

使用道具 举报

7#
ID:260785 发表于 2017-12-25 10:46 | 只看该作者
谢谢,你说的很易学懂!
回复

使用道具 举报

8#
ID:266095 发表于 2017-12-25 14:36 | 只看该作者
真的非常感谢成功点亮
回复

使用道具 举报

9#
ID:269758 发表于 2018-1-1 14:56 | 只看该作者
请问怎么显示单片机里的数据啊,就是不是从程序里定义的,而是由单片机从别的地方都出来的数据
回复

使用道具 举报

10#
ID:309880 发表于 2018-5-5 23:45 | 只看该作者
谢谢你
回复

使用道具 举报

11#
ID:306032 发表于 2018-5-22 15:46 | 只看该作者
学习了、谢谢
回复

使用道具 举报

12#
ID:294665 发表于 2018-5-22 18:12 | 只看该作者
简单明了,有收获,谢谢楼主
回复

使用道具 举报

13#
ID:335213 发表于 2018-5-22 20:56 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:313328 发表于 2018-5-22 21:08 | 只看该作者
学习了,值得收藏
回复

使用道具 举报

15#
ID:375592 发表于 2018-7-23 14:47 | 只看该作者
感谢分享。有些困惑解开了,谢谢
回复

使用道具 举报

16#
ID:60026 发表于 2018-7-24 09:35 | 只看该作者
记号一下!慢慢消化!
回复

使用道具 举报

17#
ID:378374 发表于 2018-7-24 11:25 | 只看该作者
感谢大神
回复

使用道具 举报

18#
ID:321640 发表于 2018-7-24 11:36 | 只看该作者
感谢解决了这一块的疑惑
回复

使用道具 举报

19#
ID:329283 发表于 2018-7-24 14:13 | 只看该作者
写的很简洁,思路很清楚。
回复

使用道具 举报

20#
ID:74602 发表于 2018-7-24 16:27 | 只看该作者
支持技术贴,对我们初学者来说真是及时雨。
回复

使用道具 举报

21#
ID:374237 发表于 2018-7-24 17:12 | 只看该作者
其实就是这么回事
回复

使用道具 举报

22#
ID:300183 发表于 2018-7-31 17:52 | 只看该作者
学习了、谢谢
回复

使用道具 举报

23#
ID:33851 发表于 2018-8-1 11:25 | 只看该作者
谢谢楼主,适合小白学习。
回复

使用道具 举报

24#
ID:382813 发表于 2018-8-4 12:09 | 只看该作者
简单明了
回复

使用道具 举报

25#
ID:382765 发表于 2018-8-4 13:59 | 只看该作者
前来学习了
回复

使用道具 举报

26#
ID:379680 发表于 2018-9-7 08:26 | 只看该作者
路过学习学习。
回复

使用道具 举报

27#
ID:303059 发表于 2018-10-3 17:52 | 只看该作者
楼主,为什么我显示的字母是黑点
回复

使用道具 举报

28#
ID:399179 发表于 2018-10-3 19:33 来自手机 | 只看该作者
正在学习,谢谢!
回复

使用道具 举报

29#
ID:432910 发表于 2018-12-3 13:43 | 只看该作者
最后没有while(1)咋办
回复

使用道具 举报

30#
ID:71421 发表于 2018-12-5 22:45 | 只看该作者
感谢分享!!!!
回复

使用道具 举报

31#
ID:333678 发表于 2018-12-6 07:42 来自手机 | 只看该作者
多谢楼主分享,学习了。
回复

使用道具 举报

32#
ID:440685 发表于 2018-12-6 10:54 来自手机 | 只看该作者
感谢。自己琢磨了老半天,终于会了。
回复

使用道具 举报

33#
ID:469510 发表于 2019-5-20 14:45 | 只看该作者
感谢分享!!!!!!!
回复

使用道具 举报

34#
ID:543112 发表于 2019-5-20 19:32 来自手机 | 只看该作者
太收益了,简单明了。
回复

使用道具 举报

35#
ID:505027 发表于 2019-6-13 10:16 | 只看该作者
感谢,但不知道我哪里出错了,显示出来是错误的,代码直接照抄的
回复

使用道具 举报

36#
ID:464755 发表于 2019-6-14 19:15 来自手机 | 只看该作者
看了之后,忍无可忍了,一定要回复下,很有用,楼主多谢!辛苦了!
回复

使用道具 举报

37#
ID:464755 发表于 2019-6-19 03:05 来自手机 | 只看该作者
另外,为啥初始化里,0x38,就是定义显示两行,5*8字符的。要刷3次?
回复

使用道具 举报

38#
ID:524818 发表于 2019-6-19 18:29 | 只看该作者
经典,以前看不懂的这样一讲就容易理解了,谢谢!
回复

使用道具 举报

39#
ID:580953 发表于 2019-7-11 10:48 | 只看该作者
楼主,再分享一个12864的呗,最近被他难住了
回复

使用道具 举报

40#
ID:452731 发表于 2019-7-11 14:03 | 只看该作者
简单明了,学习中
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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