文少 发表于 2012-3-3 02:43:40

ATMEGA8L 驱动1602屏的问题

本帖最后由 文少 于 2014-2-18 11:40 编辑

原来用的ATMEGA168,1602接的4线方式,工作良好,百分百能够初始化成功。因为要做一些别的东西,用M168成本太高,于是用M8L,外部晶振8M,Bootloader也没有问题。但用同样的1602代码却没有办法成功初始化,开机基本是乱码,有时按多几次按键(有刷新屏显的内容人)却又显示正常;有时乱按正常了,再按复位又是初始化正常的,很奇怪。

曾分析如下:

1. M8L的复位电路和M168的一样,上拉10K,104到地,换过102,103都一样。
2. 1602的EN使能延时原是3微秒,延时改来改去,再没有效果。
3. 修改驱动的指令延时,没有效果。
4. 开机时增加几百MS的延时再作初始化,没有效果。
5. 晶振,晶振电容都换了,不行。
6. 在原硬件基础上,装上M168和16M晶振,工作非常好,郁闷!
7. 人快疯了。。。求助!



原用的4线1602驱动代码如下:

void setup() {
for (i=8; i <= 13; i++){         //Pin8~13端口为LCD驱动输出
    pinMode(i,OUTPUT);
}
lcd_init();                //LCD初始化
}

void loop(){

}

//-----------------------LCD 初始化----------------------------
void lcd_init(){
for (i=1;i <=51; i++){      //4线 2行 5x7
    LCD_C_W(0x28);
    delay(5);
}
LCD_C_W(0x06);   //设定输入方式,增量不移位
delay(5);
LCD_C_W(0x0c);   
delay(5);
LCD_C_W(0x80);   
delay(5);
LCD_C_W(0x01);   //清屏
delay(5);
}



//-------------------LCD命令写入 ------------------------
void LCD_C_W(int command){
int i,temp;
digitalWrite( lcd_RS,0);
digitalWrite( lcd_EN,0);

temp=command & 0xf0;
for (i=DB; i <= 11; i++){
    digitalWrite(i,temp & 0x80);
    temp <<= 1;
}
en_down();         //EN下降沿

temp=(command & 0x0f)<<4;
for (i=DB; i <= 12; i++){
    digitalWrite(i,temp & 0x80);
    temp <<= 1;
}

en_down();         //EN下降沿
}

//--------------------LCD数据写入-----------------------
void LCD_D_W(int dat)      
{
int i,temp;
digitalWrite( lcd_RS,1);
digitalWrite( lcd_EN,0);
temp=dat & 0xf0;
for (i=DB; i <= 11; i++)
{
    digitalWrite(i,temp & 0x80);
    temp <<= 1;
}
en_down();         //EN下降沿

temp=(dat & 0x0f)<<4;
for (i=DB; i <= 12; i++)
{
    digitalWrite(i,temp & 0x80);
    temp <<= 1;
}
en_down();      //EN下降沿
}

//--------------------LCD X,Y轴------------------------
void LCD_xy( int x, int y )   
{
int address;
if (y ==0)    address = 0x80 + x;
else          address = 0xC0 + x;
LCD_C_W(address);
}

//---------------------LCD字符写入------------------------
void LCD_W_C( int x,int y,int dat)   
{
LCD_xy( x, y );
LCD_D_W(dat);
}

//----------------------LCD字符串写入---------------------
void LCD_W_S(int X,int Y,char *s)
{
LCD_xy( X, Y );    //设置地址
while (*s)             //写字符串
{
    LCD_D_W(*s);   
    s ++;
}
}

//---------------------- LCD的EN下降沿 --------------------
void en_down(){
digitalWrite( lcd_EN,1);
delayMicroseconds(3);
digitalWrite( lcd_EN,0);
}



Randy 发表于 2012-5-16 13:50:54

按道理说应该是没什么问题的,你换一个芯片试试,这点程序才几K,用51都很轻松的控制它的。

小小弧 发表于 2014-2-14 22:51:23

本帖最后由 小小弧 于 2014-2-14 22:52 编辑

大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示,我总不能每次上电后再按reset吧,另外你按串口监视,和按reset可以起到相同的效果。郁闷。

补充一下,我也用的4线LCD。用mini板子或者nano板子,毛病都一样的。

文少 发表于 2014-2-16 17:58:36

小小弧 发表于 2014-2-14 22:51 static/image/common/back.gif
大哥。我和你一样的问题,上电后LCD不显示任何东西,按下reset。全部正常,再按下reset后LCD又恢复不显示, ...

你也用MEGA8L吗? 和你的情况不完全一样,这个问题一直没搞定~

eddiewwm 发表于 2014-2-16 18:39:54

程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行?

文少 发表于 2014-2-18 11:37:54

本帖最后由 文少 于 2014-2-18 11:39 编辑

eddiewwm 发表于 2014-2-16 18:39 static/image/common/back.gif
程序沒有定義接腳及一些設定,重要的 void loop 也漏了(),這程序理論上了無法過得編譯器的,為何可運行?

贴代码时把LOOP的内容delete了,删多了...我去补上.
贴中的问题不是这个原因~~
页: [1]
查看完整版本: ATMEGA8L 驱动1602屏的问题