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

}


 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要连接1602液晶到51单片机的P0口和P2口,具体接线方式可以参考1602液晶的数据手册和51单片机的开发板手册。然后,需要编写相应的程序来控制液晶的显示。 以下是示例代码: ```c #include <reg52.h> #define LCD_RS P0_0 // 液晶RS引脚连接到P0.0 #define LCD_RW P0_1 // 液晶RW引脚连接到P0.1 #define LCD_E P0_2 // 液晶E引脚连接到P0.2 #define LCD_DATA P2 // 液晶数据口连接到P2口 void delay(unsigned int i) // 延时函数 { while(i--); } void lcd_write_cmd(unsigned char cmd) // 写指令函数 { LCD_RS = 0; // 设置RS为0表示写指令 LCD_RW = 0; // 设置RW为0表示写入 LCD_DATA = cmd; // 将指令写入数据口 delay(50); // 延时一段时间 LCD_E = 1; // 设置E为1表示使能 delay(50); // 延时一段时间 LCD_E = 0; // 设置E为0表示失能 } void lcd_write_data(unsigned char dat) // 写数据函数 { LCD_RS = 1; // 设置RS为1表示写数据 LCD_RW = 0; // 设置RW为0表示写入 LCD_DATA = dat; // 将数据写入数据口 delay(50); // 延时一段时间 LCD_E = 1; // 设置E为1表示使能 delay(50); // 延时一段时间 LCD_E = 0; // 设置E为0表示失能 } void lcd_init() // 初始化函数 { lcd_write_cmd(0x38); // 设置液晶为8位数据总线,2行显示,5x7点阵 lcd_write_cmd(0x0c); // 将液晶设置为开启显示,无光标,无闪烁 lcd_write_cmd(0x06); // 设置字符显示为向右移动,不移动幕 lcd_write_cmd(0x01); // 清 } void lcd_display(unsigned char row, unsigned char col, unsigned char *str) // 显示函数 { unsigned char addr; if(row == 1) addr = 0x80 + col; else addr = 0xc0 + col; lcd_write_cmd(addr); while(*str != '\0') { lcd_write_data(*str++); } } void main() { lcd_init(); // 初始化液晶 lcd_display(1, 0, "987654321"); // 显示字符串 while(1); } ``` 在以上代码中,我们首先定义了P0口和P2口的引脚,然后定义了写指令函数`lcd_write_cmd`和写数据函数`lcd_write_data`,这两个函数用于向液晶写入指令和数据。 接着,我们定义了初始化函数`lcd_init`,用于初始化液晶的配置,比如设置为8位数据总线、2行显示、5x7点阵等。 最后,我们定义了显示函数`lcd_display`,用于在指定位置显示字符串。在`main`函数中,我们首先初始化液晶,然后调用`lcd_display`函数显示字符串"987654321"。 注意,以上代码仅供参考,具体实现可能需要根据硬件、软件环境的不同进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值