📄 12232.c
字号:
/*-----------------------------------------------------------------*/
/*LCD12232液晶显示驱动实验. */
/*E1:主驱动器使能信号,写操作时低电平有效,读操作时高电平有效,负电压.*/
/*E2:从驱动器使能信号,写操作时低电平有效,读操作时高电平有效. */
/*RW:读写选择信号,低电平时写,高电平时读. */
/*A0:寄存器选择信号. */
/*各个引脚对应的接线关系如下所示: */
/* |DB0-----P1.0 | DB4-----P1.4 | E1-------P2.0 | */
/* |DB1-----P1.1 | DB5-----P1.5 | E2-------P2.1 | */
/* |DB2-----P1.2 | DB6-----P1.6 | RW-------P2.2 | */
/* |DB3-----P1.3 | DB7-----P1.7 | A0-------P2.3 | */
/*-----------------------------------------------------------------*/
#include<STC89C51.H>
#include <stdlib.h>
#include <intrins.h>
#include <string.h>
sbit E1=P2^0; /* 定义P2.0端口为E1 */
sbit E2=P2^1; /* 定义P2.1端口为E2 */
sbit RW=P2^2; /* 定义P2.2端口为RW */
sbit A0=P2^3; /* 定义P2.3端口为RS */
void delay(char k); /* 延时子程序 */
void lcdinitial(void); /* 初始化子程序 */
void clrram(void); /* 复位子程序 */
void writeMI(unsigned char i); /* 主驱动器发指令 */
void writeSI(unsigned char i); /* 从驱动器发指令 */
void writeMD(unsigned char i); /* 主驱动器发数据 */
void writeSD(unsigned char i); /* 从驱动器发数据 */
void SetPage(unsigned char page1,page2); /* 设置页地址 */
void display(unsigned char word,unsigned char layer,unsigned char width,unsigned char code *array);
unsigned char code arrayadress1[]; /* 定义数组arrayadress1 */
unsigned char code arrayadress2[]; /* 定义数组arrayadress2 */
unsigned char code arrayadress3[]; /* 定义数组arrayadress3 */
unsigned char code arrayadress4[]; /* 定义数组arrayadress4 */
/*-----------------主函数-----------------*/
void main(void)
{
delay(10); /* 延时子程序 */
lcdinitial(); /* 初始化子程序 */
delay(10); /* 延时子程序 */
while(1)
{
delay(400); /* 延时子程序 */
clrram(); /* 复位子程序(清屏子程序) */
display(6,0,12,arrayadress1);
//display(6,1,96,arrayadress1+16);
//display(5,2,80,arrayadress2);
//display(5,3,80,arrayadress2+16);
//delay(400); /* 延时子程序 */
//clrram(); /* 复位子程序(清屏子程序) */
//display(6,0,96,arrayadress3);
//display(6,1,96,arrayadress3+16);
//display(5,2,114,arrayadress4);
//display(5,3,114,arrayadress4+16);
//delay(400); /* 延时子程序 */
}
}
/* 初始化子程序 */
void lcdinitial(void)
{
writeMI(0xE2);
writeSI(0xE2); /* 复位指令 */
/****************************/
writeMI(0xAE);
writeSI(0xAE); /* 关闭显示工作状态 */
/****************************/
writeMI(0xA4);
writeSI(0xA4); /* 关闭休闲工作状态 */ /* 此指令要在设置显示开关指令以后才能使用 */
/****************************/
writeMI(0xA9);
writeSI(0xA9); /* 占空比1/32时为0xA9,占空比1/16时为0xA8 */
/****************************/
writeMI(0xA0);
writeSI(0xA0); /* 正向排序设置 */
/****************************/
writeMI(0xEE);
writeSI(0xEE); /* 结束指令改写方式 */
/****************************/
writeMI(0x00);
writeMI(0xC0); /* 设置主控制器显示起始行为第一行 */
writeSI(0x00);
writeSI(0xC0); /* 设置从控制器显示起始行为第一行 */
/****************************/
writeMI(0xAF);
writeSI(0xAF); /* 开启显示工作状态 */
}
/*******************以下函数是对内部函数进行的写指令的控制*******************/
/* 主驱动器发指令函数writMI(unsigned char i)是内部函数,从i发指令 */
void writeMI(unsigned char i)
{
do
{
E1=0;
E2=0;
A0=0;
RW=1;
E1=1;
_nop_();
} /* 判断主控制器忙 */
while(P1&0x80); /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */
E1=0;
RW=0;
A0=0;
E1=1;
_nop_();
P1=i;
_nop_();
E1=0;/* 低电平时发指令 */
}
/* 从驱动器发指令函数writSI(unsigned char i)是内部函数,从i发指令 */
void writeSI(unsigned char i)
{
do
{
E1=0;
E2=0;
A0=0;
RW=1;
E2=1;
_nop_();
} /* 判断从控制器忙 */
while(P1&0x80); /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */
E2=0;
RW=0;
A0=0;
E2=1;
_nop_();
P1=i;
_nop_();
E2=0; /* 低电平时发指令 */
}
/****************************************************************************/
/* 复位子程序(清屏子程序) */
void clrram(void)
{
unsigned char line;
unsigned char page;
for(page=0;page<4;page++) /* 页面选择,page为0时为第0页,page为1时为第1页,page为2时为第2页,page为3时为第3页 */
{
SetPage(page,page); /* 设置页面地址 */
writeMI(0x00); /* 主驱动器发指令函数 */ /* 设置主窗口显示地址 */
writeSI(0x00); /* 从驱动器发指令函数 */ /* 设置从窗口显示地址 */
for(line=0;line<62;line++)
{
writeMD(0x00); /* 主驱动器发数据函数 */
writeSD(0x00); /* 从驱动器发数据函数 */
}
}
}
/* 设置页地址 */
void SetPage(unsigned char page1,page2)
{
writeMI(0xB8|page1); /* 设置主窗口页面地址 */
writeSI(0xB8|page2); /* 设置从窗口页面地址 */
}
/*******************以下函数是对内部函数进行的发数据的控制*******************/
/* 主驱动器发数据函数writMD(unsigned char i)是内部函数,从i发数据 */
void writeMD(unsigned char i)
{
do
{
E1=0;
E2=0;
A0=0;
RW=1;
E1=1;
_nop_();
} /* 判断主控制器忙 */
while(P1&0x80); /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */
E1=0;
RW=0;
A0=1;
E1=1;
_nop_();
P1=i;
_nop_();
E1=0; /* 低电平时发指令 */
}
/* 从驱动器发数据函数writiSD(unsigned char i)是内部函数,从i发数据 */
void writeSD(unsigned char i)
{
do
{
E1=0;
E2=0;
A0=0;
RW=1;
E1=1;
_nop_();
} /* 判断从控制器忙 */
while(P1&0x80); /* 当P1端口为0x80时表示处于忙状态,此时不能进行其他操作 */
E2=0;
RW=0;
A0=1;
E2=1;
_nop_();
P1=i;
_nop_();
E2=0; /* 低电平时发指令 */
}
/****************************************************************************/
//display(6,0,96,arrayadress1);
void display(unsigned char word,unsigned char layer, unsigned char width,unsigned char code *array)
{
unsigned char x;
unsigned char k=16 ;
unsigned char address; /* address表示显存的物理地址 */
unsigned char p=0;
unsigned char page; /* page表示页地址 */
if(layer==0)
{
page=0;
}
if(layer==1)
{
page=1;
}
if(layer==2)
{
page=2;
}
if(layer==3)
{
page=3;
} /* 通过四个if语句可以确定page表示页地址的值 */
address=61-(word*16)/2; /* 确定address表示显存的物理地址的值 */
writeMI(0xB8|page); /* 主控制器发页地址 */
writeMI(address); /* 主控制器发窗口地址 */
for(x=0;x<=width/2;x++)
{
if(k--)
{
writeMD(array[p]); /* 左-上层数据输出 */
p++;
}
else
{
k=16;
p=p+16;
}
}
for(x=0;x<=width/2;x++)
{
if(k--)
{
writeMD(array[p+16]); /* 左-下层数据输出 */
p++;
}
else
{
k=16;
p=p+32;
}
}
// writeSI(0xB8|page); /* 从控制器发页地址 */
//writeSI(); /* 从控制器发窗口地址 */
//for(x=0;x<=width/2;x++)
// {
// if(k--)
// {
// writeSD(array[p]); /* 右-上层数据输出 */
// p++;
// }
// else
// {
// k=16;
// p=p+16;
// }
// }
//for(x=0;x<=width/2;x++)
// {
// if(k--)
// {
// writeSD(array[p+16]); /* 右-下层数据输出 */
// p++;
// }
// else
// {
// k=16;
// p=p+32;
// }
// }
}
/* 延时子程序 */
void delay(char k)
{
unsigned int i,j,s;
for(s=0;s<k;s++)
{
for(i=0;i<=100;i++)
{
for(j=0;j<=100;j++);
}
}
}
unsigned char code arrayadress1[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10, // 欢
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00,
0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02, // 迎
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00,
0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F, // 光
0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00,
0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C, // 临
0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00,
0x10,0x10,0x10,0xFF,0x90,0x50,0x00,0x3F, // 指
0x48,0x48,0x48,0x44,0x46,0xC4,0x70,0x00,
0x02,0x42,0x81,0x7F,0x00,0x00,0x00,0xFF,
0x49,0x49,0x49,0x49,0x49,0xFF,0x01,0x00,
0x00,0x00,0x7E,0x92,0x92,0x92,0x92,0x92, // 导
0x92,0x92,0x92,0xBF,0x82,0xE0,0x00,0x00,
0x04,0x04,0x04,0x04,0x14,0x24,0x04,0x04,
0x44,0x84,0x7F,0x04,0x04,0x06,0x04,0x00,
};
unsigned char code arrayadress2[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x40,0x60,0x5E,0x48,0x48,0xFF,0x48,0x4C, // 制
0x68,0x40,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x00,0x00,0x3F,0x01,0x01,0xFF,0x11,0x21,
0x1F,0x00,0x07,0x40,0x80,0x7F,0x00,0x00,
0x80,0x40,0x20,0xF8,0x87,0x40,0x30,0x0F, // 作
0xF8,0x88,0x88,0xC8,0x88,0x0C,0x08,0x00,
0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7F, // 人
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,
0x03,0x0C,0x10,0x20,0x40,0xC0,0x40,0x00,
0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80, // :
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0xE2,0x22,0x22,0x3F,0x82,0x80,0xFF, // 张
0x80,0xA0,0x90,0x88,0x86,0xC0,0x80,0x00,
0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,
0x40,0x23,0x0C,0x10,0x20,0x60,0x20,0x00,
0x08,0x08,0x88,0x88,0x88,0x88,0x88,0xFF, // 志
0x88,0x88,0x88,0xC8,0x88,0x0C,0x08,0x00,
0x20,0x18,0x00,0x3C,0x40,0x40,0x42,0x44,
0x4C,0x40,0x40,0x70,0x00,0x08,0x30,0x00,
0x40,0x20,0x38,0xE7,0x24,0x24,0x24,0x10, // 铭
0x1C,0xA7,0x44,0x24,0x14,0x0C,0x00,0x00,
0x00,0x01,0x01,0x7F,0x21,0x11,0x04,0x02,
0xFF,0x42,0x42,0x42,0x42,0xFF,0x02,0x00,
};
unsigned char code arrayadress3[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x10,0x22,0x64,0x0C,0x80,0x04,0xC4,0x34, // 液
0x05,0xC6,0xBC,0x24,0x24,0xE6,0x04,0x00,
0x04,0x04,0xFE,0x01,0x02,0x01,0xFF,0x42,
0x21,0x16,0x08,0x15,0x23,0x60,0x20,0x00,
0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49, // 晶
0x49,0x49,0xFF,0x00,0x00,0x80,0x00,0x00,
0x00,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,
0xFF,0x49,0x49,0x49,0x49,0xFF,0x01,0x00,
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0x92, // 显
0x92,0x92,0x92,0xFF,0x02,0x00,0x00,0x00,
0x40,0x42,0x44,0x4D,0x40,0x7F,0x40,0x40,
0x40,0x7F,0x40,0x49,0x44,0x66,0x40,0x00,
0x40,0x40,0x42,0x42,0x42,0x42,0x42,0xC2, // 示
0x42,0x42,0x42,0x43,0x42,0x60,0x40,0x00,
0x00,0x10,0x08,0x04,0x06,0x40,0x80,0x7F,
0x00,0x00,0x02,0x04,0x0C,0x18,0x00,0x00,
0x10,0x0C,0x04,0x44,0x8C,0x94,0x35,0x06, // 实
0xF4,0x04,0x04,0x04,0x04,0x14,0x0C,0x00,
0x02,0x82,0x82,0x42,0x42,0x23,0x12,0x0E,
0x03,0x0A,0x12,0x22,0x42,0xC3,0x02,0x00,
0x02,0xFA,0x02,0x02,0xFF,0x42,0x20,0x50, // 验
0x4C,0x43,0x4C,0x50,0x20,0x60,0x20,0x00,
0x10,0x31,0x11,0x49,0x89,0x7F,0x42,0x5C,
0x40,0x4F,0x60,0x58,0x47,0x60,0x40,0x00,
};
unsigned char code arrayadress4[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语 */
0x00,0x40,0x42,0x42,0x42,0x42,0xFE,0x42, // 无
0xC2,0x42,0x43,0x42,0x60,0x40,0x00,0x00,
0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,
0x3F,0x40,0x40,0x40,0x40,0x40,0x70,0x00,
0x00,0x20,0x30,0xAC,0x63,0x20,0x30,0x20, // 线
0x20,0xFF,0x90,0x92,0x94,0xD0,0x80,0x00,
0x20,0x62,0x23,0x12,0x12,0x12,0x41,0x41,
0x21,0x17,0x18,0x24,0x42,0x80,0xE0,0x00,
0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48, // 电
0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,
0x10,0x10,0xFF,0x10,0x10,0x80,0x10,0x10, // 协
0xFF,0x10,0x10,0x10,0xF8,0x90,0x00,0x00,
0x00,0x00,0xFF,0x00,0x04,0x43,0x20,0x1C,
0x03,0x00,0x40,0x80,0x7F,0x00,0x03,0x00,
0x80,0x80,0x40,0x20,0x50,0x48,0x44,0x43, // 会
0x44,0x48,0x50,0x20,0x40,0xC0,0x40,0x00,
0x00,0x00,0x02,0x42,0x62,0x52,0x4E,0x42,
0x42,0x52,0x62,0xC3,0x02,0x00,0x00,0x00,
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -