打印

1602第一排显示方格 第二排亮的 求高人解答

[复制链接]
4554|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
990202098|  楼主 | 2013-3-12 18:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路和程序以前都用过  一直是好的  放了一段时间再去用  出现问题 现象是第一排出现一排方格  第二排是亮的   换了一个1602  现象一样   据说是延时的问题   特意将初始化延时了50-400mS   现象不变    附件中有程序 求高人解答 zy-LCD1602程序-OK.zip (13.27 KB)



相关帖子

沙发
zhangmangui| | 2013-3-12 18:56 | 只看该作者
有没有接反啊  接反会出现你说的这种情况  还有个原因 就是你可以将3跟控制线换到别的IO口试试
下面是我最近用过的代码  看看  其实延时影响不是特别大  只要不要太小就可以啦

sbit RS = P3^5;      //寄存器选择 1:数据寄存器 0:指令寄存器
sbit RW = P3^6;      //读写信号线 1:读操作     0:写操作     
sbit E  = P3^7;      //使能端  下降沿使能
uchar code table[16]=" Sunplusapp.com ";
//=============================================================
//Func:50us delay function
//=============================================================
void Delay_50us(uint t)
{
        uchar public_i;
        for(;t>0;t--)
                for(public_i=11;public_i>0;public_i--);
}
//=============================================================
//Func:write data to 1602 function
//=============================================================
void Write_data(uchar dat)
{
        P0 = dat;
        RS = 1;
        RW = 0;
        E = 0;
        Delay_50us(3);
        E = 1;
        Delay_50us(3);
}
//=============================================================
//Func:write command to 1602 function
//=============================================================
void Write_command(uchar com)
{
        P0 = com;
        RS = 0;
        RW = 0;
        E = 0;
        Delay_50us(3);
        E = 1;
        Delay_50us(3);
}
//=============================================================
//Func:initlnstance 1602 function
//=============================================================
void Init_1602()
{
        uchar public_i;
        Write_command(0x01);
        Write_command(0x38);
        Write_command(0x0C);
        Write_command(0x06);
        Write_command(0xD0);
        Write_command(0x80);
        for(public_i = 0;public_i<16;public_i++)
        {
                Write_data(table[public_i]);
        }
}
//=============================================================
//Func:send string to show function
//=============================================================
void Show_to_1602(uchar *show_ID)
{
        uchar public_i;
        Write_command(0x80+0x40);
        for(public_i = 0;public_i<8;public_i++,show_ID ++)
        {
                if((*show_ID >> 4) < 0x0A)
                        Write_data('0' + (*show_ID >> 4));
                else
                        Write_data(0x37 + (*show_ID >> 4));
                if((*show_ID & 0x0F) < 0x0A)
                        Write_data('0' + (*show_ID & 0x0F));
                else
                        Write_data(0x37 + (*show_ID & 0x0F));
        }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
990202098 + 1 赞一个!
板凳
990202098|  楼主 | 2013-3-12 18:59 | 只看该作者
没接反  反复检查过   换IO口有什么帮助吗  以前用的时候一直是好的啊

使用特权

评论回复
地板
990202098|  楼主 | 2013-3-12 19:00 | 只看该作者
有的人说要特别注意延时的问题   所以今天特意试了一下  没帮助啊   现象不变  明天换个IO口试试吧

使用特权

评论回复
5
990202098|  楼主 | 2013-3-12 19:03 | 只看该作者
这是我的代码  麻烦高手帮我看看
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

//***********************************************************************
//        接口定义
//***********************************************************************

sbit LCD_RS=P3^5;
sbit LCD_E=P3^4;
//RW接地:只写不读

//***********************************************************************
//        延时子函数
//***********************************************************************

void delaymS(unsigned char i)  
{
  unsigned char j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

//***********************************************************************
//        显示屏命令写入函数
//***********************************************************************


void LCD_write_com(unsigned char com)
{
  LCD_RS=0;
  //rw=0;
  LCD_E=1;
  P0=com;
  delaymS(10);
  LCD_E=0;
  delaymS(10);
}

//***********************************************************************
//        显示屏数据写入函数
//***********************************************************************


void LCD_write_data(unsigned char dat)
{
  LCD_RS=1;
  //rw=0;
  LCD_E=1;
  P0=dat;
  delaymS(10);
  LCD_E=0;
  delaymS(10);
}

//***********************************************************************
//        显示屏初始化函数
//***********************************************************************

void LCD_init(void)
{
  P0=0;
  LCD_RS=0;
  //rw=0;
  LCD_E=0;
  delaymS(50);
  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(0x08);                                //显示关闭
  
  LCD_write_com(0x01);              //清屏

  LCD_write_com(0x06);                                //显示光标移动设置
   
  LCD_write_com(0x0C);                                //显示开及光标设置

}

//***********************************************************************
//        显示屏单字符写入函数
//***********************************************************************

void LCD_write_char(unsigned char x,unsigned char y,unsigned char da)
{
       
    if (y == 0)
    {
            LCD_write_com(0x80 + x);
    }
    else
    {
            LCD_write_com(0xC0 + x);
    }
   
    LCD_write_data( da);  
}

//***********************************************************************
//        显示屏字符串写入函数
//***********************************************************************

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 ++;
    }
}
//**********************************************************************
//        主函数main()  LCD每排显示16字符
//**********************************************************************

void main()
{  
    delaymS(400);
    LCD_init();
        delaymS(400);
        LCD_init();
        delaymS(400);
        LCD_init();
        delaymS(400);

    LCD_write_str(0,0,"Current: ");     //显示第一排(重量):weight:
    LCD_write_data(0x31);        //显示1
        LCD_write_data(0x30);        //显示0
    LCD_write_data(0x2e);              //显示小数点
    LCD_write_data(0x30);         //显示0
    LCD_write_data(0x20);              //加个空格
    LCD_write_data(0x66);              //显示"f"
    LCD_write_data(0x41);              //显示"A"


    LCD_write_str(0,1,"Voltage: ");     //显示第二排(价格):total:
    LCD_write_data(0x20);              //显示空格            
    LCD_write_data(0x30);       //显示0
    LCD_write_data(0x2e);              //显示小数点
    LCD_write_data(0x31);        //显示1
    LCD_write_data(0x30);         //显示0
        LCD_write_data(0x6d);        //显示m
        LCD_write_data(0x56);        //显示V
}

使用特权

评论回复
6
990202098|  楼主 | 2013-3-21 14:39 | 只看该作者
问题解决了   RW接地是问题   虽然不读 RW始终保持低  但接地就不行  不稳定   改成把RW接到单片机   再利用单片机置低  就可以  程序什么都没问题  有同样问题的可以参考

使用特权

评论回复
7
990202098|  楼主 | 2013-3-21 14:40 | 只看该作者
问题解决了   RW接地是问题   虽然不读 RW始终保持低  但接地就不行  不稳定   改成把RW接到单片机   再利用单片机置低  就可以  程序什么都没问题  有同样问题的可以参考

使用特权

评论回复
8
990202098|  楼主 | 2013-3-21 14:43 | 只看该作者
本帖最后由 990202098 于 2013-4-29 15:48 编辑

另外  发现资料有的说 E 端上升沿工作  有的说下降沿工作   试了下都可以  

使用特权

评论回复
9
zhangmangui| | 2013-4-28 16:31 | 只看该作者
990202098 发表于 2013-3-21 14:40
问题解决了   RW接地是问题   虽然不读 RW始终保持低  但接地就不行  不稳定   改成把RW接到单片机   再利 ...

问题解决了就好    还出来分享大家    值得表扬啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

1

粉丝