12864

12864

    
.概述

点阵式液晶显示模块(LCD)广泛应用于单片机控制系统,比数码管、段式液晶能模块显示很多其它、更直观的信息,如汉字、曲线、图片等。点阵液晶显示模块集成度非常高,一般都内置控制芯片、行驱动芯片和列驱动芯片,点阵数量较大的LCD还配置RAM芯片,带汉字库的LCD还内嵌汉字库芯片,有负压输出的LCD还设有负压驱动电路等。单片机读写LCD实际上就是对LCD的控制芯片进行读写命令和数据。编程驱动LCD时,不须要对LCD的结构和点阵行列驱动原理深入了解,仅仅要理解LCD接口的定义和LCD的控制芯片的读写时序和命令就能够了。

12864LCD属于点阵图形液晶显示模块,不但能显示字符,还能显示汉字和图形,分带汉字库和不带那字库两种,价格也有区别。带汉字库的12864LCD使用起来很方便,不须要编写复杂的汉字显示程序,仅仅要按时序写入两个字节的汉字机内码,汉字就能显示出来了,驱动程序简单很多。本文例程就是基于带汉字库的12864液晶显示模块。

常见的12864LCD使用的控制芯片是ST7920ST7920一般和ST7921(列驱动芯片)配合使用,做成显示2行每行16个汉字的显示屏25632LCD,或者是做成4行每行8个汉字的显示屏12864LCD。12864LCD的读写时序和1602LCD是一样的,全然能够照搬1602LCD驱动程序的读写函数。须要注意的是,12864LCD分成上半屏和下半屏,并且两半屏之间的点阵内存映射地址不连续,给驱动程序的图片显示函数的编写添加了难度。

.电路设计

通常,12864LCD屏内都会自带背光限流电阻,背光管脚能够直接连接DC5V电源使用。12864LCD对照度调节的电位器取值10K-20K欧姆。假设说明书有明白要求的,请使用说明书规定的參数。

 

                             12864                

  

.软件设计

/*****************************************************************

*程序名称:带汉字库的12864液晶显示模块驱动

*程序功能:显示字符、汉字和图片

*开发工具:WSF-51DB开发板

* MCU型号:AT89S52-24PU

*时钟频率:12MHZ

*程序作者:吴师傅

*版权说明:吴师傅版权全部。转载请注明来源和作者

*****************************************************************/

#i nclude<reg52.h>

                           

sbit E=P3^4;//脉冲使能

sbit RW=P3^3;//读写选择

sbit RS=P3^2;//数据命令选择

sbit rst=P1^0;//12864复位

                                                                            

unsigned char code pictrue2[192]={//图片:机器猫48*32

0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0X80,0X00,0X00,0X00,0X1F,0XFF,

0XFE,0X00,0X00,0X00,0X7F,0X1F,0XFF,0X80,0X00,0X01,0XFC,0X0C,0X3F,0XE0,0X00,0X07,

0XF8,0X48,0X1F,0XF8,0X00,0X0F,0X98,0XD1,0X8F,0XFC,0X00,0X1C,0X4C,0XF3,0X9F,0XFE,

0X00,0X1A,0X33,0X39,0XB3,0XFE,0X00,0X33,0XE3,0XFC,0X40,0XFE,0X00,0X31,0X81,0XE1,

0X9E,0X7F,0X00,0X10,0XC1,0X03,0XC0,0X3E,0X00,0X18,0X01,0X03,0X70,0X9E,0X00,0X1F,

0X03,0X03,0X83,0X9E,0X00,0X09,0XE2,0X00,0X3E,0X1C,0X00,0X04,0X3F,0X80,0XFF,0X3C,

0X00,0X07,0X01,0XFF,0XC0,0X70,0X00,0X0F,0XC0,0X00,0X00,0XE0,0X00,0X1F,0XF8,0X00,

0X03,0X80,0X0F,0X0C,0X3F,0XE0,0X1E,0X00,0X39,0XED,0X3B,0XFF,0XFF,0X00,0X20,0X7A,

0XFE,0X07,0XFF,0X80,0X60,0X1C,0X1C,0X07,0XFF,0X80,0X60,0X0F,0X03,0XF7,0XFF,0X80,

0X20,0X0F,0XDE,0X3F,0XFF,0X80,0X30,0X0F,0XF0,0X0F,0XFF,0XA0,0X1C,0X0F,0XE0,0X07,

0XF8,0X30,0X0F,0XFF,0XE0,0X03,0XC8,0X60,0X01,0XE0,0X20,0X03,0X87,0XC0,0X00,0X00,

0X30,0X07,0X00,0X00,0X00,0X00,0X0C,0X0C,0X00,0X00,0X00,0X00,0X07,0XF0,0X00,0X00,

};

             

// 延时ms函数:

void Delayms(unsigned int t)

{

    unsigned int i,j;

    for(i=t;i>0;i–)

             for(j=0;j<120;j++);

}

 

// 12864检查状态函数:

void Check12864State(void)

        P2=0xff;

        E=0;//读状态前三控制线的状态

        RS=0;

        RW=1;

        E=1;//拉高,读状态

        while((P2&0x80)==0x80);//等待空暇

        E=0;//写命令后三控制线的状态

        RS=1;

        RW=0;

}

 

// 12864写命令函数:

void Write12864Command( unsigned char com)

       Check12864State();//检查状态

       P2=com;//赋值

       E=0;//写命令前三控制线的状态

       RS=0;

       RW=0;

       E=1;//拉高,写命令

       E=0;//写命令后三控制线的状态

       RS=1;

       RW=1;

}

 

//12864写数据函数:

void Write12864Data( unsigned char dat)

{

       Check12864State();//检查状态

       P2=dat;//赋值

       E=0;//写数据前三控制线的状态

       RS=1;

       RW=0;   

       E=1;//拉高,写数据

       E=0;//写数据后三控制线的状态

       RS=0;

       RW=1;

}    

 

//在指定的位置显示变量值函数:

void LCD12864DisplayValue( unsigned char y,unsigned char x,unsigned char v)

                    //y-行数值0-3x-列数值0-7,v-变量

{

   unsigned char row;

   Write12864Command(0x30);//基本指令

   Write12864Command(0x06);//地址计数器自己主动加以,光标右移

   switch(y)//依据行号选择行地址

   {

               case 0:row=0x80;break;//第一行首地址

               case 1:row=0x90;break;//第二行首地址

               case 2:row=0x88;break;//第三行首地址

               case 3:row=0x98;break;//第四行首地址

               default:;

   }

   Write12864Command(row+x);//写地址

   Write12864Data(0x30+v/100);//百位,先将数字化成ASCII码,再写入

   Write12864Data(0x30+v%100/10);/十位/先将数字化成ASCII码,再写入

   Write12864Data(0x30+v%10);//个位,先将数字化成ASCII码,再写入

}    

 

//在指定的位置显示字符串(汉字和ASCII码字符)函数:

void LCD12864DisplayString( unsigned char y,unsigned char x, unsigned char *pstr)

  //y-行数值0-3x-列数值0-7pstr-字符串指针

 //12864能够显示32个汉字(四行每行8个),一个地址相应一个汉字

//能够显示64ASCII码字符(四行每行16个),一个地址相应两个字符

  //为了实现自己主动换行功能,这个函数比較繁琐

{

     unsigned char row,n=0;

     Write12864Command(0x30);//基本指令

     Write12864Command(0x06);//地址计数器自己主动加以,光标右移

     switch(y)//依据行号选择行地址

     {

                 case 0:row=0x80;break;//第一行首地址

                 case 1:row=0x90;break;//第二行首地址

                 case 2:row=0x88;break;//第三行首地址

                 case 3:row=0x98;break;//第四行首地址

                 default:;

     }

     Write12864Command(row+x);//写地址

     while(*pstr!=’\0′)

     {

                Write12864Data(*pstr);//写字符

                pstr++;

                n++;//计数

                if((n+x*2)==16)//假设一行写完,继续写第二行

                {

                       if(y==0) Write12864Command(0x90);//写下一行地址

                       else if(y==1) Write12864Command(0x88);//写下一行地址

                       else if(y==2) Write12864Command(0x98);//写下一行地址

                       else ;

                }

                else if((n+x*2)==32)//假设第二行写完,继续写第三行

                {

                        if(y==0) Write12864Command(0x88);//写下一行地址

                        else if(y==1) Write12864Command(0x98);//写下一行地址

                        else ;

                }

                else if((n+x*2)==48)//假设第三行写完,继续写第四行

                {

                        if(y==0) Write12864Command(0x98);//写下一行地址

                        else ;

                }

                else ;

    }

}    

 

//图片模式清屏函数:

void Clear12864Screen()

{

   unsigned char i,j;

   Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令

   Write12864Command(0x36);//使用扩充指令,画图显示控制

   for(i=0;i<32;i++)

//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址仅仅有0-31,

//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,

//也就是说第0行和第32行同属一行,行地址同样;1行和第33行同属一行,以此类推

   {                           

          Write12864Command(0x80|i);//写行地址(垂直地址)

          Write12864Command(0x80);//写列地址(水平地址)

          for(j=0;j<32;j++)

                    Write12864Data(0x00);//清屏

   }

}

 

//在任何位置显示随意大小的图片函数:

void LCD12864DisplayPictrue(unsigned char y,unsigned char x,

                              unsigned char px,unsigned char py, unsigned char *pp)

//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),

//px-图片宽度,py-图片高度,pp-指针指向图片数组

//由于上下屏的地址不连续,要在任何位置显示完整的图像,处理起来比較繁琐

{

   unsigned char i,j,k;

   Clear12864Screen();//清屏

   if(y<32)//假设起始行在上半屏

   {

          k=32-y;//算出上半屏的行数

          for(i=0;i<k;i++,y++)//上半屏行数

          {

                     Write12864Command(0x80|y);//写行地址(垂直地址)

                     Write12864Command(0x80|x);//写列地址(水平地址)

                     for(j=0;j<px/8;j++)

                              Write12864Data(pp[i*px/8+j]);//写图片数据

          }

          y=0;//下半屏起始行,接上半屏继续写数据

          for(;i<py;i++,y++)//下半屏剩下的行数

          {

                     Write12864Command(0x80|y);//写行地址(垂直地址)

                     Write12864Command(0x80|(8+x));//写列地址(水平地址)

                     for(j=0;j<px/8;j++)

                              Write12864Data(pp[i*px/8+j]);//写图片数据

          }

   }

   else //假设起始行在下半屏

   {

          for(i=0;i<py;i++,y++)//行数

          {

                     Write12864Command(0x80|(y-32));//写行地址(垂直地址)

                     Write12864Command(0x80|(8+x));//写列地址(水平地址)

                     for(j=0;j<px/8;j++)

                               Write12864Data(pp[i*px/8+j]);//写图片数据

          }

   } 

}    

 

//12864初始化函数:

void Initialize12864()

       rst=0;//复位12864

       Delayms(30);

       rst=1;

       Delayms(20);

       Write12864Command(0x30);//功能设定:8位控制方式,使用基本指令

       Write12864Command(0x08);//显示关

       Write12864Command(0x01);//清屏

       Write12864Command(0x06);//地址计数器加一、光标右移

       Write12864Command(0x0c);//显示开

}

 

//主函数:

int main(void)

{

       Initialize12864();

       LCD12864DisplayString(0,0,”欢迎您来到吴师傅博客学习和交流! wellcom!”);

//显示汉字和字符

       LCD12864DisplayPictrue(32,4,48,32,pictrue2);//显示机器猫

       LCD12864DisplayValue(3,0,255);//显示255

       while(1);

       return 0;           

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109514.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • flake8配置_errorflashdownloadfailed-could

    flake8配置_errorflashdownloadfailed-couldflake8错误码

  • “电梯汇报”方法

    “电梯汇报”方法将问题通过:时间维度、空间维度、立体维度三个方面立体的表达。      时间维度:比如“昨天、今天、明天”“过去、现在、将来”等      空间维度:比如“国内、国外”“北京、上海、深圳”等      立体维度:比如“XXX方面”“XXX进展””“XXX风险”

  • Navicat 15 for MySQL注册激活码破解方法

    Navicat 15 for MySQL注册激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 一般人到底要不要学Python_Python值得学吗

    一般人到底要不要学Python_Python值得学吗前言本人纯屌丝一枚,在学python之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说自学python,一般人我还是劝你算了吧。因为我就是那个一般人。基础真的很简单,是个人稍微认点真都能懂,这就是好多人说的python简单、易懂、好学,然后就是一顿浮夸的言论,误导那些小白,再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶冷水,懂跟学会是一码事吗?先来说哈python这个就业哈,我现在生活在祖国的肚皮上–成都,(嗯,有想了解川西迷你小环线的在下面留言哦),下面亲身经历,我喃,

  • java 汉字乱码_Java中文乱码问题

    java 汉字乱码_Java中文乱码问题一、MyEclipse下的java文件中文乱码问题(MyEclipse6.5):解决方法一:Window–àPreferences…–àGeneral–àContentTypes–àText–àJavaSourceFile中Defaultencoding改写成UTF-8(你所需的编码类型)然后Update,OK确定就可以了。二、1、编码编码比较常用的有:UTF-…

  • MySQL基础知识:存储过程 – Stored Procedure

    MySQL基础知识:存储过程 – Stored ProcedureMySQL存储过程(StoredProcedure)主要的知识点:分隔符(delimiter)变量(variable)参数(parameters)分隔符(DELIMITER)MySQL通过

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号