|
|
本帖最后由 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++);
}
}
}
}
} |
|