搜索
bottom↓
回复: 44

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

[复制链接]

出0入0汤圆

发表于 2012-9-5 17:15:31 | 显示全部楼层 |阅读模式
买了一个1602液晶屏想显示点东西玩 但是接上怎么都不现实  用的程序是 郭天祥的那个,我就把里面的   RW RS和EN改了一下
但是总是失败 一直是方块

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




线没有问题  开始用的杜邦线 后来直接焊接的  都不行  求教各位大神

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="I LIKE MCU!";
  5. uchar code table1[]="WWW.TXMCU.COM";
  6. sbit lcden=P3^6;
  7. sbit lcdrw=P3^5;
  8. sbit lcdrs=P3^4;
  9. uchar num;


  10. void delay(uint z)
  11. {
  12.         uint x,y;
  13.         for(x=z;x>0;x--)
  14.                 for(y=110;y>0;y--);
  15. }
  16. void write_com(uchar com)
  17. {       
  18.         lcdrs=0;
  19.         P0=com;
  20.         delay(5);
  21.         lcden=1;
  22.         delay(5);
  23.         lcden=0;
  24. }

  25. void write_data(uchar date)
  26. {
  27.         lcdrs=1;
  28.         P0=date;
  29.         delay(5);
  30.         lcden=1;
  31.         delay(5);
  32.         lcden=0;
  33. }
  34. void init()
  35. {
  36.         lcdrw=0;
  37.         lcden=0;
  38.         write_com(0x38);
  39.         write_com(0x0e);
  40.         write_com(0x06);
  41.         write_com(0x01);
  42.         write_com(0x80+0x10);
  43. }
  44. void main()
  45. {
  46.         init();
  47.         for(num=0;num<11;num++)
  48.         {
  49.                 write_data(table[num]);
  50.                 delay(20);
  51.         }
  52. //        write_com(1);
  53.         write_com(0x80+0x53);
  54.         for(num=0;num<13;num++)
  55.         {
  56.                 write_data(table1[num]);
  57.                 delay(20);
  58.         }
  59.         for(num=0;num<16;num++)
  60.         {
  61.                 write_com(0x18);
  62.                 delay(20);
  63.         }
  64.         while(1);
  65. }


复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-9-5 17:24:49 | 显示全部楼层
好像是时钟问题,STC  1T和传统的51有区别的。不知道你用的是什么CPU

出0入0汤圆

发表于 2012-9-5 17:30:39 来自手机 | 显示全部楼层
1602上电复位慢,初始化前的延时弄长点看看。

出0入0汤圆

发表于 2012-9-5 17:34:34 | 显示全部楼层
也有可能是液晶屏的对比度没调好??被盖住了!!!

出0入0汤圆

发表于 2012-9-5 17:36:50 | 显示全部楼层
初始化前,加毫秒級延時

出0入0汤圆

发表于 2012-9-5 17:59:46 | 显示全部楼层
看你这凌乱的走线。。。。人家的程序在人家的板子上完全可以用,你最好再想想哪里和人家不同

出0入0汤圆

发表于 2012-9-5 18:08:53 | 显示全部楼层
呵呵,还是看看数据手册把,比你看别人的程序要好的很多。

出0入0汤圆

发表于 2012-9-5 18:09:22 | 显示全部楼层
其实1602的数据手册并不难,可以说非常的简单。

出0入0汤圆

 楼主| 发表于 2012-9-5 18:09:59 | 显示全部楼层
LM1876 发表于 2012-9-5 17:24
好像是时钟问题,STC  1T和传统的51有区别的。不知道你用的是什么CPU

SCT89c51这个

出0入0汤圆

发表于 2012-9-5 18:12:57 | 显示全部楼层
第一行是这个样子,说明初始化没有成功呢。慢慢调先。我回去了给你程序你自己对照下。

出100入2764汤圆

发表于 2012-9-5 18:20:29 | 显示全部楼层
时序的问题,要有耐心哦

出0入0汤圆

发表于 2012-9-5 18:22:47 | 显示全部楼层
1602是液晶入门初级产品,自己按照时序研究。不要指望大家指点你,等你自己搞懂了,接下来其他的液晶就手到擒来了。
祝你好运!!

出0入0汤圆

发表于 2012-9-5 19:52:09 | 显示全部楼层
rundll32 发表于 2012-9-5 18:09
SCT89c51这个

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

#define  NOP() { _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[0]='1';       
        dis_buf1[1]='2';
        dis_buf1[2]='3';         
        dis_buf1[3]='4';               
        dis_buf1[4]=' ';
        dis_buf1[5]=32;
        dis_buf1[6]=53;                 
   dis_buf1[7]=13;       
        dis_buf1[8]=23;               
        dis_buf1[9]=' ';         
        dis_buf1[10]=' ';         
        dis_buf1[11]=' ';
        dis_buf1[12]=' ';
        dis_buf1[13]=5+48;       
        dis_buf1[14]=6+48;       
        dis_buf1[15]=' ';                                      
        dis_buf2[0]=' ';
        dis_buf2[1]=' ';
        dis_buf2[2]=8+48;
        dis_buf2[3]=8+48;
        dis_buf2[4]=8+48;
    dis_buf2[5]=9+48;
        dis_buf2[6]=9+48;
        dis_buf2[7]=' ';  
        dis_buf2[8]='F';
        dis_buf2[9]='C';
    dis_buf2[10]=1+48;
    dis_buf2[11]=1+48;
    dis_buf2[12]=1+48;
        dis_buf2[13]=1+48;
        dis_buf2[14]='A';
        dis_buf2[15]=' ';
   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通过的

出0入33汤圆

发表于 2012-9-5 20:03:24 | 显示全部楼层
楼主加油,论坛有牛人手拨都能显示,相信应该不难的。

出0入0汤圆

发表于 2012-9-5 20:07:42 | 显示全部楼层
上面都说了,调一调对比度试试~

出0入0汤圆

发表于 2012-9-5 20:09:49 | 显示全部楼层
对比度 没调好吧     都出现那么严重的鬼影了

出0入0汤圆

发表于 2012-9-5 21:48:44 | 显示全部楼层
本帖最后由 chengzepeng 于 2012-9-5 22:04 编辑



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

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

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

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

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

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

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

  11. void wr_dat(uchar com,dat)        // 1602写指令,com=0为写入指令,com=1为写入数据
  12. {
  13.    RS=com;
  14.    delay_us(12);
  15.    EN=1;
  16.    delay_us(120);
  17.    P1=dat;
  18.    delay_us(120);
  19.    EN=0;
  20.    delay_us(120);
  21. }

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

  30. void display(uchar *p)//显示子程序
  31. {
  32.    while(*p!='\0')
  33.    {
  34.       wr_dat(1,*p);
  35.       p++;
  36.    }
  37. }

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

  45. }

  46. void main()
  47. {  
  48.    init_play();//1602初始化显示
  49.    while(1)
  50.    {
  51.                 TP = 0;
  52.                 delay_us(100);                 // 100 x uS延时测试(AT89C51实测807uS)
  53.                 TP = 1;
  54.    }
  55. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-5 21:49:21 来自手机 | 显示全部楼层
加油,这个太初级,想进步就得自己战胜自己。

出0入4汤圆

发表于 2012-9-5 21:50:13 | 显示全部楼层
对比度没调好吧

出0入0汤圆

发表于 2012-9-5 22:11:10 | 显示全部楼层
楼上各位,对比度没调好第一行的方块是看不见的
如果硬件没问题楼主看看软件吧,另外液晶的IO口不要接其他的器件

出0入0汤圆

发表于 2012-9-5 22:45:19 | 显示全部楼层
关注,学习一下。。。。

出0入0汤圆

发表于 2012-9-5 23:00:50 | 显示全部楼层
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序里面的P0改成P1应该可以了的,
那个程序我仿真是有显示的,
虽然显示不全!

出0入0汤圆

发表于 2012-9-5 23:04:04 | 显示全部楼层
我用stm32搞1602的4位总线模式驱动,花了3天。
走了一些弯路,主要是因为不小心使用了stm32的PB4管脚,
这个PB4管脚比较特殊一点,要把它的Jtag功能屏蔽掉才能当普通IO口用

出0入0汤圆

发表于 2012-9-5 23:22:54 | 显示全部楼层
调时序还是有示波器好啊

出0入42汤圆

发表于 2012-9-5 23:34:03 | 显示全部楼层
上电复位后,延时几十毫秒到一百多毫秒后再初始化LCD

出0入0汤圆

发表于 2012-9-6 05:29:50 来自手机 | 显示全部楼层
Most of the issues are due to inability to read and understand the datasheet.

出0入0汤圆

 楼主| 发表于 2012-9-6 08:10:15 | 显示全部楼层
chengzepeng 发表于 2012-9-5 23:00
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

多谢 我正想仿真嗯

出0入0汤圆

 楼主| 发表于 2012-9-6 08:47:31 | 显示全部楼层
chengzepeng 发表于 2012-9-5 23:00
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

程序里面就是P1

出0入0汤圆

 楼主| 发表于 2012-9-6 08:49:03 | 显示全部楼层
chengzepeng 发表于 2012-9-5 23:00
楼主你的你的程序写的是P0,但是你说实物液晶的数据线接到了P1,所以不管你怎么搞都不会有显示的,
把程序 ...

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

出0入0汤圆

发表于 2012-9-6 08:49:03 | 显示全部楼层
初始化不成功!

出0入54汤圆

发表于 2012-9-6 09:01:27 | 显示全部楼层
对比度问题吧  看看象
头像被屏蔽

出0入0汤圆

发表于 2012-9-6 09:09:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2012-9-6 09:20:51 | 显示全部楼层
出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前烧过1602,之后就是出现方块!

出0入0汤圆

 楼主| 发表于 2012-9-6 10:05:58 | 显示全部楼层
boostchopper 发表于 2012-9-6 09:20
出现方块???
快去调调对比度!!!对比度调好了,1602复位是看不到的!
还有,也可能是烧掉了!!我之前 ...

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

出0入0汤圆

 楼主| 发表于 2012-9-6 10:16:18 | 显示全部楼层
楼上各位 问题已经解决了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-6 18:20:47 | 显示全部楼层
呵呵,恭喜

出0入0汤圆

发表于 2013-5-30 22:26:24 | 显示全部楼层
怎么好的,我遇到同样的问题,怎么调都不好

出0入0汤圆

发表于 2013-5-30 22:42:36 | 显示全部楼层
楼主是对比度每调,我以前自己画板子的时候直接把1602三脚接地就是这个情况

出0入0汤圆

发表于 2013-5-30 23:56:06 来自手机 | 显示全部楼层
1602是很简单的。楼主先查一下硬件电路,确保没问题的话再看看程序

出0入0汤圆

发表于 2013-5-31 00:22:24 | 显示全部楼层
看楼主搞定了,恭喜了,

出0入0汤圆

发表于 2013-5-31 22:36:45 | 显示全部楼层
目测楼主里面的端口错了,你接的是P1,代码里定义的是P0???

出0入0汤圆

发表于 2013-6-1 10:59:57 | 显示全部楼层
rundll32 发表于 2012-9-5 18:09
SCT89c51这个

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

出0入0汤圆

发表于 2013-6-2 14:50:23 | 显示全部楼层
楼主都没说是什么问题搞好的?初学者想知道?

出0入0汤圆

发表于 2013-6-3 11:38:31 | 显示全部楼层
我也正在搞,MARK一下,LZ加油啊

出0入0汤圆

发表于 2018-1-23 23:45:41 | 显示全部楼层
jinmailang 发表于 2013-5-30 22:26
怎么好的,我遇到同样的问题,怎么调都不好

这情况我碰到过
那是因为读写时序不对早成的
请修改读写的时序就可以解决
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 15:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表