//XDM9602@SINA.COM
/*------------------------------------------------------------------------------------------------------------------------------------
接口端:1:VDD、2:GND、3:VLCD、4:RET、5:CS1、6:CS2、7、R/W、8:A0、
9~16:D0~D7、17:背光电压 18:背光电压。(A是正电压、K
----------------------------------------------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------------------
LCD12232液晶显示驱动实验
目的:学习C语言编程
// E1:主驱动器使能信号,写操作时低电平有效,读操作时高电平有效;//负电压)
// E2: 从驱动器使能信号,写操作时低电平有效,读操作时高电平有效;//
// RW: 读写选择信号,低电平时写,高电平时读;//
// RS: 数据/指令选择信号/
|DB0-----P1.0 | DB4-----P1.4 | RW-------P3.4 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P3.5 |
|DB2-----P1.2 | DB6-----P1.6 | E1-------P3.2 |
|DB3-----P1.3 | DB7-----P1.7 | E2-------P3.3 |
-------------------------------------------------------------------------------------------------------------*/
#include<at89x51.h rel='nofollow' onclick='return false;'>
#include<stdio.h>
#include<intrins.h>
#define E1 P3_2
#define E2 P3_3
#define RW P3_4
#define RS P3_5
void delay(void); //延时子程序//
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[];
unsigned char code arrayadress2[];
unsigned char code arrayadress3[];
unsigned char code arrayadress4[];
/*----------------------------
主函数
-------------------------------*/
void main(void)
{
do {
delay();
lcdinitial(); //初始化程序//
clrram(); //清屏子程序//
display(6,0,96,arrayadress3);
display(6,1,96,arrayadress3+16);
display(5,2,80,arrayadress4);
display(5,3,80,arrayadress4+16);
delay();
clrram();
display(6,0,96,arrayadress1);
display(6,1,96,arrayadress1+16);
display(7,2,114,arrayadress2);
display(7,3,114,arrayadress2+16);
delay();
}
while(1);
}
/*----------------------------
初始化函数
-----------------------------*/
void lcdinitial(void)
{
writeMI(0xE2);writeSI(0xE2); //复位指令//
writeMI(0xAE);writeSI(0xAE); //显示开关指令//
writeMI(0xA4);writeSI(0xA4); //休闲工作状态设置关//
writeMI(0xA9);writeSI(0xA9); //占空比1/32//
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;
RS=0; RW=1; E1=1;_nop_(); //判断主控制器忙?//
}while(P1&0x80); //
E1=0;
RW=0;RS=0;E1=1;_nop_();
P1=i;_nop_(); E1=0; //低电平时发指令
}
/*-------------------------------------
函数 writSI(unsigned char i) 是内部函数
从i发指令
-----------------------------------------*/
void writeSI(unsigned char i)
{
do{
E1=0;
E2=0;
RS=0; RW=1; E2=1; _nop_(); //判断从控制器忙?//
}while(P1&0x80);
E2=0;
RW=0; RS=0; E2=1;_nop_();
P1=i; _nop_();E2=0; //低电平时发指令
}
/*-------------------------------------
函数 writMD (unsigned char i) 是内部函数
从i发数据
-----------------------------------------*/
void writeMD(unsigned char i)
{ do{
E1=0;
E2=0;
RS=0; RW=1; E1=1; _nop_(); //判断主控制器忙?//
}while(P1&0x80);
E1=0;
RW=0; RS=1; E1=1;_nop_();
P1=i; _nop_();E1=0; //低电平时发数据//
}
/*-------------------------------------
函数 writiSD(unsigned char i) 是内部函数
从i发数据
-----------------------------------------*/
void writeSD(unsigned char i)
{ do{
E1=0;
E2=0;
RS=0; RW=1; E1=1; _nop_(); //判断从控制器忙?//
}while(P1&0x80);
E2=0;
RW=0; RS=1; E2=1;_nop_();
P1=i; _nop_();E2=0; //低电平时发数据//
}
/*-------------------------------
清屏函数、
设置页面地址、设置主窗口显示地址
-----------------------------------*/
void clrram(void)
{
unsigned char line;
unsigned char page;
for (page=0;page<4;page++)
{
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); //设置从窗口页面地址//
}
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;
if (layer==0) //页地址
page=0;
if (layer==1)
page=1;
if (layer==2)
page=2;
if (layer==3)
page=3;
address=61-(word*16)/2;
writeMI(0xB8|page); //主控制器发页地址//
writeMI(address); //主控制器发窗口地址//
for(x=0;x<=width/2;x++)
{ if(k--)
{ writeMD(array[p]); // (左-- 上)层数据输出
p++;}
else {k=16;
p=p+16;
}
}
writeSI(0xB8|page); //从控制器发页地址//
writeSI(0x00); //从控制器发窗口地址//
for(x=0;x<=width/2;x++)
{ if(k--)
{ writeSD(array[p]); //(右--下)层数据输//
p++;}
else {k=16;
p=p+16;
}
}
}
/*--------------------------------
yan shi cheng xu
------------------------------*/ //延时程序
void delay(void )
{
unsigned int i;
unsigned int j;
for(i=0;i<=1000;i++)
for(j=0;j<=150;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,