xiang_waiting 发表于 2009-11-10 00:42:07

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

大家帮我看一下下面这个程序,哪里有问题。我用的 LCD1602液晶屏。我想让它显示一个A。为什么不能显示。我实在想不出来。发个贴请教下大家。
哪位高用能帮我分析一下。小弟感激不尽。


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

typedef unsigned charuint8;
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 );


}


//写数据时序。
voidwriter_date_timing   ( uint8date)
{

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

}

//写命时序。
voidwriter_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
voidLCD_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
voiddelay_ms ( uint16 ms )
{
uint16 i,n;
   for ( i = 0; i < ms; i++ )
   for ( n = 0; n < 1000; n++ );
       
       
}

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

CoolBird007 发表于 2009-11-10 02:18:36

1602的代码网上一大堆,看看你的第3脚接的电位器,调一下对比度试试。不要以为看不了就不行。

xiang_waiting 发表于 2009-11-10 08:22:46

调 VO 脚是控制每个引脚上的电压。我也调过就是不行。

CoolBird007 发表于 2009-11-10 08:32:34

上拉电阻接了吗?

xiang_waiting 发表于 2009-11-10 12:32:58

我用到的脚每个都接了上拉电阻。引脚的电压可达到5V。

airwolf09921 发表于 2009-11-10 12:37:13

给你个代码参考一下吧 点击此处下载 ourdev_501840.rar(文件大小:1K) (原文件名:1602.c.rar)

xiang_waiting 发表于 2009-11-11 16:33:31

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502295.jpg
(原文件名:未命名.jpg)

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

qlb1234 发表于 2009-11-11 16:37:44

楼主一开始就把程序搞得那么复杂,说有什么问题,我们也找不出来,你自己也不知道。建议把多余的东西都去掉。

phone 发表于 2009-11-11 19:05:44

是不是延时少了。

xiang_waiting 发表于 2009-11-11 20:03:32

把多余的东西都去掉。那我怎么知道有没有点亮屏了呢。最起码要显示个字符才知道屏跑了没有。

LT1234567 发表于 2009-11-11 20:18:09

还是把实际接的电路拍一下发上来让大家帮你吧

xiang_waiting 发表于 2009-11-11 21:10:31

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502383.jpg
(原文件名:1.jpg)

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

xiang_waiting 发表于 2009-11-12 20:33:20

自已顶一下。

wanglituan 发表于 2009-11-12 20:45:51

端口设置软件和硬件 怎么不一样?
http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502667.jpg
(原文件名:1.jpg)

wanglituan 发表于 2009-11-12 20:46:57

http://cache.amobbs.com/bbs_upload782111/files_21/ourdev_502667.jpg
(原文件名:1.jpg)

xiang_waiting 发表于 2009-11-12 21:45:41

我今天把上面的程序改了下把光标设为闪动的时。在仿真时可以看到光标闪动。写字符进去就是不能显示字符。这我实在不明白,我看了很多网上这方面的东西,方法一样的。为什么就不行呢。有谁知道吗。

xiang_waiting 发表于 2009-11-13 23:46:22

顶一下

zhuyjgh 发表于 2009-11-14 16:19:27

写数据写命令时三根控制线和数据线配合要严谨,,时序也要对,,没有命令和数据传送的时候要保证数据线为0x00,,再研究一下时序吧,,可能有收获,,

xzbx 发表于 2009-11-15 10:59:19

//写数据时序。
voidwriter_date_timing   ( uint8date)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_DATA = date;
delay_ms ( 1 );
LCD_EN = 0;
}

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

这样就应可以了

falcon8663 发表于 2009-11-15 11:23:37

用的是5V逻辑吗?用3.3V逻辑好像是不行的!

maxbiger 发表于 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

zhuyjgh 发表于 2009-11-15 18:12:40

E使能之前最好清零数据线,,解除使能之后也清零数据线~~

xiang_waiting 发表于 2009-11-17 10:45:00

谢谢大家

niyubo 发表于 2009-12-9 20:26:27

没关注别的,就是发现楼主的主程序没死循环。程序跟定跑飞,还不知编译能过不?

xiaoyedeng 发表于 2011-12-17 13:40:08

弄了好久了 1602LCD还是跟没有初始化一样 显示一排小黑块
页: [1]
查看完整版本: 哪位有耐心的朋友请进来帮我看下我写的LCD 1602 的驱动程序,怎么不能显示字符。