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

2019-03-24 20:55发布

无法驱动原因: 昨天换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条回答
honestapple
2019-03-25 14:42
多半是延时不对,而且注意LCD1602在写入数据的时候是上升沿写入还是下降沿写入(印象当中,proteus与实际使用的LCD1602不一样)。

一周热门 更多>