lcd1602 显示的问题

htnw134 2007-07-29 12:17:59
最近用了1602的显示器,但对它不是很懂,看了说明书还是一样,想问一下,它显示时怎么样显示一行字符,有个例子最好啦!!1谢谢大家了
...全文
1025 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
htnw134 2007-08-01
  • 打赏
  • 举报
回复
还有那个,使能端EN好像是要在高电平降到低电平才能写入数据的哦
htnw134 2007-08-01
  • 打赏
  • 举报
回复
好像还是不行啊,我又一个用到lcd1602的硬件电路,现在就是显示方面出问题。我在网上找到的lcd1602 的资料,好像和你编程的不一样啊。例如:{MOV   P1,#38H   ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口}这是第六个指令吧,在我找到的资料中是这样的
{指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符}
即你的程序好像应该改成:MOV P1,#28H 才可以得到相应的结果啊
htnw134 2007-08-01
  • 打赏
  • 举报
回复
这几天都没有上网,所以今天才看到,谢谢你们,谢谢dpear,我看一下先
htnw134 2007-08-01
  • 打赏
  • 举报
回复
我发我的程序上去。你看一下吧!
#include<AT89X51.H>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int


/*===================================================
定义各个引脚
===================================================*/
sbit SCK=P1^6;
sbit SDA=P1^7;
sbit Cy=PSW^7;
sbit EN=P3^4;
sbit ID=P1^5;
sbit W=P3^2;



/*===================================================
定义lcd的输出字符,和按键的键值比较等
===================================================*/
code uchar sendstr[]="Sending and doing...";
code uchar audiostr[]="Audio switch";
code uchar videostr[]="Video switch";
code uchar avstr[]="AV switch";
code uchar welstr[]="welcome to use av1616!!!";
code uchar ok[]="OK!!!";
code uchar from[]="from";
code uchar to[]="to";
code uchar inq[]="inquire";
code uchar a[]={0x41,0x41,0x41,0x41,0x41,0x41};




void lcddata(uchar dat);
void Delay5Ms(void);
void Delay400Ms(void);
void commandsend(uchar a);
void keydisp(uchar temp);
void lcddisplay(uchar x,uchar y,uchar *p);
void dispchar(uchar x,uchar y,uchar dat);
void locateXY(uchar posx,uchar posy);
void lcdwritedata(uchar dat);
void lcdwritecmd(uchar dat);
void delay(uchar d);




/*==================================
初始化程序
==================================*/
void init(void)
{
IE=0;
EA=1;
ES=1;
EX0=1;
IP=0;
PS=1;
PX0=1;
PSW=0;
SCON=0x50;
PCON=0x00;
TMOD=TMOD&0x0f;
TMOD=TMOD|0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
P1=0;
}








/*==================================
lcd复位程序
==================================*/
void lcdreset(void)
{
lcdwritecmd(0x38); //指令6:8位总线,双行显示,5*7矩阵显示//
Delay5Ms();
lcdwritecmd(0x38); //指令6:8位总线,双行显示,5*7矩阵显示//
Delay5Ms();
lcdwritecmd(0x38); //指令6:8位总线,双行显示,5*7矩阵显示//
Delay5Ms();
lcdwritecmd(0x08); //指令4:关显示//
delay(0xff);
lcdwritecmd(0x01); //指令1:清显示数据//
delay(0xff);
lcdwritecmd(0x06); //指令3输入模式,光标移位//
delay(0xff);
lcdwritecmd(0x0c); //指令4:开显示,有关标,但关标不闪//
delay(0xff);
}








/*=====================================
二号164芯片输出数据,也是lcd的数据写入
=====================================*/
void lcddata(uchar dat)
{
uchar i;
SCK=0;
commandsend(dat);
for(i=0;i<8;i++)
{dat<<=1;
SDA=Cy;
SCK=0;
delay(0xff);
SCK=1;
}
//commandsend(dat);
//delay(0xff);
SCK=0;
}











/*=================================
发送程序,发送命令和查询
=================================*/
void commandsend(uchar temp)
{
SBUF=temp;while(TI==0);TI=0;
}











/*==========================================
lcd显示
==========================================*/
void lcddisplay(uchar x,uchar y,uchar *p)
{
uchar i,l;
l=0;
while(p[l]>=32){l++;}
for(i=0;i<l;i++)
{dispchar(x+i,y,p[i]);
if((x+i)==16)
{x=0;y=y^1;}
}
}






/*================================
显示字符
================================*/
void dispchar(uchar x,uchar y,uchar dat)
{
locateXY(x,y);
Delay5Ms();
lcdwritedata(dat);
}




/*=============================
光标定位
=============================*/
void locateXY(uchar posx,uchar posy)
{
uchar temp;
temp=posx&0x0f;
posy=posy&0x01;
if(posy){temp=temp|0x40;}
temp=temp|0x80; //写地址//
lcdwritecmd(temp);
}





/*===================================
lcd写命令
===================================*/
void lcdwritecmd(uchar dat)
{
lcddata(dat);
ID=0;
W=0;
EN=0;
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
EN=1;
}





/*===================================
写入数据
===================================*/
void lcdwritedata(uchar dat)
{
lcddata(dat);
ID=1;
W=0;
EN=0;
Delay400Ms();
Delay400Ms();
Delay400Ms();
Delay400Ms();
EN=1;
}














/*======================================
中断接收
======================================*/
void serialportISR(void)interrupt 4 using 3
{
//uchar temp;
if(RI==1)
{ES=0;
while(RI==0);RI=0;
if(SBUF!=0xAA)goto EXT;
while(RI==0);RI=0;
if(SBUF==0x80)//program download
{while (RI==0); RI=0;
if (SBUF!=0x00) goto EXT; //首码
while (RI==0); RI=0;
if (SBUF!=0x44) goto EXT; //首码
//while (RI==0); RI=0;
delay(0xffff);
delay(0xffff);
delay(0xffff);
delay(0xffff);
}
EXT:
ES=1;
}
}










/*=================================
延迟
=================================*/
void delay(uchar d)
{
uchar y;
for(y=0;y<d;y++);
}



// 短延时
void Delay5Ms(void)
{
uint i = 8552;//5552;
while(i--);
}




//长延时
void Delay400Ms(void)
{
uchar i;
for(i=0;i<80;i++)
{Delay5Ms();}
}








void main(void)
{init();
//keyreset();
lcdreset();
delay(0xff);
lcddisplay(0,0,welstr);
delay(0xff);
lcddisplay(0,1,welstr);
delay(0xff);
while(1)
{//keyinput();
lcddisplay(0,0,welstr);
}
//delay(0xffff);
//delay(0xffff);
//delay(0xffff);}
}

htnw134 2007-08-01
  • 打赏
  • 举报
回复
现在我也搞不清楚了,好混乱啊!!这个东西一开始以为很简单,现在搞了几天了!!真晕阿!!其实我很相信你的程序,可是我的就是显示不出来啊。我的要么不显示,要么显示一些乱码,例如:我要显示welcome,它就显示了整一个屏幕的w,然后又不显示elc了,接着又显示了o,也是整个屏幕的。然后又不显示了。很久都不显示,然后它又干脆来一些日文的,或者是数字的,也是整个屏幕!!好郁闷阿!!
我一直怀疑是由于这个显示是一个慢显示装置,所以我在程序中延时了很多,但结果还是一样!!请问dpear() ,,你有什么看法阿??教教我!!谢谢哦!!呵呵 !
dpear 2007-08-01
  • 打赏
  • 举报
回复
这个程序我测试过,能用的
不知道你看到的是哪的资料
功能设置为01111000是没错的
---------------------------------------------------------------
基本操作时序:
1.读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
2.写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:无
3.读数据:输入:RS=H,RW=H,E=H 输出:D0~D7=数据
4.写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无
---------------------------------------------------------------
dpear 2007-07-31
  • 打赏
  • 举报
回复
昨天刚学的1602
哈,跟你分享一下
RS   EQU  P3.4
    RW   EQU  P3.5
    E   EQU  P3.6

    ORG   0000H
    AJMP   START
    ORG   0033H
START: MOV   SP,#60H
MAIN:  LCALL  DELAY    ;延时一段时间
    MOV   P1,#01H   ;写指令01H,清屏
    LCALL  ENABLE
    MOV   P1,#38H   ;写指令38H,设定LCD为16*2显示,5*7点阵,8位数据接口
    LCALL  ENABLE
    MOV   P1,#0FH   ;写指令0FH,显示ON,光标ON,闪烁ON
    LCALL  ENABLE
    MOV   P1,#06H   ;写指令06H,光标输入方式增量移位
    LCALL  ENABLE

    MOV   P1,#80H   ;第一行起始字符地址
    LCALL  ENABLE
    MOV   DPTR,#TABLE1 ;第一行显示字符表头地址
    LCALL  DISP     ;显示第一行数据
    MOV   P1,#0C0H   ;第二行起始字符地址
    LCALL  ENABLE
    MOV   DPTR,#TABLE2 ;第二行显示字符表头地址
    LCALL  DISP     ;显示第二行数据
    AJMP  MAIN     ;返回主程序循环
    ;-----------------
ENABLE: CLR   RS      ;写指令子程序(请参照1602LCD使用说明书)
    CLR   RW
    CLR   E
    LCALL  DELAY
    SETB   E
    RET
    ;-----------------
DISP:  MOV   R1,#16    ;准备显示一行16个字符
LOOP:  MOV   A,#00H    ;将ACC清零
    MOVC   A,@A+DPTR  ;查表取得要显示的数据
    LCALL  DISP1     ;写入一个数据
    INC   DPTR     ;数据表指针加1,准备取下一个数据
    DJNZ   R1,LOOP    ;一行没有显示完就继续
    RET
    ;-----------------
DISP1: MOV   P1,A     ;写1字节数据到显示端口
    SETB   RS      ;写数据时序(请参照1602LCD使用说明书)
    CLR   RW
    CLR   E
    LCALL  DELAY
    SETB   E
    RET
    ;-----------------
DELAY: MOV   R7,#255   ;延时子程序
D1:   MOV   R6,#255
D2:   DJNZ   R6,D2
    DJNZ   R7,D1
    RET
TABLE1: DB " welcome! "
TABLE2: DB " www.csdn.com.cn "

     END
Dai_Weis 2007-07-30
  • 打赏
  • 举报
回复
有个网站,有些资料可以看看,不过不是做广告
http://www.sunman.com.cn/web/default.asp

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧