📄 lcd12864.c
字号:
/*------------------------------------------
lcd12864液晶显示驱动实
----------------------------------------------
/CS1----选择IC1,低有效 即 (左)64列
/CS2----选择IC2,低有效 即 (右)64列
-----------------------------------------------
RS: D/I=H,表示DB7~DB0为显示数据
D/I=L,表示DB7~DB0为显示指令数据
-----------------------------------------------
R/W: R/W=H,E=H数据被读到DB7~DB0
R/W=L,E信号下降沿,DDRAM数据被写到IR或DR
----------------------------------------------------
E: R/W=L,E信号下降沿锁存DB7~DB0
R/W=H,E=H DDRAM数据读到DB7~DB0
----------------------------------------------------
|9. DB0-----P1.0 |13. DB4-----P1.4 |1. CS1-------P3.2 |
|10. DB1-----P1.1 |14. DB5-----P1.5 |2. CS2-------P3.3 |
|11. DB2-----P1.2 |15. DB6-----P1.6 |6. RS--------P3.4 |
|12. DB3-----P1.3 |16. DB7-----P1.7 |7. RW--------P3.5 |
|17 脚---A正电源 |18 脚------K地 |8. E---------P3.6 |
|5. VO--------0V | 3. 脚------ 地 |4. 脚-------正电源|
-----------------------------------------------------------*/
#include <AT89X52.H>
#include<stdio.h>
#include<intrins.h>
#include"zimo.h"
#define CS1 P2_2
#define CS2 P2_3
#define RS P2_0
#define RW P2_1
#define E P1_0
#define Data P0
#define key P3_1
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 arrayadress0[];
void main(void)
{
while (1)
{
lcdinitial();
clrram();
delay();
display(1,0,8,arrayadress0+8);
display(1,1,8,arrayadress0);
delay();
}
}
/*-----------------------
主控制器 发指令
函数 writMI(unsigned char i) 是内部函数
从i发指令
--------------------------*/
void writeMI(unsigned char i)
{
do{
CS1=1;
CS2=1;
E=0;
RS=0; RW=1;CS1=0;E=1; //判断主控制器忙?//
}while(P0&0x80); //
CS1=1;
E=0;
RS=0;RW=0; Data=i;CS1=0; E=1;
_nop_();_nop_();E=0; //低电平时发指令
}
/*-------------------------------------
从控制器发指令--
?函数 writSI(unsigned char i) 是内部函数
从i发指令
-----------------------------------------*/
void writeSI(unsigned char i)
{
do{
CS1=1;
CS2=1;
E=0;
RS=0; RW=1;CS2=0;E=1; //判断从控制器忙?
}while(P0&0x80); //
CS2=1;
E=0;
RS=0;RW=0;Data=i;CS2=0; E=1;
_nop_();_nop_();E=0; //低电平时发指令
}
/*-------------------------------------
函数 writMD (unsigned char i) 是内部函数
从i发数据
-----------------------------------------*/
void writeMD(unsigned char i)
{
do{
CS1=1;
CS2=1;
E=0;
RS=0; RW=1;CS1=0;E=1; //判断主控制器忙?//
}while(P0&0x80); //
CS1=1;
E=0;
RS=1;RW=0; Data=i;CS1=0; E=1;
_nop_();_nop_();E=0;
}
/*-------------------------------------
函数 writiSD(unsigned char i) 是内部函数
从i发数据
-----------------------------------------*/
void writeSD(unsigned char i)
{
do{
CS1=1;
CS2=1;
E=0;
RS=0; RW=1;CS2=0;E=1; //判断主控制器忙?//
}while(P0&0x80); //
CS2=1;
E=0;
RS=1;RW=0; Data=i;CS2=0; E=1;
_nop_();_nop_();E=0;
}
void SetPage(unsigned char page1,page2)
{ writeMI(0xB8|page1); //设置主窗口页面地址//
writeSI(0xB8|page2); //设置从窗口页面地址//
}
/*-------------------------------
清屏函数、
设置页面地址、设置主窗口显示地址
-----------------------------------*/
void clrram(void)
{
unsigned char line;
unsigned char page;
for (page=0;page<8;page++)
{
SetPage(page,page);//设置页面地址
writeMI(0x40); //、设置主窗口显示地址//
writeSI(0x40); //设置从窗口显示地址//
for(line=0;line<64;line++)
{ writeMD(0x00);
writeSD(0x00);
}
}
}
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=layer;
address=64-(word*8)/2;
writeMI(0xB8|page); //主控制器发页地址//
writeMI(0x04); //主控制器发窗口地址//
for(x=0;x<=width/2;x++)
{ if(k--)
{ writeMD(array[p]); // (左-- 上)层数据输出
p++;}
else {k=16;
p=p+16;
}
}
writeSI(0xB8|page); //从控制器发页地址//
writeSI(0x04); //从控制器发窗口地址//
for(x=0;x<=width/2;x++)
{ if(k--)
{ writeSD(array[p]); //(右--上)层数据输//
p++;}
else {k=16;
p=p+16;
}
}
}
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<=250;j++);
}
/*---------------------
初始化程序
----------------------*/
void lcdinitial(void)
{
writeMI(0x3f);writeSI(0x3f); //显示器开
//writeMI(0x3e);writeSI(0x3e); //显示器关
writeMI(0xc0);writeSI(0xc0); //设置显示起始行
writeMI(0xB8);writeSI(0xB8); //设置DDRAM中的页地址(X地址)
writeMI(0x40);writeSI(0x40); //设置DDRAM中的地址(Y地址)
}
unsigned char code arrayadress0[]={
0x00,0x00,0x00,0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00//"1",0
/*0x00,0x02,0x42,0x42,0x42,0x42,0x42,0x7F,0x7F,0x43,0x42,0x42,0x42,0x42,0x42,0x02,
0x02,0x02,0x06,0x0C,0x18,0x30,0xE0,0xC0,0xFC,0xFE,0x02,0x02,0x02,0x02,0x0E,0x0E,//"无",0
0x02,0x06,0x1E,0xFB,0xE7,0x46,0x09,0x09,0x09,0xFF,0xFF,0x49,0x79,0x39,0x29,0x01,
0x04,0x44,0xC4,0xCC,0x48,0x48,0x4C,0x04,0x0C,0xC8,0xF8,0x38,0x6C,0x46,0x1F,0x1F,//"线",1
0x00,0x00,0x1F,0x1F,0x12,0x12,0x12,0xFF,0xFF,0x12,0x12,0x12,0x1F,0x1F,0x00,0x00,
0x00,0x00,0xF0,0xF0,0x20,0x20,0x20,0xFC,0xFE,0x22,0x22,0x22,0xF2,0xF2,0x0E,0x0E,//"电",2
0x08,0x08,0xFF,0xFF,0x08,0x08,0x1B,0x13,0x10,0xFF,0xFF,0x10,0x1F,0x1F,0x01,0x00,
0x00,0x00,0xFE,0xFE,0x00,0xC2,0xC6,0x1C,0xF8,0xE0,0x04,0x06,0xFE,0xFC,0xC0,0xC0,//"协",3
0x01,0x03,0x02,0x06,0x0E,0x1A,0x32,0xE2,0xE2,0x32,0x1A,0x0E,0x06,0x07,0x03,0x02,
0x00,0x00,0x42,0x47,0x4F,0x5A,0x72,0x66,0x46,0x44,0x54,0x5F,0x4F,0x46,0x00,0x00 //"会",4
*/
} ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -