这是ST7565R驱动的12864液晶屏驱动示例程序。
/*这是st7565r控制的128*64液晶屏的典型应用*/
#include"reg52.h"
sbit WRR = P2^5; //写数据脉冲低电平后高电平锁存
sbit AO = P2^6; //命令和数据选择脚
sbit RDD = P2^7; //读数据引脚低电平有效
sbit CS = P3^2; //片选引脚,低电平有效
sbit RST = P3^4; //复位引脚,低电平有效
code unsigned char car[]={//这里放了一张小汽车图
0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x3F,0x04,0x04,0x04,0x04,0x04,
0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0xA8,0xA8,0xFF,0xA8,0xA8,0xA8,0xF8,0x20,
0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x07,0x07,0x0E,0x0E,0x0E,0x0C,0x1D,
0x1D,0x1B,0x1B,0x1B,0x1B,0x3B,0x3E,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x34,0x34,
0x34,0x3C,0x3C,0x3C,0x3C,0x3C,0x3F,0x3F,0x3F,0x3F,0x36,0x37,0x37,0x37,0x37,0x37,
0x73,0x7B,0x79,0x79,0x59,0x18,0x08,0x0C,0x0C,0x0C,0x04,0x06,0x03,0x03,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x07,0x0F,0x1E,0x1E,0x14,0x3D,
0x7B,0x53,0xA7,0xA7,0xEF,0x5F,0x9F,0xBF,0xBF,0x7F,0x58,0xE0,0xE0,0xC0,0xC0,0x80,
0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x3F,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x8F,
0x8F,0xCF,0xEF,0xEF,0xFF,0xFF,0x7F,0x3F,0x3F,0x0F,0x03,0xF8,0xFC,0xFC,0x06,0x83,
0xC1,0x61,0x31,0x31,0x18,0x0C,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x07,0x05,
0x0F,0x0B,0x1F,0x1F,0x1F,0x17,0x3F,0x3F,0x3F,0x2E,0x6E,0x6E,0x7E,0x7E,0xFE,0xFE,
0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xFE,0xFE,0xFE,0xBE,0x3E,0x3E,0x7E,0x7E,0xFE,0xFE,
0xFE,0xFE,0xFE,0xFE,0xBE,0xBE,0xFE,0xFE,0xFE,0xFE,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,
0x3E,0x3E,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3D,0x3D,0x3D,0x3D,0x3D,0x3D,
0x7C,0x7C,0x7C,0x7C,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,
0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x7C,0x7C,0x3C,0x7C,
0x7C,0xFC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xFC,0x3C,0x0F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x0E,0x3B,0x77,0x77,0xFF,0xFF,0x69,0xCC,0xCC,0xC0,0x80,
0x80,0x81,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x03,0x01,0x01,0x01,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x3F,0x5F,0x5F,0xDF,0x1F,0x9F,0x9F,0x9F,0x1F,0x1F,0x7F,0x7F,0x7F,0x7F,0xFE,
0xFC,0xF9,0xF0,0xF0,0xF4,0xF6,0xE7,0xE7,0xE7,0xE7,0xF6,0xF0,0xF9,0xF9,0xF9,0xFC,
0xFE,0x7F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,
0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,
0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x3F,0x7F,0x3F,0x3F,0x7F,0xFF,
0xFE,0xFD,0xF9,0xF9,0xF0,0xF4,0xE7,0xE7,0xE7,0xE7,0xE7,0xF6,0xD0,0xD0,0xF9,0xE9,
0xF4,0xFF,0x7F,0x7F,0x7F,0x5F,0x5F,0xDF,0xDF,0x9F,0x9F,0x9F,0x5F,0x5F,0x7F,0x00,
0x00,0xF8,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0x30,
0xFB,0xF3,0xF3,0xF3,0x63,0x0F,0xB0,0x8C,0x8C,0x23,0x07,0x73,0xF3,0xF3,0xF3,0xF8,
0x00,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,
0x78,0xF3,0xF3,0xF3,0xF3,0x23,0x0F,0x80,0x80,0x9C,0x2B,0x07,0x73,0x73,0xF3,0xF3,
0x78,0x01,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0x98,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0xC0,0x40,0xA0,0x70,0x38,
0x1C,0xBC,0x9E,0x9E,0xDE,0xCE,0x0E,0x0E,0x0E,0xCE,0xCE,0xDE,0x9E,0x9E,0x3C,0x7C,
0xF8,0xF0,0xE0,0xE0,0xC0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xF0,0xF8,
0xF8,0x3C,0xBC,0xBC,0xDE,0xDE,0xCE,0x0E,0x0E,0x0E,0xCE,0xDE,0xDE,0xDE,0xBC,0x3C,
0x78,0xF8,0xF0,0xF0,0xE0,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
};
//这是延时函数,延时几个指令周期,对于1T的单片机。多延迟些;
void delay(unsigned char time)
{
while(time)
{
time--;
}
}
//写数据或者命令函数,ad为0的时候是命令。ad为1的时候是数据;
//两次写时间不得少于240纳秒;
void writedata(unsigned char data1,bit ad)
{
AO=ad; //端口 选择是命令/数据;
CS=0; //片选有效
RDD=1; //本程序不读,本脚一直是高电平
WRR=0; //在ao变化后变低,70ns内数据端口放数据;
P0=data1; //立即在端口放数据
delay(5); //数据稳定一下
WRR=1; //高脉冲锁存。
delay(5); //最少延迟5纳秒。
}
//设置页码函数,本液晶从上到下64点分为8页,每页8点
//本液晶从中间起往上为0到3.从地面起往上为4到7.为了写
//程序方便这里转化一下。 0xb0+要设置的页,从上到下从0到7,共8页。
void setpage(unsigned char page)
{
unsigned char newpage;
switch (page)
{
case 0:
newpage=3;
break;
case 1:
newpage=2;
break;
case 2:
newpage=1;
break;
case 3:
newpage=0;
break;
case 4:
newpage=7;
break;
case 5:
newpage=6;
break;
case 6:
newpage=5;
break;
case 7:
newpage=4;
break;
default:
newpage=8;
break;
}
writedata((0xb0+newpage),0);
}
//显示位置设置函数,本液晶必须另外加3才是位置。奇葩的设计
//volum为从0到127共128个点。设置必须分两次完成,首次设置高四位
//高四位是0x10+高四位;
//低四位是,高四位为0,再加上低四位。
void setvolumn(unsigned char volumn)
{
unsigned char invo;
invo=volumn+3;
writedata((0x10+((invo>>4)&0x0f)),0); //设置地址的高四位
invo=volumn+3;
invo=invo&0x0f;
writedata(invo,0); //设置地址的高四位
}
//液晶屏初始化函数
void lcdinit(void)
{
RST=0; //复位
delay(200); //延时一下
RST=1; //复位完成
delay(15); //延时
writedata(0xe2,0); // 软复位
delay(50);
writedata(0x2c,0); // 升压步骤1
delay(50);
writedata(0x2e,0); // 升压步骤2
delay(50);
writedata(0x2f,0); // 升压步骤3
delay(50);
writedata(0x24,0); //粗调对比度可设置范围是0x20到0x27;
writedata(0x81,0); //精调对比度;
writedata(0x22,0); //精调对比度的值在0x00到0x3f;
writedata(0xa2,0); //1/9偏压比;(bias)
writedata(0xc8,0); //行扫描顺序,从上到下;
writedata(0xa1,0); //列扫描顺序,从左到右
writedata(0x40,0); //起始列,第一行开始设置液晶第一列显示ram的那个位置。周期地改变此值可以让显示内容滚动。
writedata(0xaf,0); //开显示器;
}
//清空ram
void qing()
{
unsigned char i,j;
for(i=0;i<9;i++)//此处奇葩必须为9,因为驱动电路是9页的剩余一页只有一行。
{
writedata((0xb0+i),0);
writedata(0x10,0);
writedata(0x00,0);
for(j=0;j<132;j++)//列驱动电路是131位的
{
writedata(0,1);
}
}
}
//本函数是把数组图片显示在液晶屏上,每写入一次,地址自动加1,所以128列之后改变一次首列
void huatu()
{
unsigned char i;
setpage(0);//第1页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i],1);
}
setpage(1);//第2页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+128],1);
}
setpage(2);//第3页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+256],1);
}
setpage(3);//第4页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+384],1);
}
setpage(4);//第5页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+512],1);
}
setpage(5);//第6页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+640],1);
}
setpage(6);//第7页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+768],1);
}
setpage(7);//第8页8行128列
setvolumn(0);
for(i=0;i<128;i++)
{
writedata(car[i+896],1);
}
}//到此画图显示完毕
void main(void)//主函数
{
lcdinit();//初始化液晶屏
qing(); //清屏
huatu(); //画图;
while(1)
{
delay(10);
}
}