504239170 发表于 2012-4-14 21:18:48

关于LCD1602的请教

初学51单片机,老师布置了个用LCD1602 显示的课外题,要求用两个键控制显示内容变化,初始显示时间,按1键显示为姓名,按2键恢复显示时间。

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

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

唯诚hhw2 发表于 2012-4-14 22:41:27

用任意的i/o口都可以接按键的。只要设置两个页面用按键任意切换就好了。随时对按键进行扫描

Edward3121 发表于 2012-4-15 01:11:20

楼主可以看看郭天祥的视频。他关于按键扫描和1602的讲解对于初学者是有帮助的。

784956936 发表于 2012-4-15 12:20:15

楼主可以先学习下1602的控制程序,然后加个中断就ok了

lxa0 发表于 2012-4-15 12:56:31

想按老师布置的要求完美的完成的话
必须系统的学习单片机和1602

中国人 发表于 2012-4-15 13:35:47

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

504239170 发表于 2012-4-15 15:39:09

中国人 发表于 2012-4-15 13:35 static/image/common/back.gif
这个想法是可以实现的啊,其实如果IO口需求多的话,你只用一个中断就可以实现切换啦,定义一个变量,让它每 ...

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

sonna 发表于 2012-4-15 16:49:50

楼主浮躁了,多看看论坛里的贴子吧

gracialee 发表于 2012-4-15 18:23:54

这段时间我也在用这个显汉字。

中国人 发表于 2012-4-15 19:55:23

这个的话,那还是建议你去看一下 《郭天祥的十天学会单片机》,里面就有一课时教你使用LCD屏的

Edward3121 发表于 2012-4-15 20:07:35

504239170 发表于 2012-4-15 15:39 static/image/common/back.gif
看了看就是很不懂那个时序图啊~~~~

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



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

我爱大米饭 发表于 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();
}
}

zhenglu891028 发表于 2012-4-17 16:59:23

我爱大米饭 发表于 2012-4-17 16:53 static/image/common/back.gif
利用两个普通的IO口作为按键接口就行了,我大致写了个程序,不知合不合你的要求:
#include "reg51.h"
#def ...

行 可以的

504239170 发表于 2012-4-17 22:43:17

我爱大米饭 发表于 2012-4-17 16:53 static/image/common/back.gif
利用两个普通的IO口作为按键接口就行了,我大致写了个程序,不知合不合你的要求:
#include "reg51.h"
#def ...

谢谢啊~~~~~~~

我爱大米饭 发表于 2012-4-18 13:51:29

哈哈....大家共同学习学习

mlt911213 发表于 2012-4-18 14:35:58

要求不高的话,直接用扫描法。只要判断是那个键就显示相应内容。

单片机学徒 发表于 2012-5-3 11:02:03

下载看看,初学者,希望有进步!
页: [1]
查看完整版本: 关于LCD1602的请教