rundll32 发表于 2012-9-5 17:15:31

新手求助 快疯了1602搞了一天

买了一个1602液晶屏想显示点东西玩 但是接上怎么都不现实用的程序是 郭天祥的那个,我就把里面的   RW RS和EN改了一下
但是总是失败 一直是方块

我得 数据是接的P1然后 RS是P3.4RW 3.5EN 3.6




线没有问题开始用的杜邦线 后来直接焊接的都不行求教各位大神
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LIKE MCU!";
uchar code table1[]="WWW.TXMCU.COM";
sbit lcden=P3^6;
sbit lcdrw=P3^5;
sbit lcdrs=P3^4;
uchar num;


void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)
{       
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init()
{
        lcdrw=0;
        lcden=0;
        write_com(0x38);
        write_com(0x0e);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80+0x10);
}
void main()
{
        init();
        for(num=0;num<11;num++)
        {
                write_data(table);
                delay(20);
        }
//        write_com(1);
        write_com(0x80+0x53);
        for(num=0;num<13;num++)
        {
                write_data(table1);
                delay(20);
        }
        for(num=0;num<16;num++)
        {
                write_com(0x18);
                delay(20);
        }
        while(1);
}


LM1876 发表于 2012-9-5 17:24:49

好像是时钟问题,STC1T和传统的51有区别的。不知道你用的是什么CPU

kalo 发表于 2012-9-5 17:30:39

1602上电复位慢,初始化前的延时弄长点看看。

nanning2011 发表于 2012-9-5 17:34:34

也有可能是液晶屏的对比度没调好??被盖住了!!!

devcang 发表于 2012-9-5 17:36:50

初始化前,加毫秒級延時

yirenonege 发表于 2012-9-5 17:59:46

{:smile:}看你这凌乱的走线。。。。人家的程序在人家的板子上完全可以用,你最好再想想哪里和人家不同

yj518 发表于 2012-9-5 18:08:53

呵呵,还是看看数据手册把,比你看别人的程序要好的很多。

yj518 发表于 2012-9-5 18:09:22

其实1602的数据手册并不难,可以说非常的简单。

rundll32 发表于 2012-9-5 18:09:59

LM1876 发表于 2012-9-5 17:24 static/image/common/back.gif
好像是时钟问题,STC1T和传统的51有区别的。不知道你用的是什么CPU

SCT89c51这个

402261102 发表于 2012-9-5 18:12:57

第一行是这个样子,说明初始化没有成功呢。慢慢调先。我回去了给你程序你自己对照下。

WUWEWU 发表于 2012-9-5 18:20:29

时序的问题,要有耐心哦

lvyunzeng 发表于 2012-9-5 18:22:47

1602是液晶入门初级产品,自己按照时序研究。不要指望大家指点你,等你自己搞懂了,接下来其他的液晶就手到擒来了。
祝你好运!!

LM1876 发表于 2012-9-5 19:52:09

rundll32 发表于 2012-9-5 18:09 static/image/common/back.gif
SCT89c51这个

#include "lcd1602.h"
#include "..\main\ext_reg.h"
#include "..\main\port.h"
#include <intrins.h>       

#defineNOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}
#define_nop_() {;}

/*****************LCD初始化设定****************/
void lcd_init()
{       
uchar i;
   mDisplay_count=0;                                       
        lcd_wcmd(0x38);                //设置LCD为16X2显示,5X7点阵,八位数据接口00111000
   for (i=0;i<125;i++){NOP();NOP();}
   lcd_wcmd(0x38);
       for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x0c);                //LCD开显示及光标设置(光标不闪烁,不显示"-")
   for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x06);                //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
   for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x01);                //清除LCD的显示内容
   for (i=0;i<125;i++){NOP();}
}

void LCD_Update()
{
   if(mDisplay_count)
   {
         mDisplay_count--;
         return;
   }
             LCD_DisPosCode();
          mDisplay_count = 5;
         }


void LCD_DisPosCode()       
{                                                       
        dis_buf1='1';       
        dis_buf1='2';
        dis_buf1='3';         
        dis_buf1='4';               
        dis_buf1=' ';
        dis_buf1=32;
        dis_buf1=53;               
   dis_buf1=13;       
        dis_buf1=23;               
        dis_buf1=' ';       
        dis_buf1=' ';       
        dis_buf1=' ';
        dis_buf1=' ';
        dis_buf1=5+48;       
        dis_buf1=6+48;       
        dis_buf1=' ';                                    
        dis_buf2=' ';
        dis_buf2=' ';
        dis_buf2=8+48;
        dis_buf2=8+48;
        dis_buf2=8+48;
    dis_buf2=9+48;
        dis_buf2=9+48;
        dis_buf2=' ';
        dis_buf2='F';
        dis_buf2='C';
    dis_buf2=1+48;
    dis_buf2=1+48;
    dis_buf2=1+48;
        dis_buf2=1+48;
        dis_buf2='A';
        dis_buf2=' ';
   pro_display();
}
/**********************LCD显示处理程序********************/
void pro_display()
{        uchar i;
        lcd_pos(0x00);        //第一行
        for (i=0;i<=15;i++)
                {lcd_wdat(dis_buf1);}

        lcd_pos(0x40);//第二行
        for (i=0;i<=15;i++)
                {lcd_wdat(dis_buf2);}
}



/**************检测LCD忙**********************/
bit lcd_busy()
{        uint i,j;
        bit result;
        RS = 0;
        RW = 1;
        EN = 1;
   i = 30;            
   while(i>0) i--;
   j=P2;
   result =j & 0x80;        //D7=1为忙碌,D7=0为空闲
        EN = 0;
        return result;       
}

/**************写入指令到LCD**********************/
void lcd_wcmd(uchar cmd)
{       
if(lcd_busy()){return;};        //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
        RS = 0;   //RS=0,即是选择1602LCD的指令寄存器
        RW = 0;          //低电平为写操作
        EN = 0;       
        NOP();
        P2 = cmd; //送命令到P0口,即送一个字节的数据到LCD1602的指令寄存器中
        NOP();
    EN = 0;
        EN = 1;       //ep即使能端,由高电平跳变到低电平时,执行命令
    NOP();
        EN = 0;               
}

/****************写入数据到LCD*******************/
void lcd_wdat(char dat)       
{                                                       
        while(lcd_busy());        //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
        RS = 1;
        RW = 0;
        EN = 0;
        P2 = dat;
        NOP();
        EN = 1;       //ep即使能端,由高电平跳变到低电平时,执行命令
        EN = 1;
        EN = 0;       
        NOP();
}

//LCD数据指针位置程序
void lcd_pos(char pos)
{                                               
        lcd_wcmd(pos|0x80);        //数据指针=80+地址码(00H~27H,40H~67H)
}


你用这个参考下看看,这个我是用STC12C5A48S2通过的

vtte 发表于 2012-9-5 20:03:24

楼主加油,论坛有牛人手拨都能显示,相信应该不难的。

erxun 发表于 2012-9-5 20:07:42

上面都说了,调一调对比度试试~

Rocky_Zou 发表于 2012-9-5 20:09:49

对比度 没调好吧   都出现那么严重的鬼影了

chengzepeng 发表于 2012-9-5 21:48:44

本帖最后由 chengzepeng 于 2012-9-5 22:04 编辑



1602参考连接电路,IO建议都接在P0外的非共用IO上。

看手册的写周期可以允许小于1uS,也就是说普通的51如AT89x51(C或者S系列)延不延照样显示的!

国产的液晶可能因为生产厂家会有有个别不同!

所以测试的时候加大延时都不行那就要换个液晶或者检测线路了,比如把数据线接到了P0上了,这组IO要加上拉电阻!

给个测试代码如下!#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit RS=P2^0;        //LCD1602控制端与单片机的连接,P1接数据线
sbit EN=P2^1;
sbit TP=P3^0;

void delay_us(uint xus)        // AT89C51实测约循环一次延时8uS秒
{
        while(--xus);
}

void wr_dat(uchar com,dat)        // 1602写指令,com=0为写入指令,com=1为写入数据
{
   RS=com;
   delay_us(12);
   EN=1;
   delay_us(120);
   P1=dat;
   delay_us(120);
   EN=0;
   delay_us(120);
}

void lcd_init()//1602初始化设置
{
   wr_dat(0,0x38); //设置16*2显示,5*7点阵,8位数据接口
   wr_dat(0,0x08); //设置关显示,光标不显示,光标不闪烁
   wr_dat(0,0x01); //设置显示清屏
   wr_dat(0,0x06); //设置显示光标移动位置
   wr_dat(0,0x0c); //设置显示开及光标设置
}

void display(uchar *p)//显示子程序
{
   while(*p!='\0')
   {
      wr_dat(1,*p);
      p++;
   }
}

void init_play()//1602初始化显示
{   
    lcd_init();
    wr_dat(0,0x80);                         // 设置地址为第一行首
    display("0123456789");                   // 写字符串到第一行
    wr_dat(0,0xc0);                         // 设置地址为第二行首
    display("abcdefghijk");                // 写字符串到第二行

}

void main()
{
   init_play();//1602初始化显示
   while(1)
   {
                TP = 0;
                delay_us(100);                 // 100 x uS延时测试(AT89C51实测807uS)
                TP = 1;
   }
}

dingshidong214 发表于 2012-9-5 21:49:21

加油,这个太初级,想进步就得自己战胜自己。

wajlh 发表于 2012-9-5 21:50:13

对比度没调好吧

little_Monkey 发表于 2012-9-5 22:11:10

楼上各位,对比度没调好第一行的方块是看不见的
如果硬件没问题楼主看看软件吧,另外液晶的IO口不要接其他的器件

maxims 发表于 2012-9-5 22:45:19

关注,学习一下。。。。

chengzepeng 发表于 2012-9-5 23:00:50

楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序里面的P0改成P1应该可以了的,
那个程序我仿真是有显示的,
虽然显示不全!

codefish 发表于 2012-9-5 23:04:04

我用stm32搞1602的4位总线模式驱动,花了3天。
走了一些弯路,主要是因为不小心使用了stm32的PB4管脚,
这个PB4管脚比较特殊一点,要把它的Jtag功能屏蔽掉才能当普通IO口用

summarize 发表于 2012-9-5 23:22:54

调时序还是有示波器好啊

cocom 发表于 2012-9-5 23:34:03

上电复位后,延时几十毫秒到一百多毫秒后再初始化LCD

millwood0 发表于 2012-9-6 05:29:50

Most of the issues are due to inability to read and understand the datasheet.

rundll32 发表于 2012-9-6 08:10:15

chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

多谢 我正想仿真嗯

rundll32 发表于 2012-9-6 08:47:31

chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

程序里面就是P1

rundll32 发表于 2012-9-6 08:49:03

chengzepeng 发表于 2012-9-5 23:00 static/image/common/back.gif
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

哦哦哦对不起 看错 来 不好意思

xtxtt 发表于 2012-9-6 08:49:03

初始化不成功!

unifax001 发表于 2012-9-6 09:01:27

对比度问题吧看看象

waszyawcz 发表于 2012-9-6 09:09:16

boostchopper 发表于 2012-9-6 09:20:51

出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前烧过1602,之后就是出现方块!

rundll32 发表于 2012-9-6 10:05:58

boostchopper 发表于 2012-9-6 09:20 static/image/common/back.gif
出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前 ...

对比度调好了才能看见方块

rundll32 发表于 2012-9-6 10:16:18

楼上各位 问题已经解决了

alien_duck 发表于 2012-9-6 18:20:47

呵呵,恭喜

jinmailang 发表于 2013-5-30 22:26:24

怎么好的,我遇到同样的问题,怎么调都不好

zhaoqingtao008 发表于 2013-5-30 22:42:36

楼主是对比度每调,我以前自己画板子的时候直接把1602三脚接地就是这个情况

二进制 发表于 2013-5-30 23:56:06

1602是很简单的。楼主先查一下硬件电路,确保没问题的话再看看程序

gzrldt 发表于 2013-5-31 00:22:24

看楼主搞定了,恭喜了,

玉洋子 发表于 2013-5-31 22:36:45

目测楼主里面的端口错了,你接的是P1,代码里定义的是P0???

bbssilverkey 发表于 2013-6-1 10:59:57

rundll32 发表于 2012-9-5 18:09 static/image/common/back.gif
SCT89c51这个

修改延迟就可正常,话说1602真的很慢,还不如用5110一点都不用延迟

huq2012 发表于 2013-6-2 14:50:23

楼主都没说是什么问题搞好的?初学者想知道?

yangbing2020 发表于 2013-6-3 11:38:31

我也正在搞,MARK一下,LZ加油啊

lxa0 发表于 2018-1-23 23:45:41

jinmailang 发表于 2013-5-30 22:26
怎么好的,我遇到同样的问题,怎么调都不好

这情况我碰到过
那是因为读写时序不对早成的
请修改读写的时序就可以解决
页: [1]
查看完整版本: 新手求助 快疯了1602搞了一天