搜索
bottom↓
回复: 24

哪位有耐心的朋友请进来帮我看下我写的LCD 1602 的驱动程序,怎么不能显示字符。

[复制链接]

出0入0汤圆

发表于 2009-11-10 00:42:07 | 显示全部楼层 |阅读模式
大家帮我看一下下面这个程序,哪里有问题。我用的 LCD1602液晶屏。我想让它显示一个A。为什么不能显示。我实在想不出来。发个贴请教下大家。
哪位高用能帮我分析一下。小弟感激不尽。


//定义引脚。
#define   LCD_DATA   P0                         
#define   LCD_EN     P2_3
#define   LCD_RS     P2_1
#define   LCD_RW     P2_2

typedef unsigned char  uint8;
typedef unsigned int   uint16;

#include <REGX51.H>
//主函数。
void main ( void )
{

  delay_ms ( 400 );
  LCD_intal ( );
  delay_ms  ( 2 );
  writer_addr  ( 0, 5,'A' );
  delay_ms  ( 2 );


}


//写数据时序。
void  writer_date_timing   ( uint8  date  )
{

LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = date;
delay_us ( 3 );
LCD_EN = 0;
LCD_EN = 1;
delay_ms ( 1 );
LCD_EN = 0;

}

//写命时序。
void  writer_Command  ( uint8 order )
{
   LCD_RS = 0;
   LCD_RW = 0;
   LCD_DATA = order;
   delay_us ( 3 );
   LCD_EN = 0;
   LCD_EN = 1;
   delay_ms ( 1 );
   LCD_EN = 0;
   

  }


//初始化LCD1602
void  LCD_intal ( void )
{
   uint8 n = 3;
   LCD_DATA = 0;
   while ( n-- )                //设三次模式。
   {
      writer_Command ( 0x38 );
          delay_ms ( 5 );
        }

   
   Lcd_WaitBusy ( );            //检测是否为忙时。
   writer_Command ( 0x38 );
   Lcd_WaitBusy ( );
   writer_Command ( 0x01 );          //清屏。
   Lcd_WaitBusy ( );
   writer_Command ( 0x06 );          //功能设置画面不动。
   Lcd_WaitBusy ( );
   writer_Command ( 0x0c );          //开显示开关。
   ;


}


//检测是否为忙时。
uint8 Lcd_WaitBusy ( void )
{
    uint8 Busy = 0x80;
     LCD_DATA = 0xFF;
     LCD_RS = 0;
     LCD_RW = 1;
     LCD_EN = 0;
     LCD_EN = 1;
         delay_ms ( 1 );
     LCD_EN = 1;
     while ( LCD_DATA & Busy ); //检测忙信号
     LCD_EN = 0;
     return(LCD_DATA);       //若不处于忙状态显示字符
}

//设置显示位置。
void writer_addr  ( uint8 x, uint8 y, uint8 addr )
{
   
   y &= 0x1;
   x &= 0xF;
   
   LCD_RS = 0;   
   LCD_RW = 0;
   x |= 0x80; // 算出指令码
   if ( x )
   LCD_DATA  = x;
   delay_us ( 5 );
   LCD_EN = 0;
   LCD_EN = 1;
   delay_us ( 1 );
   LCD_EN = 0;

  writer_date_timing ( addr );  写入字符。  
   
  }
//延时MS
void  delay_ms ( uint16 ms )
{
  uint16 i,n;
   for ( i = 0; i < ms; i++ )
     for ( n = 0; n < 1000; n++ );
       
       
  }

//延时US。
void  delay_us ( uint16 us )
{
while ( us-- );
}

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-11-10 02:18:36 | 显示全部楼层
1602的代码网上一大堆,看看你的第3脚接的电位器,调一下对比度试试。不要以为看不了就不行。

出0入0汤圆

 楼主| 发表于 2009-11-10 08:22:46 | 显示全部楼层
调 VO 脚是控制每个引脚上的电压。我也调过就是不行。

出0入0汤圆

发表于 2009-11-10 08:32:34 | 显示全部楼层
上拉电阻接了吗?

出0入0汤圆

 楼主| 发表于 2009-11-10 12:32:58 | 显示全部楼层
我用到的脚每个都接了上拉电阻。引脚的电压可达到5V。

出0入0汤圆

发表于 2009-11-10 12:37:13 | 显示全部楼层
给你个代码参考一下吧 点击此处下载 ourdev_501840.rar(文件大小:1K) (原文件名:1602.c.rar)

出0入0汤圆

 楼主| 发表于 2009-11-11 16:33:31 | 显示全部楼层

(原文件名:未命名.jpg)

真的快受不了了。我是按这个步骤来写的,也参考过网上很多的例子,就是不行,说LCD 是坏的吗。我仿真也不行。我调延时调长一点也不行,短一点也不行。LCD有这么难吗。

出0入0汤圆

发表于 2009-11-11 16:37:44 | 显示全部楼层
楼主一开始就把程序搞得那么复杂,说有什么问题,我们也找不出来,你自己也不知道。建议把多余的东西都去掉。

出0入0汤圆

发表于 2009-11-11 19:05:44 | 显示全部楼层
是不是延时少了。

出0入0汤圆

 楼主| 发表于 2009-11-11 20:03:32 | 显示全部楼层
把多余的东西都去掉。那我怎么知道有没有点亮屏了呢。最起码要显示个字符才知道屏跑了没有。

出0入0汤圆

发表于 2009-11-11 20:18:09 | 显示全部楼层
还是把实际接的电路拍一下发上来让大家帮你吧

出0入0汤圆

 楼主| 发表于 2009-11-11 21:10:31 | 显示全部楼层

(原文件名:1.jpg)

我是参照这个图连接的。希望大家帮一下忙。

出0入0汤圆

 楼主| 发表于 2009-11-12 20:33:20 | 显示全部楼层
自已顶一下。

出0入0汤圆

发表于 2009-11-12 20:45:51 | 显示全部楼层
端口设置软件和硬件 怎么不一样?

(原文件名:1.jpg)

出0入0汤圆

发表于 2009-11-12 20:46:57 | 显示全部楼层

(原文件名:1.jpg)

出0入0汤圆

 楼主| 发表于 2009-11-12 21:45:41 | 显示全部楼层
我今天把上面的程序改了下把光标设为闪动的时。在仿真时可以看到光标闪动。写字符进去就是不能显示字符。这我实在不明白,我看了很多网上这方面的东西,方法一样的。为什么就不行呢。有谁知道吗。

出0入0汤圆

 楼主| 发表于 2009-11-13 23:46:22 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2009-11-14 16:19:27 | 显示全部楼层
写数据写命令时三根控制线和数据线配合要严谨,,时序也要对,,没有命令和数据传送的时候要保证数据线为0x00,,再研究一下时序吧,,可能有收获,,

出0入0汤圆

发表于 2009-11-15 10:59:19 | 显示全部楼层
//写数据时序。
void  writer_date_timing   ( uint8  date  )
{
LCD_RS = 1;
LCD_RW = 0;  
LCD_EN = 1;
LCD_DATA = date;
delay_ms ( 1 );
LCD_EN = 0;
}

//写命时序。
void  writer_Command  ( uint8 order )
{
   LCD_RS = 0;
   LCD_RW = 0;
   LCD_EN = 1;
   LCD_DATA = order;
   delay_ms ( 1 );
   LCD_EN = 0;
  }

这样就应可以了

出0入0汤圆

发表于 2009-11-15 11:23:37 | 显示全部楼层
用的是5V逻辑吗?用3.3V逻辑好像是不行的!

出0入0汤圆

发表于 2009-11-15 12:18:24 | 显示全部楼层
看看我写的吧,什么都写好了的
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3703520&bbs_page_no=1&search_mode=4&search_text=maxbiger&bbs_id=9999

出0入0汤圆

发表于 2009-11-15 18:12:40 | 显示全部楼层
E使能之前最好清零数据线,,解除使能之后也清零数据线~~

出0入0汤圆

 楼主| 发表于 2009-11-17 10:45:00 | 显示全部楼层
谢谢大家

出0入0汤圆

发表于 2009-12-9 20:26:27 | 显示全部楼层
没关注别的,就是发现楼主的主程序没死循环。程序跟定跑飞,还不知编译能过不?

出0入0汤圆

发表于 2011-12-17 13:40:08 | 显示全部楼层
弄了好久了 1602LCD还是跟没有初始化一样 显示一排小黑块
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 12:20

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

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