[求助] 无法驱动1602LCD,帮忙找找原因;原因已查明,谢谢大家支持。

wyz9876   2012-3-21 00:24 楼主

无法驱动原因:

昨天换51单片机,点亮LCD没问题。由于是开发板,硬件电路是固定的。所以问题可能出在单片机或程序上。

说起来比较诡异。之前无法点亮的原因是单片机存在故障PORTC没正常工作

 

我利用PORTD=PORTC,PORTD.0能驱动LED灯。检验PORTC一直输出高电平。C端口不正常,A、B、D均正常。

确认了PORTC没正常工作。

 

然后编写小程序验证:

PORTC.0=~PORTC.0;

结果下进去后,LCD竟然显示了。。。无意中就显示了。(之前停断电多次,RST均无法显示。)

怀疑这种现象是由于单片机C端口出错?死机?没启动起来?

这种感觉,感觉人品好差。这种奇迹的事情竟然让我遇见了。

 

重新再次把原程序下载进去,一切正常,OK!

谢谢大家。程序正确。和我一样的新手菜鸟拿去学习。

 

程序通过Proteus仿真atmega16单片机能正常显示。下载到板子上,板子单片机为atmega16L结果不能显示。帮忙找找原因。

 

 

 

Proteus 仿真能点亮。

proteus结果.jpg

 

实际LCD无反应。

 

实际LCD.jpg

 

硬件电路错误的可能性不大。液晶无法确定好坏。(之前从没点亮过)

 

附上程序。程序很简单。

 

#include<mega16.h>
#include<delay.h>

#define uchar unsigned char
#define uint unsigned int

#define rs PORTC.0
#define rw PORTC.1
#define e  PORTC.2

 

void write_com(uchar com)
{
   rs=0;
   rw=0;
   PORTA=com;
   delay_ms(5);
   e=1;
   delay_us(10);
   e=0;
}

void write_data(uchar data)
{
    rs=1;
    rw=0;
    PORTA=data;
    delay_ms(5);
    e=1;
    delay_us(10);
    e=0;
}

 


void init()
{
     rw=0;
     e=0;
     write_com(0x36);
     write_com(0x0f);
     write_com(0x06);
     write_com(0x01);
     write_com(0x80);
}

void main()
{    PORTC=0x00 ;
     DDRC=0xff ;
     PORTA=0x00;
     DDRA=0xff;
     init();
     write_data('A');
     while(1);
}

[ 本帖最后由 wyz9876 于 2012-3-24 00:27 编辑 ]

回复评论 (16)

程序看起来挺对的 你看看调光电阻 调调看
点赞  2012-3-21 10:35
我也有这种疑问啊?
嵌入式培训www.51great.org
点赞  2012-3-21 11:07
建议调试下液晶对比度
点赞  2012-3-21 12:55

回复 沙发 常见泽1 的帖子

调过液晶对比度的,会使黑色方块变亮或变浅。不显示字母。
点赞  2012-3-21 18:59

回复 板凳 zhuoyue 的帖子

现在解决吗?解决了记得来帮我一把啊。
点赞  2012-3-21 19:00

回复 4楼 wstt 的帖子

调试过,不是对比度的问题。调试滑动变阻器会使黑方块变深或变浅。显示黑方块应该是LCD没驱动时默认的显示黑方块的。
点赞  2012-3-21 19:02
什么单片机?51的话P0口记得上拉!另外你可以试试点亮下半屏看看是不是上下同时黑块。
点赞  2012-3-21 19:50
多半是延时不对,而且注意LCD1602在写入数据的时候是上升沿写入还是下降沿写入(印象当中,proteus与实际使用的LCD1602不一样)。
点赞  2012-3-22 06:42
是不是融丝位没设置好呀
点赞  2012-3-22 07:03
时钟频率看看
点赞  2012-3-22 08:43
熔丝位 JTAGEN 去掉
点赞  2012-3-22 15:56
//#define lcd_bus    PORTB    // 数据总线
#define  rs        PORTA.5  // 数据&指令选择,H:写数据,L:写指令   
#define  rw       PORTA.6  // 读&写选择,H:read,L:write
#define  e         PORTA.7  // 读写使能
//#define  bf        7        // 忙闲状态标志位,PORTA.7,H:内部正执行操作,L:空闲

/*显示屏命令写入函数*/
void LCD_write_com(unsigned char com)
{  
         rs=0;;
         rw=0;
         e=1;
         PORTB = com;
         delayus(5);
         e=0;
}

  /*显示屏数据写入函数*/
void LCD_write_data(unsigned char data)
{
         rs=1;
         rw=0;
         e=1;
         PORTB = data;
         delayms(5);
         e=0;
}
/*显示屏清空显示*/
void LCD_clear(void)
{
         LCD_write_com(0x01);
         delayms(5);
}

  /*显示屏字符串写入函数*/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{     
         if (y == 0)
         {     
                LCD_write_com(0x80 + x);     
         }
         else
         {     
                LCD_write_com(0xC0 + x);     
         }        
         while (*s)
         {     
                LCD_write_data( *s);     
                s ++;     
         }
}
/*显示屏单字符写入函数*/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{     
         if (y == 0)
         {     
                LCD_write_com(0x80 + x);     
         }   
         else
         {     
                LCD_write_com(0xC0 + x);     
         }        
         LCD_write_data( data);  
}

/*显示屏初始化函数*/
void lcd_init(void)
{
  //unsigned char i;
   DDRB = 0xFF;      /*I/O口方向设置*/
   DDRA |= (1 << PORTA.5) | (1 <<  PORTA.6) | (1 <<  PORTA.7);
   LCD_write_com(0x38);    /*显示模式设置*/
   delayms(5);
   LCD_write_com(0x38);
   delayms(5);
   LCD_write_com(0x38);
   delayms(5);
   LCD_write_com(0x38);  
   LCD_write_com(0x0C);    /*显示关闭*/
   LCD_write_com(0x01);    /*显示清屏*/
   LCD_write_com(0x06);    /*显示光标移动设置*/
   delayms(5);
        LCD_write_str(0,0," Power By James ");
        LCD_write_str(0,1,"    Ver 1.01    ");  
    delayms(255);
   // LCD_write_str(0,0,"MEAS Prog");   
    //delayms(255);
    //LCD_write_str(0,1,"MEAS Prog");
       
}
点赞  2012-3-22 21:05
学习中。。。
点赞  2012-3-23 10:11

回复 9楼 honestapple 的帖子

我觉得多半是延时的问题,昨天晚上用人家原51的程序正确驱动LCD,我的程序基本没动。唯一和51有区别的可能就是时序了。LCD的时序图也研究了。没找出问题来。继续在寻找原因。
点赞  2012-3-23 22:25

回复 12楼 sunjun0000 的帖子

根据你的提示,试过好了。还是没能解决。
点赞  2012-3-23 22:35

回复 8楼 syaoraner 的帖子

at89s52点亮了。由52的程序改为现在的程序,仅稍加改动,atmega16L点不亮。下半屏点不亮。感觉好像命令就没正确执行。
点赞  2012-3-23 22:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复