打印

STC89C58RD+ 访问1602液晶的问题

[复制链接]
1965|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电路图如附件,小弟新手,还不会用protel,只好截图。
我用总线方式操作完全OK,
但是我尝试换成GPIO方式操作却发现一个问题。
当我往1602写命令的时候,写第一字节数据完全没问题,
但是写第二字节数据的时候去发现,写入的数据不是我欲写的数(通过发光二极管来看的,8个发光二极管和1602的8位数据口共用P0口),是一个固定的别的数。
我想写的是0x06,显示的确是0x0a

请教高手帮忙分析下为啥会为干扰,变成别的数,敬谢!


#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char

sbit LCDRS=P0^4;
sbit LCDRW=P0^3;
sbit LCDEN=P0^2;
sbit C51WR=P3^6;

void Delay(uchar count)
{
  uchar i;
  for(i=count;i>0;i--)
  {
    _nop_();
  }
}

void write_1602_instruction(uchar instruction)
{
P2=0xc0;
LCDEN=0;
LCDRS=0;
LCDRW=0;  //写指令准备;
Delay(5);   
LCDEN=1;
Delay(5);
P2=0xc8;
P0=instruction;
Delay(5);
LCDEN=0;  //禁能;
LCDRW=1;
}

void initialize(void)
{
C51WR=0;
write_1602_instruction(0x38);
write_1602_instruction(0x06);
write_1602_instruction(0x0f);
write_1602_instruction(0x01);
}
void main()
{
initialize();
while(1);
}

LCD1602.JPG (171.03 KB )

LCD1602.JPG

LCD1602(3).JPG (25.1 KB )

LCD1602(3).JPG

相关帖子

沙发
yanghans1983|  楼主 | 2010-3-22 23:53 | 只看该作者
各位大大,请别只是路过啊!
发表的见解!

使用特权

评论回复
板凳
ppsen| | 2010-3-23 00:12 | 只看该作者
你先直接将P0= 0x06,看看

使用特权

评论回复
地板
ppsen| | 2010-3-23 00:13 | 只看该作者
是不是没有改变

使用特权

评论回复
5
MCU-WorkGroup| | 2010-3-23 00:17 | 只看该作者
会不会是由于驱动的问题??路过

使用特权

评论回复
6
yanghans1983|  楼主 | 2010-3-23 00:31 | 只看该作者
直接将P0=0x06,LED显示的是正确的。

使用特权

评论回复
7
yanghans1983|  楼主 | 2010-3-23 00:55 | 只看该作者
纠结,俺把initialize中的写0x06和0x0f的拿掉了,发现写0x01的时候显示的也是正确的......
呼唤各位兄弟姐妹们来给点看法,有高手愿意指点更好!
void initialize(void)
{
C51WR=0;
write_1602_instruction(0x38);
//write_1602_instruction(0x06);
//write_1602_instruction(0x0f);
write_1602_instruction(0x01);
}

使用特权

评论回复
8
yanghans1983|  楼主 | 2010-3-23 14:50 | 只看该作者
俺错了,俺把0-f逐一写了一遍,发现写对的数,应该是碰巧
但是写错的数,都是显示同一个数,无论将其写多少遍(0x05,无论写多少次,都是显示0x09)
继续找问题去,希望有经验的大大也能帮俺查查错!谢谢!

使用特权

评论回复
9
yanghans1983|  楼主 | 2010-3-23 23:14 | 只看该作者
哎,应该是时序问题,先不研究了,先老老实实用总线方式。
等有机会仿真下时序看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

24

帖子

1

粉丝