社区
单片机/工控
帖子详情
lcd1602 显示的问题
htnw134
2007-07-29 12:17:59
最近用了1602的显示器,但对它不是很懂,看了说明书还是一样,想问一下,它显示时怎么样显示一行字符,有个例子最好啦!!1谢谢大家了
...全文
1025
8
打赏
收藏
lcd1602 显示的问题
最近用了1602的显示器,但对它不是很懂,看了说明书还是一样,想问一下,它显示时怎么样显示一行字符,有个例子最好啦!!1谢谢大家了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
51单片机的步进电机控制,
lcd1602
显示
电机转动方向及转速,用矩阵键盘调整方向及速度,包含c源码及proteus仿真
51单片机的步进电机控制,
lcd1602
显示
电机转动方向及转速,用矩阵键盘调整方向及速度,包含c源码及proteus仿真
stc12c5a60s2 AD转换用
LCD1602
显示
程序
使用stc12c5a60s2单片机的内部AD转换,将AD转换的数据用
LCD1602
显示
。用按键控制
显示
AD转换中的具体通道。测试已无
问题
,绝对有效。
lcd1602
显示
问题
lcd1602
显示
不清楚,正面看不清,从侧面可以看清,正面
显示
方块。
问题
描述: 原因分析:
LCD1602
的ov引脚没有接入适当的电阻。 解决方案: 接入10k欧姆的可调电阻。
lcd1602
c语言编程原理,简述
lcd1602
工作原理
lcd1602
显示
原理
1,
lcd1602
显示
原理
LCD1602
显示
简介 ①
LCD1602
液晶
显示
原理
LCD1602
液晶
显示
的原理是利用液晶的物理特性,通过电压对其
显示
区域进行控制,有电就有
显示
,这样即可以
显示
出图形。液晶
显示
器具有厚度薄、适用于大规模...
3. 51——
LCD1602
显示
字符、字符串、数字
51——
LCD1602
显示
字符 或 字符串
LCD1602
简介
LCD1602
相关引脚
LCD1602
写命令、写数据相关操作图写指令 代码写数据 代码
LCD1602
显示
程序步骤及如何初始化
显示
开关控制指令进入模式设置指令功能设定指令清屏指令设置从...
单片机/工控
27,373
社区成员
28,771
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章