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

📄 lcd12232基本实现备份.txt

📁 基于89s52单片机控制的液晶显示程序
💻 TXT
字号:
/******************************************
基本功能:练习LCD12232的静态显示,实现显示
多个汉字的功能。

     Author:           CHANG  MING
     Create Time:      2009/3/7
*****************************************/
#include<c8051f020.h>
#include<intrins.h>

sbit LCD_A0 = P2^6;
sbit LCD_RW = P0^7;
sbit LCD_E1 = P2^4;
sbit LCD_E2 = P2^7;
//sbit LCD_RST= P3^0;

#define DATA P3
#define  N   8

unsigned char code strru[]={
0x10,0x61,0x06,0xE0,0x18,0x84,0xE4,0x1C,0x84,0x65,0xBE,0x24,0xA4,0x64,0x04,0x00, //1上0

0x00,0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00,0x00, //2上0

0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //3上0

0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //4上0

0x00,0x00,0xFF,0x09,0x49,0x59,0xE9,0x49,0x49,0x49,0xE9,0x59,0x49,0x4F,0x00,0x00, //5上0

0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0x00,0x00,0x00,0x00, //6上0

0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00, //7上0

0x00,0x10,0x0C,0x24,0x24,0x24,0x25,0x26,0xA4,0x64,0x24,0x04,0x14,0x0C,0x00,0x00, //8上2

0x10,0x0C,0x03,0xC2,0x36,0x4A,0x42,0x52,0x48,0x47,0x42,0xF6,0x4A,0x42,0x42,0x00, //9上2

0x20,0x30,0xAE,0x64,0x30,0x00,0x04,0x24,0xE4,0x3F,0x24,0xE4,0x04,0x04,0x00,0x00, //10上2

0x00,0x00,0x02,0x02,0x0A,0x12,0x22,0x62,0x02,0x82,0x82,0x42,0x02,0xFE,0x00,0x00,

0x00,0x00,0x00,0x00,0x7E,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xCC,0x08,0x00,

0x40,0x41,0xCE,0x04,0x00,0x20,0x22,0xA2,0x62,0x22,0xA2,0x22,0x22,0x22,0x20,0x00,

0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,

0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,

0x40,0x42,0xDC,0x08,0x00,0x90,0x90,0x90,0x90,0x90,0xFF,0x10,0x12,0x1C,0x10,0x00

};
unsigned char code strrd[]={
0x04,0x04,0xFF,0x00,0x01,0x00,0xFF,0x41,0x21,0x12,0x0C,0x1B,0x61,0xC0,0x40,0x00, //1下1

0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00,0x00,0x7F,0x25,0x25,0x25,0x25,0x7F,0x00, //2下1

0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //3下1

0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //4下1

0x40,0x30,0x0F,0x82,0x42,0x32,0x0F,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x00, //5下1

0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00, //6下1

0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00, //7下1

//0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1

0x00,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00, //8下3

0x04,0x02,0x01,0xFF,0x00,0x00,0x01,0x06,0x0C,0x40,0x80,0x7F,0x00,0x00,0x00,0x00, //9下3

0x22,0x23,0x22,0x12,0x12,0x00,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x09,0x31,0x00,//10下3

0x00,0x00,0x04,0x0C,0x04,0x02,0x02,0x01,0x01,0x00,0x20,0x40,0x80,0x7F,0x00,0x00,

0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x24,0x46,0x44,0x20,0x1F,0x00,0x00,

0x40,0x20,0x1F,0x20,0x28,0x4C,0x4A,0x49,0x48,0x4C,0x44,0x45,0x5E,0x4C,0x40,0x00,

0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,

0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00,

0x00,0x00,0x7F,0x20,0x10,0x20,0x20,0x1F,0x10,0x10,0x01,0x06,0x18,0x20,0x78,0x00

};

//延时程序*******************************
void delay(unsigned int process_i)
{    unsigned int part_i;
     for(;process_i>0;process_i--)
     for(part_i=0;part_i<124;part_i++)
     ;
}


//判断是E1否处于忙状态********************
unsigned char LCD_busye1(void)
{   
    unsigned char   result;
    DATA=0xff;
    LCD_A0 = 0;
    LCD_RW = 1;
    LCD_E1 = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = DATA & 0x80;
    LCD_E1 = 0;		   //很重要,读完数据后将E电平拉低
    return result;
}  

//判断是E2否处于忙状态********************
unsigned char LCD_busye2(void)  
{
    unsigned char  result;
    DATA=0xff;
    LCD_A0 = 0;
    LCD_RW = 1;
    LCD_E2 = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    result = DATA & 0x80;
    LCD_E2 = 0;
 	return result;
}


//写数据*******************************
void LCD_writedata(unsigned char process_i,unsigned char process_data)
{
    //while(LCD_busye1());		//忙判断
    //while(LCD_busye2()!=0x00);

    if(process_i==1)
     {
     LCD_A0 = 1;
     LCD_RW = 0;
     LCD_E1 = 1;
     DATA   = process_data;
     //delay(5);
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     LCD_E1 = 0;
     delay(5);
      }
    if(process_i==2)
     {
     LCD_A0 = 1;
     LCD_RW = 0;
     DATA   = process_data;
     LCD_E2 = 1;
     _nop_();
     _nop_(); 
	 _nop_();
     _nop_();
     LCD_E2 = 0;
     delay(5);
     }
    if(process_i==3)
     {
     LCD_A0 = 1;
     LCD_RW = 0;
     DATA   = process_data;
     LCD_E2 = 1;
     LCD_E2 = 1;
     _nop_();
     _nop_(); 
	 _nop_();
     _nop_();
     LCD_E2 = 0;
     LCD_E2 = 0;
     delay(5);
     }
}

//写指令*******************************
void LCD_writecommand(unsigned char process_data)
{   
   //while(LCD_busye1());	   //忙判断
    //while(LCD_busye2()!=0x00);

    LCD_A0 = 0;
    LCD_RW = 0;
    LCD_E1 = 1;
    DATA   = process_data;
    delay(5);
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    LCD_E1 = 0;
    delay(5);

    LCD_A0 = 0;
    LCD_RW = 0;
    LCD_E2 = 1;
    DATA   = process_data;
    delay(5);
    _nop_();
    _nop_();
    _nop_();
    _nop_(); 
    LCD_E2 = 0;
    delay(5);

}

//端口初始化*********************************
#define LCD_rest      0xe2
#define LCD_on        0xaf       //开显示
#define LCD_duty      0xa9      //占空比32
#define LCD_drive     0xa4      //驱动
#define LCD_line      0xc0      //起始行,第0行
#define LCD_direction 0xa0      //显示方向
#define LCD_page      0xb8      //显示起始页,第0页
#define LCD_column    0x00      //显示起始列,第0列
#define LCD_end       0xee

void LCD_inite(void)
{  
   LCD_writecommand(LCD_on & 0xfe);
   LCD_writecommand(LCD_rest);
   LCD_writecommand(LCD_on);
   LCD_writecommand(LCD_duty);
   LCD_writecommand(LCD_drive);
   //LCD_writecommand(LCD_line); 
   LCD_writecommand(LCD_direction);
   //LCD_writecommand(LCD_page);
   //LCD_writecommand(LCD_column);
   LCD_writecommand(LCD_end);
}

//清除残余黑点******************************
void LCD_clearpoint(unsigned char i)
{
    unsigned char j=0;  
 
    if(N>=7)
	{
		 if(i%112==111)
	      { //LCD_writecommand((LCD_page | 2)); //起始地址设置
            //LCD_writecommand(LCD_column | 112 );
		    LCD_writedata(2,0x00);
	        LCD_writedata(2,0x00);
		  }
         if(i==N*16-1)
		  {
          j=(122-N%7*16)/8+1;
	      while(j-->0)
	      LCD_writedata(3,0x00);
		  }
	 }

    if(N<7)
	{  
		  j=(122-N*16)/8+1;
	      if(i==(N*16-1))
	      while(j-->0)
	      LCD_writedata(3,0x00);
	}

}

//main()*************************************

void main(void)
{  
   unsigned char i=0;
   unsigned char flag=0;   //控制上下屏
   unsigned char flag1=0;  //控制左右屏
   unsigned char k=0,n=0,p=0;	   //k控制交界次数

   WDTCN = 0XDE;           //关闭看门狗
   WDTCN = 0XAD;

   OSCXCN= 0x67;        //设置外部晶振频率,使用外部振荡器时应先设置OSCXCN,后设置OSCICN
   while(OSCXCN==0x67);//必须等待使时钟稳定,XTLVLD由0变为1
   OSCICN= 0x08;       //设置时钟使用外部晶振频率11.0592MHZ
  
   XBR0  = 0X00;       //配置交叉开关
   XBR1  = 0X00;
   XBR2  = 0X40;

   P0MDOUT = 0XFF;       //输出方式选择  
   P2MDOUT = 0XFF;
   P3MDOUT = 0XFF;     

   LCD_inite();  

  while(i<(N*16))            //字符的上半部分
   {
	 if((i/112)%2==0)	   //page0、page2选择
	  {  flag=0x01;
	     n=0x00;
	  }
     else 
      {  flag=0x03;
         n=0x10;
      }

     if((i/16%7) >= 4)		  //左右屏选择
        flag1=0x02;
     else
        flag1=0x01;

     //LCD_clearpoint(i);
     
	 if(i%16==0 && i/16%7==0)	   //确定字符起始位置
     { 
       LCD_writecommand((LCD_page | flag)); //起始地址设置
	   LCD_writecommand((LCD_line | n));
       LCD_writecommand(LCD_column );
	 }


     if(i/16%7==3)				  //交界处字符特殊处理
	 {
       for(;i<=(60+112*k);i++)
	   LCD_writedata(1,strru[i]); //左区有效
       for(;i<=(63+112*k);i++)
	   LCD_writedata(2,strru[i]); //右区有效 
       k++;            
     } 

     LCD_writedata(flag1,strru[i]); 
     i++;

   }

   i=0;
   k=0;						 
   
    while(i<(N*16))		//写字符的下半部分
   {
	 if((i/112)%2==0)
	  {  flag=0x02;
         n=0x08;
	  }
     else 
      { flag=0x00;
        n=0x18;
	  }

     if(i/16%7>=4)
        flag1=0x02;
     else
        flag1=0x01;

     //LCD_clearpoint(i);
    
	 if(i%16==0 && i/16%7==0)
     {
       LCD_writecommand((LCD_page | flag));
	   LCD_writecommand((LCD_line | n));
       LCD_writecommand(LCD_column );
	 }

     if(i/16%7==3)
	 {
       for(;i<=(60+112*k);i++)
	   LCD_writedata(1,strrd[i]);
       for(;i<=(63+112*k);i++)
	   LCD_writedata(2,strrd[i]);
       k++;            
     } 

     LCD_writedata(flag1,strrd[i]);
     i++;
   
   }

  p=1;	
 while(1) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -