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

📄 wdd.c

📁 单片机液晶界面系统,128*64,整个系统中容易开发
💻 C
📖 第 1 页 / 共 3 页
字号:
     Waitenble();
     Di=1;   //数据
     RW=0;   //写数据
     delay(2);
     Lcd_Bus=Wdata;
     delay(1);
     Enable=1; //忙线
     delay(2);
     Enable=0; //操作允许脉冲信号
    }
//------------------读显示数据---------------------------------
unsigned char ReadByte()
{
unsigned char dat;
Waitenble();
Di=1; RW=1;delay(2);
Lcd_Bus=0xff;
Enable=1;delay(2); dat=Lcd_Bus; Enable=0;
return(dat);
}


//--------------------指定位置显示起始-------------------------
//posx 页码    posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页

void Locate(unsigned char posx,unsigned char posy)
{
	if(posy<64)
       {
          Cs2=1;Cs1=0;delay(10);       //选中第x页左页显示 ,k=0--->7
          Lcdwritecom(Page_Add+(posx&7));       //页地址加k,从第0页开始,换行
          Lcdwritecom(Col_Add+(posy&63));        //列地址
       }
    else
       {
        Cs2=0;Cs1=1;delay(10);       //选中第x页右页显示 ,k=0--->7
          Lcdwritecom(Page_Add+(posx&7));       //页地址加k,从第0页开始,换行
          Lcdwritecom(Col_Add+((posy-64)&63));        //列地址
        }
}


//-----------------------------------------------------------------
//**************以上为基本操作函数***********************************
//-----------------------------------------------------------------







 /*
//------------------显示12864图片---------------------------
//该程序以调试通过,但未使用
void Disp_Img(unsigned char code *img)
{
    unsigned char j,k;
    for(k=0;k<8;k++)                  //8页
    {
        Cs2=1;Cs1=0;delay(10);       //选中k左页显示 ,k=0--->7
        Lcdwritecom(Page_Add+k);       //页地址加k,从第0页开始,换行
        Lcdwritecom(Col_Add+0);        //列地址
        for(j=0;j<64;j++)             //分页显示,k左页开始 ,共8页(64行)
        {Lcdwritedata(img[k*128+j]);}   //从k=0开始,选中第k行,每行128列
        Cs2=0;Cs1=1; delay(10);       //选中k右页显示
        Lcdwritecom(Page_Add+k);
        Lcdwritecom(Col_Add+0);         //Col_Add改变否
        for(j=64;j<128;j++)           //显示右页,坐标从左页开页
           Lcdwritedata(img[k*128+j]);
     }
}
 */

/*---------------------指定位置显示汉字16*16-----------------------*/
//posx 页码    posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7;  posy 0--127;
//cha为要显示的字符在字库点阵CHA_lib[][]中的位置
//-----------------------------------------------------------------
void cha_disp(unsigned char posx,unsigned char posy, unsigned char  cha)
{ unsigned char i,temp;
	temp=posy;
	Locate(posx, posy);
	for(i=0;i<16;i++)//每个字符为16列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	  	{Locate(posx, --temp);temp=0;}
	  	Lcdwritedata(CHA_lib[cha][i]);
	  	}
	temp=posy;
  Locate(posx+1, posy);
	for(i=16;i<32;i++)//每个字符为16列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	  	{Locate(posx+1,--temp);temp=0;}
	  	Lcdwritedata(CHA_lib[cha][i]);
	  	}
}
 /*---------------------指定位置反显(黑白)汉字16*16-----------------------*/
//posx 页码    posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7;  posy 0--128;
//cha为要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//-----------------------------------------------------------------
void cpl_disp(unsigned char posx,unsigned char posy, unsigned char  cha)
{ unsigned char i,temp;
	temp=posy;
	Locate(posx, posy);
	for(i=0;i<16;i++)//每个字符为16列
	  { if(temp++>63)//如果大约等于64,说明在右屏
	    {Locate(posx, --temp);temp=0;}
	  	Lcdwritedata(~CHA_lib[cha][i]);
	  }
	temp=posy;
  Locate(posx+1, posy);
	for(i=16;i<32;i++)//每个字符为16列
	  {	if(temp++>63)//如果大约等于64,说明在右屏
	  	{Locate(posx+1, --temp);temp=0;}
	  	Lcdwritedata(~CHA_lib[cha][i]);

	  }
}
//---------------------指定位置显示数字16*8(紧凑格式)-----------------------*/
//posx 页码    posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7;  posy 0--128;
//输入 Numb 为要显示数字
//-----------------------------------------------------------------
void NO_disp(unsigned char posx,unsigned char posy,unsigned char Numb)
{ unsigned char i,temp;
	temp=posy;
	Locate(posx, posy);
	for(i=0;i<8;i++)//每个字符为8列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	    {Locate(posx, --temp);temp=0;}
	    Lcdwritedata(CHA_lib[Numb][i]);
	  }
       	temp=posy;
      Locate(posx+1, posy);
	for(i=16;i<24;i++)//每个字符为16列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	  	{Locate(posx+1, --temp);temp=0;}
	  	Lcdwritedata(CHA_lib[Numb][i]);
	  	}
}
//---------------------指定位置(黑白)反显数字16*8(紧凑格式)-----------------------*/
//posx 页码    posy 列码,本液晶模块每页只能只能显示64*64 ,分左右页
//posx 0--7;  posy 0--128;
//输入 Numb 为要显示数字
//-----------------------------------------------------------------
void NO_CPLdisp(unsigned char posx,unsigned char posy,unsigned char Numb)
{ unsigned char i,temp;
	temp=posy;
	Locate(posx, posy);
	for(i=0;i<8;i++)//每个字符为8列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	   {Locate(posx, --temp);temp=0;}
	  	Lcdwritedata(~CHA_lib[Numb][i]);
	  }
       	temp=posy;
       Locate(posx+1, posy);
	for(i=16;i<24;i++)//每个字符为16列
	  {if(temp++>63)//如果大约等于64,说明在右屏
	  	{Locate(posx+1, --temp);temp=0;}
	  	Lcdwritedata(~CHA_lib[Numb][i]);
	  }
}

/*------------------初始化LCD屏--------------------------*/
//------------------------------------------------------
void init_lcd(void)
{
    Lcd_Rst=0;     //复位,低电平有效
    delay(10);
    Lcd_Rst=1;     //结束复位
    delay(10);
    Cs2=1;         //
    Cs1=0;         //

   // Lcdwritecom(Disp_Off);
    Lcdwritecom(Page_Add+0);
    Lcdwritecom(Start_Line+0);
    Lcdwritecom(Col_Add+0);
    Lcdwritecom(Disp_On);
    Cs2=0;         //
    Cs1=1;         //
   // Lcdwritecom(Disp_Off);
    Lcdwritecom(Page_Add+0);
    Lcdwritecom(Start_Line+0);
    Lcdwritecom(Col_Add+0);
    Lcdwritecom(Disp_On);
}

//------------------清除显示---------------
void Clr_Scr(void)
 {
    unsigned char j,k;
    //Waitenble();
    #if(Disp_Off_EN==1)
    delay(10);
    Cs1=1;Cs2=0;Lcdwritecom(Disp_Off);
    delay(10);
    Cs1=0;Cs2=1;Lcdwritecom(Disp_Off);
    #endif
    Cs1=0;Cs2=1;
    delay(10);
    Lcdwritecom(Col_Add+0);
    Lcdwritecom(Page_Add+0);
    //Enable=1;
    for(k=0;k<8;k++)                              //共8页
       {Lcdwritecom(Page_Add+k);
        for(j=0;j<64;j++)Lcdwritedata(0x00);      //每页64列
       }
    //Enable=0;
    delay(4);

    Cs1=1;Cs2=0;
    delay(10);
    Lcdwritecom(Col_Add+0);
    Lcdwritecom(Page_Add+0);
   // Enable=1;
    for(k=0;k<8;k++)                              //共8页
       {Lcdwritecom(Page_Add+k);
        for(j=0;j<64;j++)Lcdwritedata(0x00);      //每页64列
       }
   // Enable=0;
    delay(10);


    #if(Disp_Off_EN==1)
    Cs1=1;Cs2=0;Lcdwritecom(Disp_On);
    delay(10);
    Cs1=0;Cs2=1;Lcdwritecom(Disp_On);
    #endif
 }




//***********************************************************************************
//**********************以下实现菜单功能**********************************************
//***********************************************************************************


//----------------------用于描述和操作菜单的全局量---------------
#define  Select_MAX 3
unsigned char Menu_NO;//当前显示的菜单号
unsigned char Select_NO;//当前菜单选中的列
struct Menu_node  //菜单节点描述
{unsigned char last; //上一级菜单,0代表顶根目录
 unsigned char DISP[Select_MAX+1][8];//菜单显示的内容,4x8个字符
 unsigned char next[Select_MAX+1];//子菜单,当超过4个时建立假子菜单节点,0代表空
 unsigned char add_menu[2];//子菜单超过4个时
	};


//-------描述整个系统菜单结构的结构树------------------------

 struct Menu_node code Tree[2] ={

 	{0,//0号为顶级菜单 ,开机界面
 	 {{10,10,10,10,10,10,10,10},//第一排显示8个空格
 	 	{10,10,11,12,13,14,10,10},//第二排显示“学子科技”
 	 	{10,10,10,10,10,10,10,10},//第三排显示8个空格
 	 	{10,10,32,17,28,29,10,10}},//第四排显示“进入系统”
 		{0,0,0,1},//子菜单号,(3号选项对应子菜单为1号菜单
 		{0,0}//本菜单下无其它选项,无其他假子菜单节点
 		},

  {0,//上一级菜单,为0号菜单,
  	{ {1,10,24,25,26,27,10,10},
  		{2,10,24,25,36,37,10,10},
  		{3,10,34,35,26,27,10,10},
  	  {4,10,28,29,36,37,10,10}},
  		{0,0,0,0},
  	  {0,0}
  	}


                };





//***********************以下是实现菜单的一些功能函数********************

//---------------------------------------------------------------------
//刷新显示函数,执行该函数后显示Menu_NO指向的菜单
//---------------------------------------------------------------------
void Show_new(void)
{unsigned char i;
    #if(Disp_Off_EN==1)
     Cs1=1;Cs2=0;Lcdwritecom(Disp_Off);
     Cs1=0;Cs2=1;Lcdwritecom(Disp_Off);
    #endif
if(Select_NO!=0){for(i=0;i<8;i++)cha_disp(0,i*16,Tree[Menu_NO].DISP[0][i]);}//第一行
if(Select_NO!=1){for(i=0;i<8;i++)cha_disp(2,i*16,Tree[Menu_NO].DISP[1][i]);}//第二行
if(Select_NO!=2){for(i=0;i<8;i++)cha_disp(4,i*16,Tree[Menu_NO].DISP[2][i]);}//第三行
if(Select_NO!=3){for(i=0;i<8;i++)cha_disp(6,i*16,Tree[Menu_NO].DISP[3][i]);}//第四行
{for(i=0;i<8;i++)cpl_disp(Select_NO*2,i*16,Tree[Menu_NO].DISP[Select_NO][i]);}//反显选择项
    #if(Disp_Off_EN==1)
    Cs1=0;Cs2=1; Lcdwritecom(Disp_On);
    Cs1=1;Cs2=0; Lcdwritecom(Disp_On);
    #endif
}
//--------------------------------------------------------------------------------
//消息框,在画面显示(最多16字)短消息,
//输入:cha为要显示的内容数组的首地址,该数组存放要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//输入:n为要显示的字符个数
//输入:MOD为执行模式,0为延时后返回,1为一直等待按键按下后返回,2为在规定时间内等待按键按下
//返回:键值,无键按下情况下,返回255
//说明:退出后自动刷新显示,恢复界面
//---------------------------------------------------------------------------------
unsigned char Msgbox(unsigned char *cha,unsigned char n,unsigned char MOD)
{unsigned char i;
	Clr_Scr();
	if(n<9)
	 {for(i=0;i<n;i++)
	 	 {cha_disp(3,i*16+(8-n)*8,cha[i]);
	 	 	}
	 	}
	else
	 {if(n>16)n=16;//最大只能显示16个字符
	 	for(i=0;i<8;i++)
	 	 {cha_disp(1,i*16,cha[i]);
	 	 	}
	 	 for(i=8;i<n;i++)
	 	 {cha_disp(3,i*16+(16-n)*8,cha[i]);
	 	 	}
	 	}

	 i=255;
	if(MOD==0)   //消息框消息框显示的延时
	  {delay(10000);delay(10000);delay(10000);delay(10000);delay(10000);delay(10000);
	  }
	else if(MOD==1)
		 {delay(1000);do{i=key();delay(10);}while(i==255);//等待有按键按下
		 	}
	else if(MOD==2)
		 	{for(n=0;n<200;n++) //延时,如果有键按下,立刻返回
		 		{delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		 delay(50);i=key();if(i!=255)break;
		 		}
		 		}
	Show_new();
	return i;
}
//---------------------------------------------------------------------------------
//数据输入框,可在画面显示(最多16字)提示信息,
//输入:cha为要显示提示信息内容数组的首地址,该数组存放要显示的字符在字库点阵CHA_lib[][]中第一维的位置
//输入:n为要提示信息的字符个数
//输入:dat为初始数据,最大值为999999,
//返回:按确定键后返回设定的数据,最大值为999999;如果按下退出键,则返回输入的初始数据dat
//说明:退出后自动刷新显示,恢复界面
//
//---------------------------------------------------------------------------------

signed long Inputbox_dat(unsigned char *cha,unsigned char n,signed long dat)
{unsigned char i;
	Clr_Scr();
	 if(n<9)
	 {for(i=0;i<n;i++)
	 	 {cha_disp(3,i*16+(8-n)*8,cha[i]);
	 	 	}
	 	}
	else
	 {if(n>16)n=16;//最大只能显示16个字符
	 	for(i=0;i<8;i++)
	 	 {cha_disp(1,i*16,cha[i]);
	 	 	}
	 	 for(i=8;i<n;i++)
	 	 {cha_disp(3,i*16+(16-n)*8,cha[i]);
	 	 	}
	 	}
    {

	signed long temp=dat;//备份,如果按下退出键,返回该备份
	unsigned char dat_buf[6];//最大输入六位

⌨️ 快捷键说明

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