搜索
bottom↓
回复: 17

RT1602A液晶按马潮老师书中四线连接方式,不能正常显示,只在上电初始时显示黑块或乱码

[复制链接]

出0入0汤圆

发表于 2010-3-9 16:24:17 | 显示全部楼层 |阅读模式
RT1602A液晶按马潮老师书中四线连接方式,只是原程序中的mega16改为mega128,而晶振由原程序中的4M改为11.0592M,经测试,不能正常显示,只在上电初始时显示黑块或乱码,请大家帮我一下,是何问题。如下:

连接方式:
(为使用cvavr自带的函数库。)
1)        与LCD的连接必须使用AVR的同一个8位的I/O端口,如PC(或者PA、PB、PD)。
2)        LCD采用4位并行传输方式(既仅用DB4—DB7,4位数据总线)。
3)        具体连接定义为(以PC口为例):
三根控制线    PC0----RS,PC1----R/W,PC2----E
四根数据线    PC4----DB4,PC5----DB5,PC6----DB6,PC7----DB7


程序:
/*********************************************
File name                   : demo_6_8.c
Chip type           : ATmega128
Program type        : Application
Clock frequency     : 11.0592MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/
#include <mega128.h>
#include <delay.h>

#asm
.equ __lcd_port=0x15         ; PORTC数据寄存器地址
#endasm
/*  [LCD]     
    1 GND- 9  GND
    2 +5V- 10 VCC  
    3 VLC- LCD HEADER Vo
    4 RS - 1  PC0 (M16)
    5 RD - 2  PC1 (M16)
    6 EN - 3  PC2 (M16)
   11 D4 - 5  PC4 (M16)
   12 D5 - 6  PC5 (M16)
   13 D6 - 7  PC6 (M16)
   14 D7 - 8  PC7 (M16) */
#include <lcd.h>
flash char dis_str[]="Hello World! This is a LCD display demo.";
void main(void)
{
        char flash *str;
        str = dis_str;
        lcd_init(16);                        // initialize the LCD for 2 lines & 16 columns
        while(1)
        {
                lcd_clear();                // clere the LCD
                lcd_putsf("It's demo_6_8.c");        // display the message
            lcd_gotoxy(0,1);                        // go on the second LCD line
                lcd_putsf(str);                // display the message
                if (*str++ == 0) str = dis_str;
            delay_ms(500);
    }       
}

害怕是晶振时序匹配问题,改为delay_ms(1000)等等延时,仍不行。

出0入0汤圆

 楼主| 发表于 2010-3-9 16:38:57 | 显示全部楼层
附上连接图片:

(原文件名:12.JPG)

出0入0汤圆

发表于 2010-3-9 16:40:38 | 显示全部楼层
看看对比度调节那里

出0入0汤圆

 楼主| 发表于 2010-3-9 16:45:52 | 显示全部楼层
谢谢,我试一下

出0入0汤圆

 楼主| 发表于 2010-3-9 17:19:07 | 显示全部楼层
deiwgah :
调整了对比度,还不行。看来故障根对比度没关系。

出0入0汤圆

 楼主| 发表于 2010-3-9 17:40:40 | 显示全部楼层
另外还有个现象:第1行有显示,而第2行始终无显示

出0入0汤圆

 楼主| 发表于 2010-3-9 19:18:21 | 显示全部楼层
有能解决这种现象的吗,另外,我想弄明白延时多长时间才能匹配1602的时序?

出0入0汤圆

发表于 2010-3-9 21:16:45 | 显示全部楼层
你的时钟比较高,上电后延时100ms后再对LCD下发初始化命令。LCD模块中的驱动器上电后本身也要做自己内部的初始化,需要一定的时间,只有当这个初始化过程完成后,LCD才能接受外部的控制命令。

出0入0汤圆

 楼主| 发表于 2010-3-10 08:59:49 | 显示全部楼层
大家好,谢谢马老师的回答。
根据马老师的指导,我在lcd_init(16);之前加入了50ms~1000ms的delay_ms()延时,在此之前,我保证所有的接线是正确的,并且是牢固可靠的。为了扎实一点,我用lcd_putchar('c');做显示,但仍旧是上电后第1行全黑块。曾有人提到这是初始化未成功的现象,另外,有人说:“最后看见马老师的提示,PC口有4个线默认是给JTAG用的,默认状态不做IO口”,难道真是JTAG的原因吗?我想不至于吧!
试验的程序如下:
#include <mega128.h>
#include <delay.h>

#asm
.equ __lcd_port=0x15;
#endasm
/*  [LCD]     
    1 GND- 9  GND
    2 +5V- 10 VCC  
    3 VLC- LCD HEADER Vo
    4 RS - 1  PC0 (M16)
    5 RD - 2  PC1 (M16)
    6 EN - 3  PC2 (M16)
   11 D4 - 5  PC4 (M16)
   12 D5 - 6  PC5 (M16)
   13 D6 - 7  PC6 (M16)
   14 D7 - 8  PC7 (M16) */
#include <lcd.h>
flash char dis_str[]="Welcome,follow me!.";
void main(void)
{      
        char flash *str;
        //DDRC=0xf8;
        //PORTC=0x0;
        str = dis_str;
        delay_ms(200);
        lcd_init(16);                                // initialize the LCD for 2 lines & 16 columns
        //delay_ms(30);
        lcd_clear();
        lcd_putchar('c');
        //_lcd_ready();
        //_lcd_write_data(0xe);
        while(1);

        /*while(1)
        {
                lcd_clear();                        // clear the LCD  
                delay_ms(300);
                lcd_putchar('a');
                //lcd_putsf("It's demo");        // display the message
                    //lcd_gotoxy(0,1);                // go on the second LCD line
                //lcd_putsf(str);                // display the message
                //if (*str++ == 0) str = dis_str;
                delay_ms(300);
                _lcd_ready();
                _lcd_write_data(0xe);
    }*/       
}

出0入0汤圆

 楼主| 发表于 2010-3-10 11:08:59 | 显示全部楼层
希望能得到回答

出0入0汤圆

发表于 2010-3-10 12:30:37 | 显示全部楼层
4根线接1602,我总结了一下,几乎是每一个人遇到一种情况!成功率十分的低,我曾想弄过但整了几天没有成功,放弃了!

出0入0汤圆

 楼主| 发表于 2010-3-10 12:54:48 | 显示全部楼层
唉。。。

出0入0汤圆

 楼主| 发表于 2010-3-10 13:31:38 | 显示全部楼层
马老师,难道因为JTAG的默认分配,PORTC确实不能用来以四线方式驱动1602液晶吗?

出0入0汤圆

发表于 2010-3-10 13:32:07 | 显示全部楼层
成功过,看一下你的Init函数,这个很关键。

出0入0汤圆

 楼主| 发表于 2010-3-10 13:46:29 | 显示全部楼层
回楼上liuzhua:
init函数用的是cvavr自带的函数lcd_init(16); // initialize the LCD for 2 lines & 16 columns
应该没问题啊,请问你用的是四线方式,按马老师的方式连接到PORTC端口的吗?能把你的方式说一下吗?

出0入0汤圆

发表于 2010-3-10 17:18:43 | 显示全部楼层
m128的JTAG口不在PORTC上,与JTAG无关。
建议你做如下调试:

1。将我教材上的LCD代码,移植到M128上,仅测试LCD。
2。采用M128内部RC振荡源,采用2M或4M,进行测试
3。注意M128的溶丝位配置,必须是M128工作模式(缺省为M103模式)

如果正常,在将系统水肿提高,这个并不难。

出0入0汤圆

 楼主| 发表于 2010-3-10 20:16:48 | 显示全部楼层
谢谢马老师,明天按您的指导再试一下.

出0入0汤圆

 楼主| 发表于 2010-3-11 16:48:14 | 显示全部楼层
问题解决了。事实证明马潮老师书中的程序及四线连接方式是有效并很稳定的.

15楼马老师说:
1。将我教材上的LCD代码,移植到M128上,仅测试LCD。
2。采用M128内部RC振荡源,采用2M或4M,进行测试
3。注意M128的溶丝位配置,必须是M128工作模式(缺省为M103模式)


我重点借鉴了第1项"仅测试LCD"的思想,把周边不用的12v和24v线全部甩掉,然后只保留5v,程序未做任何改变(包括延时),晶振仍为11.0592MHz,时钟设为外部晶振(CKSEL3..0=1110),最后显示成功!

把周边不用的12v和24v线全部甩掉后就正常了,我怎么也想不通!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 13:11

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

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