单片机/MCU论坛
直播中

周子建

6年用户 7经验值
擅长:可编程逻辑 嵌入式技术 模拟技术 处理器/DSP 控制/MCU RF/无线
私信 关注
[文章]

求助!为什么我的1602一直只显示一排方框

我用的51最小系统开发板,用的是STM89C52。这里的L2是专门插入1602的接口。
已经调过对比度了,可是没有什么变化。
捕获.PNG
下面是代码:
  1. #include   
  2. #include
  3. #include

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. ***it lcden = P0^5;
  7. ***it lcdrw = P0^6;
  8. ***it lcdrs = P0^7;

  9. void delayms(uint x)
  10. {
  11.         uint i,j;
  12.         for(i=x;i>0;i--)
  13.                 for(j=110;j>0;j--);
  14. }

  15. void write_com(uchar com)
  16. {
  17.                                 //lcdrw=0;
  18.         lcdrs=0;
  19.         P0=com;
  20.         delayms(5);
  21.         lcden=1;
  22.         delayms(5);
  23.         lcden=0;
  24.                                 //lcdrw=1;
  25. }
  26. void write_data(uchar date)
  27. {
  28.                                 //lcdrw=0;
  29.         lcdrs=1;
  30.         P0=date;
  31.         delayms(5);
  32.         lcden=1;
  33.         delayms(5);
  34.         lcden=0;
  35.                                 //lcdrw=1;
  36. }

  37. void init()
  38. {
  39.                                 lcdrw=0;
  40.         lcden=0;

  41.         write_com(0x38);
  42.                                 delayms(5);
  43.         write_com(0x0c);
  44.                                 delayms(5);
  45.         write_com(0x06);
  46.                                 delayms(5);
  47.         write_com(0x01);
  48.                                 //cdrw=1;
  49.         }

  50. void main()
  51. {
  52.          init();
  53.                   
  54.         while(1)   
  55.         {        
  56.                                                                 //write_com(0x01);
  57.                                                                 write_com(0x80);
  58.                 write_data(0x35);
  59.                         
  60.         }
  61. }


回帖(7)

勇哥-lzu

2018-1-25 09:09:14
你的D0~D7接的是P2口,你写数据的时候写到P0口去了
举报

周子建

2018-1-25 17:02:13
引用: 勇哥-lzu 发表于 2018-1-25 09:09
你的D0~D7接的是P2口,你写数据的时候写到P0口去了

已经改完试过了,可还是没用
举报

勇哥-lzu

2018-1-25 17:29:28
引用: 金属锇 发表于 2018-1-25 17:02
已经改完试过了,可还是没用

RW引脚没有配置,写数据之前好像要先写命令的
举报

勇哥-lzu

2018-1-25 17:34:53
你参考这个看一下,https://gitee.com/lvhy10/ZhiNenXiaoChe/blob/master/DRIVE/SRC/LCD1602.c   如果还搞不定,加我QQ***
举报

人中狼

2018-1-25 18:36:26
最好能使用查忙方式,如果不使用的话,向1602发送命令时,两条命令之间的延时要足够长。
现在的现象时向1602写命令或数据不成功,1602初始化不成功。
举报

武林

2018-1-26 14:28:01
没有见过STM89C52,如果是STC89C52需要在P0接上拉电阻,另外你把数据写到P0口去了,与管脚定义不一致。
举报

武林

2018-1-26 15:19:56
程序没有问题,略改一下在TX-1C实验板上验证无误。
#include   
#include
#include
#define uchar unsigned char
#define uint unsigned int
//***it lcden = P0^5;
//***it lcdrw = P0^6;
//***it lcdrs = P0^7;
***it lcdrs=P3^5;
***it lcden=P3^4;

uchar table1[]="0123456789ABCDEF";        //第一行
uchar table2[]="GHIJKLMNOPQRSTUV";        //第二行

void delayms(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=110;j>0;j--);
}

void write_com(uchar com)
{
        //lcdrw=0;
        lcden=0;
        lcdrs=0;
        P0=com;
        delayms(1);
        lcden=1;
        delayms(1);
        lcden=0;
        //lcdrw=1;
}
void write_data(uchar date)
{
        //lcdrw=0;
        lcdrs=1;
        P0=date;
        delayms(1);
        lcden=1;
        delayms(1);
        lcden=0;
        //lcdrw=1;
}

void init()
{
//        lcdrw=0;
//        lcden=0;        
        write_com(0x38);
//        delayms(5);
        write_com(0x0c);
//        delayms(5);
        write_com(0x06);
//        delayms(5);
        write_com(0x01);
        //cdrw=1;
}

void main()
{
        uchar a;
        init();
        write_com(0x80+17);                        //数据指针第一行起始0x80位置+17(初位右移17屏外)
        for(a=0;a<16;a++)                        //每循环一次写一个字节数据
        {
                write_data(table1[a]);        //写一个字节数据               
        }
        write_com(0xc0+17);                        //数据指针第二行起始位置0x80+0x40=0xc0,起始位置+17(初位右移17屏外)
        for(a=0;a<16;a++)                        //每循环一次写一个字节数据
        {
                write_data(table2[a]);        //写一个字节数据               
        }
        for(a=0;a<17;a++)                        //显示位置自右至左移动17位
        {
                write_com(0x18);                //0x18整屏左移1位指令
                delayms(200);                        //延时(控制移动速度)
        }
        while(1)  
        {
//                write_com(0x01);
//                write_com(0x80);
//                write_data(0x35);             
        }
}
无标题.jpg
举报

更多回帖

发帖
×
20
完善资料,
赚取积分