ST7565R驱动的12864液晶屏驱动示例程序

这是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);
  
  
  }

}


 

你可能感兴趣的:(单片机)