搜索
bottom↓
回复: 16

关于LCD1602的请教

[复制链接]

出0入0汤圆

发表于 2012-4-14 21:18:48 | 显示全部楼层 |阅读模式
初学51单片机,老师布置了个用LCD1602 显示的课外题,要求用两个键控制显示内容变化,初始显示时间,按1键显示为姓名,按2键恢复显示时间。

  我的想法是用两个外部中断接按键来变化显示内容,P2口接LCD数据总线。

  查了很多的LCD1602,感觉还是不懂,不知道这个想法能不能实现,请高手帮忙答疑,   QQ504239170 求指导谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-4-14 22:41:27 | 显示全部楼层
用任意的i/o口都可以接按键的。只要设置两个页面用按键任意切换就好了。随时对按键进行扫描

出0入0汤圆

发表于 2012-4-15 01:11:20 | 显示全部楼层
楼主可以看看郭天祥的视频。他关于按键扫描和1602的讲解对于初学者是有帮助的。

出0入0汤圆

发表于 2012-4-15 12:20:15 | 显示全部楼层
楼主可以先学习下1602的控制程序,然后加个中断就ok了

出0入0汤圆

发表于 2012-4-15 12:56:31 | 显示全部楼层
想按老师布置的要求完美的完成的话
必须系统的学习单片机和1602

出0入0汤圆

发表于 2012-4-15 13:35:47 | 显示全部楼层
这个想法是可以实现的啊,其实如果IO口需求多的话,你只用一个中断就可以实现切换啦,定义一个变量,让它每按一次就自增一次,然后再判断,是奇数还是偶数来控制。还有就是你会不会看时序图,最主要是会看时序图,然后照着那些时序图写,如先构造一个write函数以及read这些基本函数等,然后再组合成复杂一点的函数,然后就初始化很重要,其实这些例子网上都很多,你可以上网上找找,多看看,学着写,很快你就会了

出0入0汤圆

 楼主| 发表于 2012-4-15 15:39:09 | 显示全部楼层
中国人 发表于 2012-4-15 13:35
这个想法是可以实现的啊,其实如果IO口需求多的话,你只用一个中断就可以实现切换啦,定义一个变量,让它每 ...

看了看就是很不懂那个时序图啊~~~~

出0入59汤圆

发表于 2012-4-15 16:49:50 来自手机 | 显示全部楼层
楼主浮躁了,多看看论坛里的贴子吧

出0入0汤圆

发表于 2012-4-15 18:23:54 来自手机 | 显示全部楼层
这段时间我也在用这个显汉字。

出0入0汤圆

发表于 2012-4-15 19:55:23 | 显示全部楼层
这个的话,那还是建议你去看一下 《郭天祥的十天学会单片机》,里面就有一课时教你使用LCD屏的

出0入0汤圆

发表于 2012-4-15 20:07:35 | 显示全部楼层
504239170 发表于 2012-4-15 15:39
看了看就是很不懂那个时序图啊~~~~

有什么不懂的,1602的时序基本是最简单的。
如图所示(点击放大):



对1602写一个指令的过程如下:
首先要保证EP处于低电平。
然后将RS至于低电平,将RW也置于低电平;
然后向数据端口写入要写的命令;
将EP拉高;
延时至少Tpw的时间;
将EP拉低;
指令写入完成。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-4-17 16:53:47 | 显示全部楼层
利用两个普通的IO口作为按键接口就行了,我大致写了个程序,不知合不合你的要求:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int

sbit rs = P3^5;
//sbit rw = P2^6;
sbit en = P3^4;
sbit key1=P3^6;
sbit key2=P3^7;

unsigned char code str1[]={"2011-04-13"};
unsigned char code str2[]={"WANGHAIMING!"};

void delay_1ms(unsigned int xms)
{
unsigned int i,j;
for(i=0;i<xms;i++)
     for(j=0;j<110;j++);
}

void wr_com(unsigned char com)  //写指令
{
delay_1ms(1);
rs=0;
//rw=0;
en=0;
P0=com;
delay_1ms(1);
en=1;
delay_1ms(1);
en=0;
}

void wr_dat(unsigned char dat) //写数据
{
delay_1ms(1);
rs=1;
//rw=0;
en=0;
P0=dat;
delay_1ms(1);
en=1;
delay_1ms(1);
en=0;
}

void lcd_init()
{
delay_1ms(15);
wr_com(0x38); delay_1ms(5);
wr_com(0x08); delay_1ms(5);
wr_com(0x01); delay_1ms(5);
wr_com(0x06); delay_1ms(5);
wr_com(0x0c); delay_1ms(5);
}

void displcd(unsigned char *p)
{
while(*p!='\0')
{
  wr_dat(*p);
  p++;
  delay_1ms(1);
}
}

void keyscan()
{
  uchar keynum=0;
   if(key1==0)
{                       
delay_1ms(5);
if(key1==0)
  {
   keynum=1;
  }
  while(!key1);
}
if(key2==0)
{
delay_1ms(5);
if(key2==0)
  {
   keynum=2;
  }
  while(!key2);
}

   switch(keynum)
   {
     case 1:wr_com(0x01);wr_com(0x80);displcd(str1); break;
     case 2:wr_com(0x01);wr_com(0x80);displcd(str2); break;
   }
}


void main()
{
lcd_init();
wr_com(0x80);
displcd(str1);
while(1)
{
keyscan();
}
}

出0入0汤圆

发表于 2012-4-17 16:59:23 | 显示全部楼层
我爱大米饭 发表于 2012-4-17 16:53
利用两个普通的IO口作为按键接口就行了,我大致写了个程序,不知合不合你的要求:
#include "reg51.h"
#def ...

行 可以的

出0入0汤圆

 楼主| 发表于 2012-4-17 22:43:17 | 显示全部楼层
我爱大米饭 发表于 2012-4-17 16:53
利用两个普通的IO口作为按键接口就行了,我大致写了个程序,不知合不合你的要求:
#include "reg51.h"
#def ...

谢谢啊~~~~~~~

出0入0汤圆

发表于 2012-4-18 13:51:29 | 显示全部楼层
哈哈....大家共同学习学习

出0入0汤圆

发表于 2012-4-18 14:35:58 | 显示全部楼层
要求不高的话,直接用扫描法。只要判断是那个键就显示相应内容。

出0入0汤圆

发表于 2012-5-3 11:02:03 | 显示全部楼层
下载看看,初学者,希望有进步!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 23:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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