新手求助 快疯了1602搞了一天

2020-01-14 18:56发布

买了一个1602液晶屏想显示点东西玩 但是接上怎么都不现实  用的程序是 郭天祥的那个,我就把里面的   RW RS和EN改了一下
但是总是失败 一直是方块

我得 数据是接的P1  然后 RS是P3.4  RW 3.5  EN 3.6
2.jpg (167.88 KB, 下载次数: 0) 下载附件 2012-9-5 17:13 上传

线没有问题  开始用的杜邦线 后来直接焊接的  都不行  求教各位大神

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="I LIKE MCU!";
  5. uchar code table1[]="WWW.TXMCU.COM";
  6. sbit lcden=P3^6;
  7. sbit lcdrw=P3^5;
  8. sbit lcdrs=P3^4;
  9. uchar num;


  10. void delay(uint z)
  11. {
  12.         uint x,y;
  13.         for(x=z;x>0;x--)
  14.                 for(y=110;y>0;y--);
  15. }
  16. void write_com(uchar com)
  17. {       
  18.         lcdrs=0;
  19.         P0=com;
  20.         delay(5);
  21.         lcden=1;
  22.         delay(5);
  23.         lcden=0;
  24. }

  25. void write_data(uchar date)
  26. {
  27.         lcdrs=1;
  28.         P0=date;
  29.         delay(5);
  30.         lcden=1;
  31.         delay(5);
  32.         lcden=0;
  33. }
  34. void init()
  35. {
  36.         lcdrw=0;
  37.         lcden=0;
  38.         write_com(0x38);
  39.         write_com(0x0e);
  40.         write_com(0x06);
  41.         write_com(0x01);
  42.         write_com(0x80+0x10);
  43. }
  44. void main()
  45. {
  46.         init();
  47.         for(num=0;num<11;num++)
  48.         {
  49.                 write_data(table[num]);
  50.                 delay(20);
  51.         }
  52. //        write_com(1);
  53.         write_com(0x80+0x53);
  54.         for(num=0;num<13;num++)
  55.         {
  56.                 write_data(table1[num]);
  57.                 delay(20);
  58.         }
  59.         for(num=0;num<16;num++)
  60.         {
  61.                 write_com(0x18);
  62.                 delay(20);
  63.         }
  64.         while(1);
  65. }


复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
44条回答
LM1876
2020-01-16 07:20
rundll32 发表于 2012-9-5 18:09
SCT89c51这个

#include "lcd1602.h"  
#include "..mainext_reg.h"
#include "..mainport.h"
#include <intrins.h>       

#define  NOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}
#define  _nop_() {;}

/*****************LCD初始化设定****************/
void lcd_init()
{       
  uchar i;
   mDisplay_count=0;                                       
        lcd_wcmd(0x38);                //设置LCD为16X2显示,5X7点阵,八位数据接口00111000
   for (i=0;i<125;i++){NOP();NOP();}
   lcd_wcmd(0x38);
         for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x0c);                //LCD开显示及光标设置(光标不闪烁,不显示"-")
   for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x06);                //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
   for (i=0;i<125;i++){NOP();}
        lcd_wcmd(0x01);                //清除LCD的显示内容
   for (i=0;i<125;i++){NOP();}
}

void LCD_Update()
{
   if(mDisplay_count)
     {
         mDisplay_count--;
         return;
     }
               LCD_DisPosCode();
          mDisplay_count = 5;
         }


void LCD_DisPosCode()       
{                                                       
        dis_buf1[0]='1';       
        dis_buf1[1]='2';
        dis_buf1[2]='3';         
        dis_buf1[3]='4';               
        dis_buf1[4]=' ';
        dis_buf1[5]=32;
        dis_buf1[6]=53;                 
   dis_buf1[7]=13;       
        dis_buf1[8]=23;               
        dis_buf1[9]=' ';         
        dis_buf1[10]=' ';         
        dis_buf1[11]=' ';
        dis_buf1[12]=' ';
        dis_buf1[13]=5+48;       
        dis_buf1[14]=6+48;       
        dis_buf1[15]=' ';                                      
        dis_buf2[0]=' ';
        dis_buf2[1]=' ';
        dis_buf2[2]=8+48;
        dis_buf2[3]=8+48;
        dis_buf2[4]=8+48;
    dis_buf2[5]=9+48;
        dis_buf2[6]=9+48;
        dis_buf2[7]=' ';  
        dis_buf2[8]='F';
        dis_buf2[9]='C';
    dis_buf2[10]=1+48;
    dis_buf2[11]=1+48;
    dis_buf2[12]=1+48;
        dis_buf2[13]=1+48;
        dis_buf2[14]='A';
        dis_buf2[15]=' ';
   pro_display();
}
/**********************LCD显示处理程序********************/
void pro_display()
{        uchar i;
        lcd_pos(0x00);        //第一行
        for (i=0;i<=15;i++)
                {lcd_wdat(dis_buf1);}

        lcd_pos(0x40);//第二行
        for (i=0;i<=15;i++)
                {lcd_wdat(dis_buf2);}
}



/**************检测LCD忙**********************/
bit lcd_busy()
{        uint i,j;
        bit result;
        RS = 0;
        RW = 1;
        EN = 1;
   i = 30;            
   while(i>0) i--;
   j=P2;
   result =j & 0x80;        //D7=1为忙碌,D7=0为空闲
        EN = 0;
        return result;       
}

/**************写入指令到LCD**********************/
void lcd_wcmd(uchar cmd)
{       
  if(lcd_busy()){return;};        //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令
        RS = 0;   //RS=0,即是选择1602LCD的指令寄存器
        RW = 0;          //低电平为写操作
        EN = 0;       
        NOP();
        P2 = cmd; //送命令到P0口,即送一个字节的数据到LCD1602的指令寄存器中
        NOP();
    EN = 0;
        EN = 1;         //ep即使能端,由高电平跳变到低电平时,执行命令
    NOP();
        EN = 0;               
}

/****************写入数据到LCD*******************/
void lcd_wdat(char dat)       
{                                                       
        while(lcd_busy());        //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据
        RS = 1;
        RW = 0;
        EN = 0;
        P2 = dat;
        NOP();
        EN = 1;         //ep即使能端,由高电平跳变到低电平时,执行命令
        EN = 1;
        EN = 0;       
        NOP();
}

//LCD数据指针位置程序
void lcd_pos(char pos)
{                                               
        lcd_wcmd(pos|0x80);        //数据指针=80+地址码(00H~27H,40H~67H)
}


你用这个参考下看看,这个我是用STC12C5A48S2通过的

一周热门 更多>