⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 LCD12864的嵌入式C程序 很有参考价值!
💻 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 + -