极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18230|回复: 6

12232液晶屏调试成功

[复制链接]
发表于 2014-12-20 10:56:49 | 显示全部楼层 |阅读模式
本帖最后由 dingoslove 于 2014-12-20 10:59 编辑

这块屏幕可是真不好,1520的芯片,没有字库,当时买错了,花了一周时间。看图
无法上传图片,限制是多大呀?

代码
int a0Pin = 10;   //HIGH=data; LOW=commandand;
int rwPin = 11;   //HIGH=read; LOW=write;
int enablePin1 = 12;//input enable;
int enablePin2 = 13;//input enable;
int dataPins[] = {
  2, 3, 4, 5, 6, 7, 8, 9};  //使用数组来定义总线需要的管脚
unsigned char Add1=0;           //
unsigned char Add2=0;        //
unsigned char SEL_E1=1;         //
unsigned char SEL_E2=2;

void setup(void){  
  pinMode(a0Pin,OUTPUT);  
  pinMode(rwPin,OUTPUT);  
  pinMode(enablePin1,OUTPUT);
  pinMode(enablePin2,OUTPUT);
  for (int i = 0; i < 8; i++)  {   
    pinMode(dataPins, OUTPUT);   
  }
}
void loop() {
  LCDPort_Init();   //端口初始化
  LCD_Init();    //LCD初始化
  clear_lcd();
  delay(5000);

  //第一行显示数组1234567890
  tex_Write(lab1);
  tex_Write(lab2);
  tex_Write(lab3);
  tex_Write(lab4);
  tex_Write(lab5);
  tex_Write(lab6);
  tex_Write(lab7);
  tex_Write(lab8);
  tex_Write(lab9);
  tex_Write(lab0);
  delay(5000);       
  //第二行显示汉字
  WriteCharacter(lab_n);
  WriteCharacter(lab_y);
  WriteCharacter(lab_l);
  WriteCharacter(lab_g);
  WriteCharacter(lab_x);
  WriteCharacter(lab_u);
  delay(5000);

  Drawing_Map(Bmp001);   //绘图,绘制图形
  delay(5000);       
  //while(1)
  {

  }
}
//端口初始化
void LCDPort_Init()
{      
  //LCD数据端口设置
  //PORTB = 0xff;         //
  //DDRB = 0xFF;           //配置端口PB全部为输出口,LCD数据端口
Add1=0;
Add2=0;
  //LCD控制端口设置  
  //SET_RES;
  digitalWrite(a0Pin, HIGH);//SET_A0;
  digitalWrite(rwPin, HIGH);//SET_RW;  
  digitalWrite(enablePin1, HIGH);//SET_E1;  
  digitalWrite(enablePin2, HIGH);//SET_E2;  
  for (int i = 0; i < 8; i++)  {   
    digitalWrite(dataPins, HIGH);
  } //DDRA = 0xff;          //
  delay(15);   
}
//LCD初始化
void LCD_Init()
{               
  WriteCommand(0x01,0xe2);  //rest 复位
  WriteCommand(0x02,0xe2);
  //WriteCommand(0x01,0xae);  //close display 关显示
  //WriteCommand(0x02,0xae);  
  //WriteCommand(0x01,0xa4);  //static driver关静态驱动
  //WriteCommand(0x02,0xa4);
  WriteCommand(0x01,0xa9);  //duty 1/32占空比1/32
  WriteCommand(0x02,0xa9);
  //WriteCommand(0x01,0xa0);  //clockwise output  ADC选择,顺时针还是逆时针读取RAM数据
  //WriteCommand(0x02,0xa0);

  //WriteCommand(0x01,0xee);  //end 关闭读修改写,无论读或写操作后,列地址都加1
  //WriteCommand(0x02,0xee);  
  //WriteCommand(0x01,0x00);         //行地址设置,设置显示RAM的行地址(Y地址)
  //WriteCommand(0x02,0x00);
  //WriteCommand(0x01,0xc0);  //显示起始行设置。指定显示器从显示RAM中的那一行开始显示
  //数据,(起始行=0)
  //WriteCommand(0x02,0xc0);
  WriteCommand(0x01,0xaf);  //opend display  开显示
  WriteCommand(0x02,0xaf);       
}

//LCD写指令,
void WriteCommand(unsigned char chip_select,unsigned char cmd)
{
  if(chip_select & 1)     //判断对左页还是右页的操作
  {
    digitalWrite(enablePin1, HIGH);      //如果是左页,E1使能
  }

  else if(chip_select & 2)            //
  {
    digitalWrite(enablePin2, HIGH);       //右页,E2使能
  }

  digitalWrite(a0Pin, LOW);      //A0=0 写命令
  digitalWrite(rwPin, LOW);     //RW=0 写操作

  for (int i = 0; i < 8; i++)  {   
    //digitalWrite(dataPins, cmd >> i);
    digitalWrite(dataPins, (cmd >> i) & 0x01);
  }     //写命令数据到数据端口

  if(chip_select & 1)         //
  {
    digitalWrite(enablePin1, LOW);          //关闭左右页使能
  }

  else if(chip_select & 2)      //
  {
    digitalWrite(enablePin2, LOW);          //
  }

  digitalWrite(a0Pin, HIGH);         //
  digitalWrite(rwPin, HIGH);         //           
}

//写数据
void WriteData(unsigned char chip_select,unsigned char data)
{
  if(chip_select & 1)      //判断左右页
  {
    digitalWrite(enablePin1, HIGH);          //
  }

  else if(chip_select & 2)      //
  {
    digitalWrite(enablePin2, HIGH);        //
  }

  digitalWrite(a0Pin, HIGH);           //A0=1,写数据
  digitalWrite(rwPin, LOW);        //RW=0,写操作

  for (int i = 0; i < 8; i++)  {   
    //digitalWrite(dataPins, data >> i);
    digitalWrite(dataPins, (data >> i) & 0x01);
  }       //写数据到数据端口

  if(chip_select & 1)         //
  {
    digitalWrite(enablePin1, LOW);          //结束使能
  }

  else if(chip_select & 2)         //
  {
    digitalWrite(enablePin2, LOW);                //
  }

  digitalWrite(a0Pin, LOW);            //
  digitalWrite(rwPin, HIGH);         //
}

//清屏
void clear_lcd(void)
{
  unsigned char a,b,c;
  for(a = 0xb8;a < 0xbc;a++)     //清屏0-3页,指令分别是b8,b9,ba,bb(X地址)
  {
    b = 0;                        //
    WriteCommand(0x01,a);        //左,第0页开始
    WriteCommand(0x02,a);        //右,第0页开始
    WriteCommand(0x02,b);          //右,第0行开始(Y地址)
    WriteCommand(0x01,b);        //        左,第0行开始

    for(c = 0;c < 61;c++)       //总共122列,左右各61列
    {
      WriteData(0x01,0x00);     //左,每列均填充0
      WriteData(0x02,0x00);     //右,每列均填充0
    }
  }
}

//写字符
void tex_Write(unsigned char *pt)
{
  unsigned char a,b;

  if(SEL_E1)                  //左选中?
  {
    WriteCommand(0x01,0xb8);      //页设置,第0页(X地址)
    WriteCommand(0x01,Add1);     //第0行开始(Y)地址
    for(a = 8;a < 16;a++)        //
    {
      WriteData(0x01,*(pt + a));  //上半部分8-16,总高度16,
    }

    WriteCommand(0x01,0xb9);     //第一页
    WriteCommand(0x01,Add1);    //
    for(b = 0;b < 8;b++)        //
    {
      WriteData(0x01,*(pt + b));  //下半部分
    }
  }
  else if(SEL_E1 == 0)         //若为0,写右半边
  {
    WriteCommand(0x02,0xb8);      //
    WriteCommand(0x02,Add1);    //
    for(a = 8;a < 16;a++)       //
    {
      WriteData(0x02,*(pt + a));  //
    }

    WriteCommand(0x02,0xb9);   //
    WriteCommand(0x02,Add1);   //
    for(b = 0;b < 8;b++)      //
    {
      WriteData(0x02,*(pt + b));   //
    }

  }
  if((Add1 + 8) < 61)      
    Add1 += 8;               //如果不超过61列列地址+8
  else                   //
  {
    Add1 = 0;          //超过61列,则列地址置0,写右半边
    WriteCommand(0x02,0xb8);   //
    WriteCommand(0x02,Add1);    //
    for(a = 12;a < 16;a++)       //一个字符占8列,所以在61列之后还要写4列
      WriteData(0x02,*(pt + a));     //
    WriteCommand(0x02,0xb9);       //
    WriteCommand(0x02,Add1);       //
    for(b = 4;b < 8;b++)         //
      WriteData(0x02,*(pt + b));     //
    Add1 += 4;                    //

    SEL_E1 = 0;         //
  }
}

// 写汉字
void WriteCharacter(unsigned char *pt)
{
  unsigned char a,b;
  if(SEL_E2)            //
  {
    WriteCommand(0x01,0xba);       //
    WriteCommand(0x01,Add2);       //
    for(a=16;a<32;a++)         //
    {
      WriteData(0x01,*(pt+a));     //
    }

    WriteCommand(0x01,0xbb);        //
    WriteCommand(0x01,Add2);        //
    for(b=0;b<16;b++)            //
    {
      WriteData(0x01,*(pt+b));  //
    }
  }
  else if(SEL_E2==0)             //
  {
    WriteCommand(0x02,0xba);    //
    WriteCommand(0x02,Add2);        //
    for(a=16;a<32;a++)         //
    {
      WriteData(0x02,*(pt+a));  //
    }

    WriteCommand(0x02,0xbb);       //
    WriteCommand(0x02,Add2);       //
    for(b=0;b<16;b++)           //
    {
      WriteData(0x02,*(pt+b));  //
    }

  }
  if((Add2+16)<61)  
    Add2+=16;                  //
  else
  {
    Add2=0;                       //
    WriteCommand(0x02,0xba);       //
    WriteCommand(0x02,Add2);        //
    for(a=29;a<32;a++)
      WriteData(0x02,*(pt+a));       //一个汉字16列,写完61列之后还要写3列
    WriteCommand(0x02,0xbb);           //
    WriteCommand(0x02,Add2);      //
    for(b=13;b<16;b++)
      WriteData(0x02,*(pt+b));         //
    Add2+=3;                       //

    SEL_E2=0;                     //
  }
}

//绘图
void Drawing_Map(unsigned char *pt)
{
  unsigned char half,seg,page;
  unsigned char flag = 1;

  for(page = 0xb8;page < 0xbc;page++)
  {
    for(half = 0;half < 2;half++)
    {
      flag = !flag;
      if(flag)
      {
        WriteCommand(0x02,page);
        WriteCommand(0x02,0x00);
      }
      else
      {
        WriteCommand(0x01,page);
        WriteCommand(0x01,0x00);
      }
      for(seg = 0;seg < 61;seg++)
      {
        if(flag)
        {
          WriteData(0x02,*pt++);                               
        }
        else
        {
          WriteData(0x01,*pt++);                               
        }
      }
    }
  }
}  
回复

使用道具 举报

 楼主| 发表于 2014-12-20 11:01:34 | 显示全部楼层
这是效果,自己下载看吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-12-20 12:03:28 | 显示全部楼层
屏太小了,JLX的12864, 或者12832 都不错的。蓝底白字,ug8lib的库直接用。
回复 支持 反对

使用道具 举报

发表于 2015-6-1 13:31:58 | 显示全部楼层
我也有一个lcd12232 sed1520的 用了只有右半屏正常,左半屏乱码
可以把完整的源代码发给我嘛?
[email protected]
先谢谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-3 15:28:15 | 显示全部楼层
有代码呀,你复制一下不就行了
回复 支持 反对

使用道具 举报

发表于 2015-6-4 16:27:35 | 显示全部楼层
比如这个pinMode(dataPins, OUTPUT);    就是错的
复制了不对啊
还有原文件吗 传一份呗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-5 11:07:20 | 显示全部楼层
那一句确实是错的,但是那句没有用,不影响。不显示是因为,你没有字模文件。其中lab1,lab2等等
因为后来没做,程序不好找了
//第一行显示数组1234567890
   tex_Write(lab1);
   tex_Write(lab2);
   tex_Write(lab3);
   tex_Write(lab4);
   tex_Write(lab5);
   tex_Write(lab6);
   tex_Write(lab7);
   tex_Write(lab8);
   tex_Write(lab9);
   tex_Write(lab0);
   delay(5000);        
   //第二行显示汉字
  WriteCharacter(lab_n);
   WriteCharacter(lab_y);
   WriteCharacter(lab_l);
   WriteCharacter(lab_g);
   WriteCharacter(lab_x);
   WriteCharacter(lab_u);
   delay(5000);

   Drawing_Map(Bmp001);   //绘图,绘制图形
  delay(5000);      
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 17:49 , Processed in 0.036424 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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