社区
单片机/工控
帖子详情
lcd1602 显示的问题
htnw134
2007-07-29 12:17:59
最近用了1602的显示器,但对它不是很懂,看了说明书还是一样,想问一下,它显示时怎么样显示一行字符,有个例子最好啦!!1谢谢大家了
...全文
1072
8
打赏
收藏
lcd1602 显示的问题
最近用了1602的显示器,但对它不是很懂,看了说明书还是一样,想问一下,它显示时怎么样显示一行字符,有个例子最好啦!!1谢谢大家了
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
关于
LCD1602
显示
问题
的解决方法(只亮屏或只
显示
方块)(基于普中A2开发板STC89C52RC)
lcd1602
51单片机
LCD1602
显示
问题
解决方法: 只亮屏:调节背后电位器,从最大慢慢回调至合适亮度。 只
显示
方块:检查并插稳
显示
屏引脚。 正确操作后即可正常
显示
字符。
lcd1602
显示
问题
lcd1602
显示
不清楚,正面看不清,从侧面可以看清,正面
显示
方块。
问题
描述: 原因分析:
LCD1602
的ov引脚没有接入适当的电阻。 解决方案: 接入10k欧姆的可调电阻。
51单片机学习
问题
——
lcd1602
显示
问题
(只亮屏或者黑块)
能够碰到上述的现象的任意一种的时候,就需要调节对比度端口,数据有可能已经写入了,只是没有
显示
出来,经实验证实,带背光的1602 lcd在上电复位的成功的时候,调整正确是看不清一行黑块的.而输出的时候则能正常
显示
.一般是将对比度端口接入一个可调电阻,比如10k的可调电阻.可考虑上拉电阻
问题
和端口是否命名正确。(根据自己的函数名修改)
3. 51——
LCD1602
显示
字符、字符串、数字
51——
LCD1602
显示
字符 或 字符串
LCD1602
简介
LCD1602
相关引脚
LCD1602
写命令、写数据相关操作图写指令 代码写数据 代码
LCD1602
显示
程序步骤及如何初始化
显示
开关控制指令进入模式设置指令功能设定指令清屏指令设置从(x,y)开始
显示
显示
字符 或 字符串
显示
字符
显示
字符串接线图代码整合
LCD1602
.c
LCD1602
.hmain.c效果展示
LCD1602
简介
LCD1602
相关引脚
LCD1602
写命令、写数据相关操作图 写指令 代码 void LCD_WriteComm
lcd1602
c语言编程原理,简述
lcd1602
工作原理
lcd1602
显示
原理
1,
lcd1602
显示
原理
LCD1602
显示
简介 ①
LCD1602
液晶
显示
原理
LCD1602
液晶
显示
的原理是利用液晶的物理特性,通过电压对其
显示
区域进行控制,有电就有
显示
,这样即可以
显示
出图形。液晶
显示
器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色
显示
的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②
LCD1602
液晶
显示
器的分类 液晶
显示
的分类...
单片机/工控
27,511
社区成员
28,797
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章