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

📄 lcd.c

📁 基于51单片机的12864液晶显示程序例程,请参考
💻 C
字号:
//带字库12864液晶LCD驱动(JDL12864,FM12864等)

#include <reg52.h>

#define lcd_Bus P1
#define Key_Bus P2


/******************************************************
//sbit FSB=P1^3;
sbit RS=P3^5;
sbit RW=P3^6;
sbit EN=P3^7;
*************************************************************/

//sfr Key_Num;
sbit RS=P3^5;
//sbit RW=P1^5;
sbit EN=P3^7;
static int Num;//静态变量,键盘数值
static int Cur=0x89;//光标数值
//////////////////////////////////



void Dis_line(unsigned char *px,unsigned char line);
void Dis_Num(unsigned char Number,unsigned char ddram);



unsigned char code x1_1[13]={12,0xc7,0xeb,0xca,0xe4,0xc8,0xeb,0xc3,0xdc,0xc2,0xeb,0xa3,0xba};//请输入密码:
unsigned char code x1_0[17]={16,0xd6,0xc7,0xc4,0xdc,0xbc,0xd2,0xbe,0xd3,0xbf,0xd8,0xd6,0xc6,0xcf,0xb5,0xcd,0xb3};//智能家居控制系统
unsigned char code x1_4[13]={12,0xa1,0xe1,0xa1,0xfc,0xa1,0xfd,0xa3,0xab,0xa3,0xad,0xa1,0xcc};//返回,上,下,+,—,确认(都是符号) 
unsigned char code x2_1[13]={12,0xbf,0xcd,0xcc,0xfc,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//客厅____C
unsigned char code x2_2[13]={12,0xb3,0xf8,0xb7,0xbf,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//厨房____C
unsigned char code x2_3[13]={12,0xce,0xd4,0xca,0xd2,0x20,0x20,0x20,0x20,0x20,0x20,0xa1,0xe6};//卧室____C
unsigned char code x2_4[13]={12,0xc9,0xe8,0xd6,0xc3,0xbf,0xaa,0xc6,0xf4,0xca,0xb1,0xbc,0xe4};//设置开启时间

//send_to_lcd_data_port=display_data;//写数据到端口  sfr send_to_lcd_data_port = 0x80;//P0
//sfr lcd_Bus=P2;
//延时子程序
void delay(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
     for(j=0;j<10;j++);
}

//写命令到LCD
void write_com(unsigned char cmd)
{  RS=0;
   //RW=0;
   EN=1;
//   FSB=1;
   lcd_Bus=cmd;      
   EN=0;
   delay(5);
}

//写数据到LCD
void write_data(unsigned char Dispdata)
{  RS=1;
   //RW=0;
   EN=1;
   lcd_Bus=Dispdata;
   EN=0;
   delay(5);
}

//初始化LCD屏
void lcdinit()
{  delay(200);
   write_com(0x30);       //选择基本指令集  
   delay(10);
   write_com(0x30);       //选择8bit数据流  
   delay(5);
   write_com(0x0c);       //开显示(无游标,不反白)  
   delay(10);
   write_com(0x01);       //清显示并设地址指针为00H   
   delay(200);
   write_com(0x06);       //指定在资料的读取及写入时设定游标的   
                         //移动方向及指定显示的位移             
}





//--------------------------------------------------
//函数名称:Dis_line
//功能:提供显示整行汉字
//入口参数:*px -要显示的字符编码数组,此数组有特殊的要求,看x数组系列
//          line - 起始行地址,因为函数的特殊,故只能是1,2,3,4这四个,表示从第一行~~第四行。
void Dis_line(unsigned char *px,unsigned char line)
{
 unsigned char i,n;
// if(line==1) line=0x80;  //第1行
//  else if(line==2) line=0x90;  //第2行
//  else if(line==3) line=0x88;  //第3行
//    else if(line==4) line=0x98;  //第4行
  n=px[0];
 for(i=1;i<n;i++)
 {
   write_com(line);  //定位显示起始位址
   write_data(px[i]);    //在字库中的汉字编码是16位,故要分两次写入,先写高8位,
   i++;
   write_data(px[i]);    //再写低8位
   line++;            //地址加1,写下一个汉字
 }
}




//---------------------------------------------------
//函数名称:Dis_Num
//功能:在某个指定的位址显示一个数字(16*16)
//入口参数:Number为要显示的10进制数字(0~9) ddram -要显示的字符的位址(0x80~~0x9f)详细的ddram与显示的屏幕位址参照ST7920
void Dis_Num(unsigned char Number,unsigned char ddram)
{
 write_com(ddram);  //定位显示的汉字的位址
 write_data(0xa3);
 if(Number==0) Number=0xb0; //0
  else if(Number==1) Number=0xb1;  //1
   else if(Number==2) Number=0xb2;  //2
    else if(Number==3) Number=0xb3;  //3
	 else if(Number==4) Number=0xb4;  //4
	  else if(Number==5) Number=0xb5;  //5
	   else if(Number==6) Number=0xb6;  //6
	    else if(Number==7) Number=0xb7;  //7
		 else if(Number==8) Number=0xb8;  //8
		  else if(Number==9) Number=0xb9;  //9
		   //else Number=0xb9;
 write_data(Number);
 Num=Number;
}

///////////////////////////////////////////////////////
void Key_in(void)
{ unsigned int i,Number,Key_Num; 
  Key_Num=Key_Bus;
  Key_Num=(Key_Num&0x3f);
  i=Key_Num;
  delay(50);  //消抖动
  Key_Num=Key_Bus;
  Key_Num=(Key_Num&0x3f); //如果还相等则有键盘输入 
  if(Key_Num=i)		//有键盘输入
  {
   if(!(Key_Num&0x01)) Number=1;	 //1
   	 else if(!(Key_Num&0x02)) Number=2; //2
	  else if(!(Key_Num&0x04)) Number=3;	//3
	   else if(!(Key_Num&0x08)) Number=4;  //4
	    else if(!(Key_Num&0x10)) Number=5;  //5
		 else if(!(Key_Num&0x20)) Number=6; //6
    
/*   
   switch(Key_Num)
   {
    case 0x80:Number=1;break;
	case 0xc0:Number=2;break;
	case 0xe0:Number=3;break;
	case 0xf0:Number=4;break;
	case 0xf8:Number=5;break;
	case 0xfc:Number=6;break;
    }
*/
   Dis_Num(Number,Cur);
   if(Cur<0x8f)Cur++;
    else Cur=0x88;
   }

}

void Key(void)
{
  if(Key_Bus!=0xff)
   	Key_in();
	while(Key_Bus!=0xff)
	   ;
}


/**************************************************显示图片
//显示字符串
void hzkdis(unsigned char code *s)
{  while(*s>0)
   {  wrire_data(*s);
      s++;
      delay(50);
   }
}

//显示文本
void ceshi()
{  write_com(0x01);           
   delay(5);
   write_com(0x82);          
   hzkdis("TOPWAY");
   write_com(0x88);          
   hzkdis("LM3033 测试程序");
}


void Disp_Img(unsigned char code *img)
{  unsigned int j=0;
   unsigned char x,y,i;
         for(i=0;i<9;i+=8)
         for(y=0;y<32;y++)
      for(x=0;x<8;x++)
     { write_com(0x36);           
       write_com(y+0x80);
       write_com(x+0x80+i);
       write_com(0x30);           
       write_data(img[j++]);
       write_data(img[j++]);
     }
}
********************************************************/


//unsigned char code BMP[]={0x00,0x00,......}     

void main()
{   lcdinit();            //初始化LCD屏
    delay(10);
//////////////////////////////////////////第一页菜单
    while(1)
    {
     //ceshi();             //显示文本
     //delay(5000);
     //write_com(0x01);     //清屏:去掉清屏后液晶界面显示变得稳定
     //delay(10);
	 Dis_line(x1_0,0x80);
	 //delay(1000);
	 Dis_line(x1_1,0x91);
     //Disp_Img(BMP);       //显示图画
     //delay(1000);
     //write_com(0x01);     //清屏
     //delay(1000);
	 Dis_line(x1_4,0x99);
	 //delay(1000);
	 //if(Key_Bus!=0xff)
	 //{Key_in();
	 Key();
	 write_com(Cur);//	光标闪烁定位
     write_com(0x0f);  //
	 //delay(1000);
//	 write_data(Num);
	 delay(5000);
	 }


////////////////////////////////////////第二页菜单
/*
	while(1)
	{
	 //write_com(0x01);    //清屏:去掉清屏后液晶界面显示变得稳定
	 Dis_line(x2_1,0x80);//客厅____C
	 Dis_line(x2_2,0x90);//厨房____C
	 Dis_line(x2_3,0x88);//卧室____C
	 Dis_line(x2_4,0x98);//设置开启时间
	 Key();
	 write_data(Num);
	 write_com(0x9f );//	光标闪烁定位
	 write_com(0x0f);//
	 delay(5000);
	 }
*/     
}

⌨️ 快捷键说明

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