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

📄 12864perfect.c

📁 3线控制12864液晶的源程序代码
💻 C
字号:
#include <reg52.H> 
#include <intrins.h>

#define uint unsigned int 
#define uchar unsigned char

uchar code Photo1[] ={
 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,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0xFF,0x1C,0x7C,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xE3,0x9C,0x7C,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xC7,0x9E,0xFC,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x07,0x9E,0xF9,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1E,0x67,0x9C,0x59,0xE1,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0xF3,0xC0,0x1B,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x79,0xF0,0xFF,0xFB,0xE3,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,
0x00,0xF1,0xF3,0xFF,0xFF,0x67,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x00,
0x01,0xE3,0xCF,0xE0,0x1F,0xDF,0x9E,0x00,0x00,0x01,0xE0,0x00,0x00,0x1F,0xF0,0x00,
0x01,0xD1,0xDF,0x80,0x07,0xE2,0x0E,0x00,0x00,0x01,0xE0,0x00,0x00,0x1F,0xF0,0x00,
0x03,0xF8,0x3E,0x00,0x01,0xF2,0x07,0x00,0x00,0x01,0xE0,0x80,0x00,0x0F,0xF0,0x00,
0x03,0xFE,0x78,0x00,0xC0,0x79,0xF7,0x00,0x00,0x01,0xE3,0xE0,0x00,0x07,0xC0,0x00,
0x07,0x3E,0xF0,0x00,0xE0,0x3D,0xFF,0x80,0x00,0x01,0xE7,0xE0,0x00,0x07,0x80,0x00,
0x07,0x3D,0xE0,0x00,0xF0,0xFE,0x7B,0x80,0x00,0x03,0xE7,0xE0,0x02,0x07,0x80,0x00,
0x0E,0x3F,0xC0,0x71,0xF9,0xEF,0xF9,0xC0,0x00,0x03,0xE7,0xC0,0x07,0x07,0xFF,0xC0,
0x0E,0x3F,0x80,0x7D,0xFF,0xE7,0xE1,0xC0,0x00,0x03,0xE7,0x80,0x07,0x0F,0xFF,0xC0,
0x0C,0x03,0x80,0x7F,0xFF,0xE7,0x01,0xC0,0x00,0x03,0xF6,0x00,0x07,0x1F,0xFF,0xC0,
0x1C,0x67,0x00,0x7F,0xFF,0xE3,0x98,0xE0,0x00,0x03,0xF0,0xE0,0x0F,0xFF,0x81,0xC0,
0x1C,0x67,0x00,0xFF,0xFF,0xE3,0x88,0xE0,0x00,0x03,0xF3,0xF0,0x0F,0xFF,0x80,0x00,
0x1C,0x06,0x00,0xFF,0xFF,0xE1,0x80,0xE0,0x00,0x07,0xFF,0xF8,0x1F,0xFF,0x80,0x00,
0x19,0xEE,0x00,0x1F,0xFF,0xE1,0xDE,0xE0,0x00,0x0F,0xEF,0xF8,0x1F,0xF7,0xC0,0x00,
0x18,0xEE,0x00,0x7F,0xFF,0xE1,0xDE,0x60,0x00,0x1F,0xFF,0xF0,0x1F,0xCF,0xF0,0x00,
0x19,0xEE,0x07,0xFB,0xFF,0xE1,0xD8,0x60,0x00,0x7F,0xEF,0xE0,0x1F,0x8F,0xF0,0x00,
0x19,0x6E,0x0F,0x83,0xFF,0xC1,0xD0,0x60,0x00,0xFF,0xE7,0xC0,0x1F,0x8F,0xF0,0x00,
0x19,0xEE,0x1E,0x01,0xFF,0xC1,0xDE,0x60,0x03,0xFF,0xEF,0xC0,0x1F,0x06,0x60,0x00,
0x19,0xEE,0x3C,0x01,0xFF,0x81,0xD0,0x60,0x07,0xF7,0xEF,0xE0,0x0F,0x03,0xF0,0x00,
0x19,0x8E,0x7C,0x01,0xFF,0x01,0xDA,0x60,0x07,0xE7,0xFF,0xF0,0x00,0x0F,0xFE,0x00,
0x19,0xEE,0x78,0x01,0xFE,0x01,0xDE,0x60,0x07,0xCF,0xFE,0xFF,0x00,0xFF,0xFE,0x00,
0x1D,0xEE,0x78,0x03,0xFC,0x05,0xDE,0xE0,0x00,0x1F,0xFE,0x7F,0x01,0xE7,0xFE,0x00,
0x1D,0xE7,0x7C,0x07,0xF8,0x0F,0xBE,0xE0,0x00,0x1F,0xFC,0x7F,0x03,0xE7,0xFE,0x00,
0x1C,0xF7,0x7C,0x0F,0xE0,0x1B,0xBE,0xE0,0x00,0x3F,0xF8,0x3F,0x03,0xF7,0xFC,0x00,
0x1C,0xF7,0x7E,0x3F,0x80,0x3B,0x84,0xE0,0x00,0x7F,0xC0,0x00,0x01,0xF7,0xF8,0x00,
0x0E,0xF3,0xFF,0x78,0x00,0xF7,0x7D,0xC0,0x00,0x7B,0xC0,0x00,0x01,0xFF,0xF0,0x00,
0x0E,0xFB,0xFF,0xC0,0x07,0xEF,0x79,0xC0,0x00,0x77,0xC0,0x00,0x01,0xFF,0xE0,0x00,
0x0E,0x7D,0xFF,0xFF,0xFF,0xCE,0xF9,0xC0,0x00,0x07,0xC0,0x00,0x00,0xFF,0xE0,0x00,
0x07,0x7D,0xEF,0xFF,0xFF,0x1E,0xFB,0x80,0x00,0x07,0xC0,0x00,0x00,0xFF,0xC0,0x00,
0x07,0x6E,0xF7,0xFF,0xFC,0x3D,0xFB,0x80,0x00,0x07,0xC0,0x00,0x00,0x7B,0xFF,0x00,
0x03,0xBF,0x79,0xFF,0xE0,0x78,0xF7,0x00,0x00,0x07,0xC0,0x00,0x00,0x01,0xFF,0x00,
0x03,0xDF,0x3E,0x00,0x01,0xF3,0xEF,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xFF,0x00,
0x01,0xCF,0x9F,0x80,0x07,0xE7,0xEE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,
0x01,0xE7,0xC7,0xF0,0x3F,0x8F,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,
0x00,0xF7,0xE1,0xFF,0xFE,0x3F,0xBC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x7B,0xF8,0x7F,0xF8,0x7F,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x3C,0xFB,0x00,0x01,0xFE,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1E,0xF7,0xE0,0x0C,0xF9,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x07,0xEF,0xFC,0xE3,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0xC7,0xFF,0xB6,0x2F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0xF2,0xFF,0xBE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x36,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x80,0x07,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0xE0,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,
};
sbit IRIN = P3^2;         //红外接收器数据线
/*12864 pins define*/ 
sbit CS=P1^0; 
sbit SID=P1^1; 
sbit SCLK=P1^2; 

uchar IRCOM[7];

//全局变量
uchar   key;


void delay0(uchar x)    //x*0.14MS	  
{
  uchar i;
  while(x--)
 {
  for (i = 0; i<13; i++) {}
 }
}




void delay(uint x) 
{ 
uint j; 
uchar i; 
for(j=0;j<x;j++) 
{ 
for(i=0;i<120;i++); 
} 
}

 void lcd_delay(int ms)
{
    while(ms--)
	{
      uchar i;
	  for(i=0;i<250;i++)  
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}



void send_command(uchar command_data) 
{ 
uchar i; 
uchar i_data,temp_data1,temp_data2; 
i_data=0xf8; 
//delay(10); 
CS=1; 
SCLK=0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
i_data=command_data; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
i_data=command_data; 
temp_data1=i_data&0xf0; 
temp_data2=i_data&0x0f; 
temp_data1>>=4; 
temp_data2<<=4; 
i_data=temp_data1|temp_data2; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
CS=0; 
} 

void send_data(uchar command_data) 
{ 
uchar i; 
uchar i_data,temp_data1,temp_data2; 
i_data=0xfa; 
//delay(10); //原来是delay(10)
CS=1; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
i_data=command_data; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
i_data=command_data; 
temp_data1=i_data&0xf0; 
temp_data2=i_data&0x0f; 
temp_data1>>=4; 
temp_data2<<=4; 
i_data=temp_data1|temp_data2; 
i_data&=0xf0; 
for(i=0;i<8;i++) 
{ 
SID=(bit)(i_data&0x80); 
SCLK=0; 
SCLK=1; 
i_data=i_data<<1; 
} 
CS=0; 
}

void lcd_init() 
{ 
uchar command_data; 
delay(100); 
command_data=0x30; 
send_command(command_data); /*功能设置:一次送8位数据,基本指令集*/ 
command_data=0x04; 
send_command(command_data); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ 
command_data=0x0c; 
send_command(command_data); /*显示设定:开显示,显示光标,当前显示位反白闪动*/ 
command_data=0x01; 
send_command(command_data); /*清DDRAM*/ 
command_data=0x02; 
send_command(command_data); /*DDRAM地址归位*/ 
command_data=0x80; 
send_command(command_data); /*把显示地址设为0X80,即为第一行的首位*/ 
}






 /*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   pos = X+Y ; 
 
   send_command(pos);     //显示地址
}




/*********************************************************
*                                                        *
* 闪烁函数                                               *
*                                                        *
*********************************************************/


void lcdflag() 
{
   send_command(0x08);   		   //睡眠模式
   lcd_delay(400);
   send_command(0x0c);   			//睡眠中醒过来了,哈哈
   lcd_delay(400);
   send_command(0x08);   
   lcd_delay(400);
   send_command(0x0c);   
   lcd_delay(400);
   send_command(0x08);   
   lcd_delay(400);
   send_command(0x0c);   
   lcd_delay(5);
   send_command(0x01);   
  lcd_delay(5);
}



/*********************************************************
*                                                        *
* 图形显示                                               *
*                                                        *
*********************************************************/
void photodisplay(uchar *bmp)	
{ 
  uchar i,j;

  send_command(0x34);        //写数据时,关闭图形显示

  for(i=0;i<32;i++)
  {
    send_command(0x80+i);    //先写入水平坐标值
    send_command(0x80);      //写入垂直坐标值
    for(j=0;j<16;j++)   //再写入两个8位元的数据    
    send_data(*bmp++);     
   // delay(1);
  }

  for(i=0;i<32;i++)
  { 
    send_command(0x80+i);
    send_command(0x88);
    for(j=0;j<16;j++)         
	send_data(*bmp++);    
//	delay(1);
  }
  send_command(0x36);       //写完数据,开图形显示 
}
/*********************************************************/
//红外发射
/*************************************/
void IR_IN() interrupt 0 using 0   
{
  uchar i,j,k,N=0;
  uchar number;
     EX0 = 0;   
	 delay0(15);
	 if (IRIN==1) 
     { EX0 =1;
	   return;
	  } 
                         //确认IR信号出现
  while (!IRIN)           //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay0(1);}

 for (j=0;j<4;j++)         //收集四组数据
 { 
  for (k=0;k<8;k++)        //每组数据有8位
  {
    while (IRIN);       //等IR变为低电平,跳过4.5ms的前导高电平信号。
    while (!IRIN);      //等IR变为高电平
    while (IRIN)        //计算IR高电平时长
      {
        delay0(1);
        N++;           
       if (N>=30)
	    { EX0=1;
	      return;}            //0.14ms计数过长自动离开。
      }                       //高电平计数完毕                
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
     N=0;
   }//end for k
 }//end for j
     if (IRCOM[2]!=~IRCOM[3])
   { EX0=1;
     return; }
	switch(IRCOM[2])
	{case 0x10:number=1;break;
	case 0x03:number=2;break;
	case 0x01:number=3;break;
	case 0x06:number=4;break;
	case 0x09:number=5;break;
	case 0x1D:number=6;break;
	case 0x1F:number=7;break;
	case 0x0D:number=8;break;
	case 0x19:number=9;break;
	case 0x1B:number=0;break;
//	case 0x11:next++;if(next==3) next=0;number=0;break;
//	case 0x15:queren++;break;
//	case 0x17:gg++;if(gg==4) gg=0;break;


//	case 0x1c:c1++;if(c1==10) c1=0;break;
//	case 0x14:c2++;if(c2==10) c2=0;break;
//	case 0x0f:c3++;if(c3==10) c3=0;break;

	default:break;
   }

   key=number;

	lcd_pos(2,4);

	send_data(0x30+key);
   
			

	 EX0 = 1; 
}




main() 
{ 
	uchar command_data; 
	uchar i;
   EA=1;
   EX0=1;
   IT0=1;
   IRIN=1;                    //I/O口初始化
                //上电,等待稳定
	lcd_init(); 

  send_command(0x01);
 photodisplay(Photo1);     //显示图片1
  //lcdflag();
  //send_command(0x80);
  //send_data(0xa1);
  //send_data(0xf8); 
  //delay(1000);
  //send_command(0x80);
 // send_command(0x00); 
  while(1);

	  
  
  
    
}

⌨️ 快捷键说明

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