dingoslove 发表于 2014-12-20 10:56:49

12232液晶屏调试成功

本帖最后由 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 outputADC选择,顺时针还是逆时针读取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++);                               
      }
      }
    }
}
}

dingoslove 发表于 2014-12-20 11:01:34

这是效果,自己下载看吧

szpapas 发表于 2014-12-20 12:03:28

屏太小了,JLX的12864, 或者12832 都不错的。蓝底白字,ug8lib的库直接用。

xiancai 发表于 2015-6-1 13:31:58

我也有一个lcd12232 sed1520的 用了只有右半屏正常,左半屏乱码
可以把完整的源代码发给我嘛?
[email protected]
先谢谢了:loveliness:

dingoslove 发表于 2015-6-3 15:28:15

有代码呀,你复制一下不就行了

xiancai 发表于 2015-6-4 16:27:35

比如这个pinMode(dataPins, OUTPUT);    就是错的
复制了不对啊
还有原文件吗:) 传一份呗

dingoslove 发表于 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);      
页: [1]
查看完整版本: 12232液晶屏调试成功