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

📄 lcd.c

📁 单片机做的图片菜单显示
💻 C
字号:
#include"zimo.h"
#include <reg52.h>  //头文件
//液晶信号控制引脚定义
sbit DI=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit E=P2^0; // 读\写使能
sbit CS1=P2^4; // 片选1
sbit CS2=P2^3; // 片选2

//以下是外面是数组说明
extern unsigned char code ziku[];
extern uchar code picture[][64];
extern uchar code Hzk[][32];
unsigned int number=0,mstcnt=0;

//自己定义函数说明
void  delay(uint ms);




//以下为基本操作程序
////*******************************//
//液晶判忙函数********************//
//*******************************//
void checkstate() //判断液晶是否忙
{
	unsigned char dat;
	DI=0;  //指令模式
	RW=1;  //读控制器
	do
	{
	    P1=0x00;
		E=1; 
		dat=P1;
	      E=0;
		dat=0x80 & dat; 				//仅当第7位为0时才可操作(判别busy信号)
	}while(!(dat==0x00));
}
//**********************************//
// I/O口向液晶控制器写命令函数*******//
//***********************************//
void writecommand(unsigned char command) 	//写命令
{
	checkstate();
	RW=0;
	P1=command;
	E=1;         //要注意这个些数据或者命令写入液晶控制器都是下降延的
	E=0;
}
//************************************************//
//******I/O口向液晶控制器写数据函数****//
//***********************************************//
void writedate(unsigned char date)		//写数据
{
   checkstate();
   DI=1; RW=0;
   P1=date;
   E=1; E=0; 
}
//*********************************
//***清屏幕************
///*******************************
void cleanscreen()						 //清屏
{
	unsigned char page,i;
	for(page=0xb8;page<0xc0;page++) //一共写8页
	{
		writecommand(page);
		writecommand(0x40); //将控制器指针拉回到第0列
		for(i=0;i<64;i++) //写64列数据,每列为一个字节
			{writedate(0x00);//(8个位纵向组成一个页)
			//delay(10);
			}
	}
}
//*************************//
//*****液晶片选函数******//
//***********************//
void choosescreen(unsigned char NO)		//选择屏幕
{
	switch (NO)
	{
		case	0: //选择2片(左右两片)
			CS1=0;
			CS2=0;
			break;
		case	1://选择左片液晶
			CS1=0;
			CS2=1;
			break;
		case	2:
			CS1=1;//选择右片液晶
			CS2=0;
			break;
		default:
			break;
	}	
}

//*********************//
//******初始化函数**** //
//********************//
void lce_init(void)
{
	writecommand(0xc0); //显示起始为0页
	writecommand(0x3f);  //开启液晶
}

//*************************************************//
//按照序号显示汉字程序
//count 为要显示的汉字的序号
//**按照数组中次序依次显示32个汉字。在两块液晶上面
//**************
void display(unsigned char count)
{
	unsigned int i,m; 
	choosescreen(1);     //左块液晶
	writecommand(0xb8);	//页指针指向第0页
	writecommand(0x40); //列指针指向第0列
	for(i=0;i<count*16;i++)
	{
		if(i!=0&&i%16==0) //一个汉字在控制器缓寸上占据16*16空间
			m++;  //下个汉字
		switch (i)
		{
			case	64:  //这里有两块液晶公八页,这里是要确定下一个汉字到底在
			             //哪块液晶的哪一页起始,列都是从0开始所以写(0x40)
				choosescreen(2);
				writecommand(0xb8);	
				writecommand(0x40);
				break;
			case	128:
				choosescreen(1);
				writecommand(0xba);	
				writecommand(0x40);
				break;
			case	192:
				choosescreen(2);
				writecommand(0xba);	
				writecommand(0x40);
				break;
			case	256:
				choosescreen(1);
				writecommand(0xbc);	
				writecommand(0x40);
				break;
			case	320:
				choosescreen(2);
				writecommand(0xbc);	
				writecommand(0x40);
				break;
			case	384:
				choosescreen(1);
				writecommand(0xbe);	
				writecommand(0x40);
				break;
			case	448:
				choosescreen(2);
				writecommand(0xbe);	
				writecommand(0x40);
				break;
			default:
				break;
	 	}
	   writedate(*(ziku+i+m*16));//数组元素的访问的一种写法
		//下面的语句等价的
       //writedate(ziku[i+(m*16)]);
	}
	choosescreen(1); 
	writecommand(0xb9);	//页指针指向下一页,送下半个汉字的字模数据
	writecommand(0x40);//列归零
	m=0;
	
	for(i=0;i<count*16;i++)
	{
		if(i!=0&&i%16==0)
			m++;
		switch (i)
		{
			case	64:
				choosescreen(2);
				writecommand(0xb9);	//这段程序和上面那段类似就页加一就可以
				writecommand(0x40);
				break;
			case	128:
				choosescreen(1);
				writecommand(0xbb);	
				writecommand(0x40);
				break;

			case	192:
				choosescreen(2);
				writecommand(0xbb);	
				writecommand(0x40);
				break;
			case	256:
				choosescreen(1);
				writecommand(0xbd);	
				writecommand(0x40);
				break;
			case	320:
				choosescreen(2);
				writecommand(0xbd);	
				writecommand(0x40);
				break;
			case	384:
				choosescreen(1);
				writecommand(0xbf);	
				writecommand(0x40);
				break;
			case	448:
				choosescreen(2);
				writecommand(0xbf);	
				writecommand(0x40);
				break;
			default:
				break;
		} //
		writedate(*(ziku+i+m*16+16));
		//下面的语句等价的
        //writedate(ziku[i+(m*16)]);
	}
	m=0;	
}


//*****************************************************************/
//功能:在B液晶上显示汉字程序///////////////////////////
//参数说明:adds:字库内序号    nb:要显示的汉字的个数(1~4个)
// x:显示起始列    y:显示起始页(0~6)   style: 显示风格(白或荫?                                                        
/*******************************************************************/
wr_hz_b(uchar adds,uchar nb,uchar x,uchar y,uchar style)                 
{                                                            
uchar i,j; 
     choosescreen(2); //选择B块液晶                                                  
 for(j=adds;j<adds+nb;j++)                                    
	 { 
      writecommand(0x40+16*x);	                                                    
	 //write_comd_b(0x40+16*x); 
     // write_comd_b(0xb8+y);
       writecommand(0xb8+y);                                 
	  for(i=0;i<16;i++)
         //显示的风格设置(背景设置)
	     if(style==1)
		     //write_data_b(~Hzk[j][i]);
			 writedate(~Hzk[j][i]);
	      else
		     //write_data_b(Hzk[j][i]);
             writedate(Hzk[j][i]);                                                               
	 //下半个汉字                                                            
	   //write_comd_b(0x40+16*x); //调整指针位置 列回到起始处                                  
	   //write_comd_b(0xb8+y+1);  //页向下一页 
          writecommand(0x40+16*x); 
          writecommand(0xb8+y+1);             
	  for(i=16;i<32;i++)     //显示一个汉字的剩余16个字节数据                                  
	      if(style==1)
		     //write_data_b(~Hzk[j][i]);
			 writedate(~Hzk[j][i]);
	       else 
		     //write_data_b(Hzk[j][i]);  
            writedate(Hzk[j][i]);                 
	     x++; //一个汉字完了后列也要向后16列了                                                       
	   }                                                           
}        



/**********************************************/
/*名称:图片显示
/*功能: 在左半块或者右半块显示64*64的指定图片
/*********************************************/
void disp_pic_a_or_b(uchar fu,uchar pos)
{
                                                           
uchar i,j;  
    if(pos==0)//选择左块
	  {
       	for(j=0;j<8;j++)                                             
		 { 
           choosescreen(1);
		   writecommand(0x40);	//这段程序和上面那段类似就页加一就可以
		   writecommand(0xb8+j);                                                 
		 //write_comd_a(0x40);                                         
		 //write_comd_a(0xb8+j);                                       
		  for(i=0;i<64;i++)                                          
		 // write_data_a(picture[8*fu+j][i]);  
         writedate(picture[8*fu+j][i]);		//写数据                    
		 }  
      }   
    
    else
           
      {
	  for(j=0;j<8;j++)                                             
		 {
           choosescreen(2);
		   writecommand(0x40);	//这段程序和上面那段类似就页加一就可以
		   writecommand(0xb8+j);                                            
		//write_comd_b(0x40);                                         
		 //write_comd_b(0xb8+j);                                       
		  for(i=0;i<64;i++)  
          writedate(picture[8*fu+j][i]);//写数据                                
		  //write_data_b(picture[8*fu+j][i]);                               
		 }  
     }
                           
} 






//******************//
//软件延迟时间
//
//*****************//
void  delay(uint ms)
{
 uchar i;
  while(ms--)
  for(i=0;i<123;i++);
 
}
//*****************************//
//         主函数
//*****************************//
main()
{
  uchar i;
	TMOD=0x02; //定时器0方式2 (8位自动加载模式)
	TH0=0x06; //初始数值
	TL0=0x06;//初始数值
	ET0=1;//定时器0中断允许
	TR0=1;  //开启定时器
	
	 //这个中断我先屏蔽叼			  
//	EA=1;//总中断允许
	
 	E=1;//使能液晶
    lce_init(); //初始化液晶
	choosescreen(0);//选择2块液晶 
	cleanscreen(); //清除2块液晶
	
    

while(1)
	{

	  for(i=0;i<33;i++)
	  {//显示32固定个汉字
       display(i);
	   delay(500);
	  }
     choosescreen(1);//选择1块液晶 
	 cleanscreen(); //清除1块液晶
	 delay(500);
 	 choosescreen(2);//选择2块液晶 
	 cleanscreen(); //清除2块液晶
	 delay(1000);
	 disp_pic_a_or_b(0,0); //显示64*64图片
     wr_hz_b(0,4,0,3,0) ;  //B快任意位置显示汉字
     delay(2000);
	 choosescreen(0);//选择2块液晶 
	 cleanscreen(); //清除2块液晶

	}





}

⌨️ 快捷键说明

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