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

📄 ms12864iyejingqudong.txt

📁 详细的MS12864I驱动C程序
💻 TXT
字号:
   #define      Commandin_left        XBYTE[0xc400]              //显示屏命令定义
   #define      Datein_left           XBYTE[0xc500]
   #define      Stateout_left         XBYTE[0xc600]
   #define      Dateout_left          XBYTE[0xc700]
   #define      Commandin_right       XBYTE[0xc800]
   #define      Datein_right          XBYTE[0xc900]
   #define      Stateout_right        XBYTE[0xca00]
   #define      Dateout_right         XBYTE[0xcb00]
 sbit  P14=P1^4;                                            //29c020控制引脚
  /*------------------------------------------------------------------------------------
   *
   *                      MS12864I显示模块:实现数据命令的读写              
   *
   *                           进而实现液晶屏的显示
   *
   *-----------------------------------------------------------------------------------*/
    uchar  decbusy_left()                                //左半屏判断忙函数,若忙返回0
    {
       uchar  i;
       uchar  date;
       
       P14=1;
	   for(i=40;i>0;i--)
	   {
           date=Stateout_left;
	       if((date&0x80)==0x00)
		    break;
	   }
      // P14=0;	 
	   return(i);
    }   
    uchar  decbusy_right(void)                              //右半屏判断忙函数,若忙返回0;
	{
	   uchar  i;
	   uchar  date;
       
       P14=1;
	   for(i=10;i>0;i--)
	   {
	      date=Stateout_right;
	      if((date&0x80)==0x00)
		    break;
	   }
      // P14=0;      
	   return(i);
	}
	void  writecom_left(uchar command)                    //左半屏写命令函数
	{
       P14=1;
       while(!decbusy_left());	   
	   Commandin_left=command;   
	    
       P14=0;
	}
	void  writedate_left(uchar date)                      //左半屏写数据函数
	{
       P14=1;
	   while(!decbusy_left());	   
       Datein_left=date;
	   	    
       P14=0;
	}
	uchar  readdate_left()                               //左半屏读数据函数
	{
	   uchar  outdate;   
       
	   P14=1;
	   while(!decbusy_left());
       outdate=Dateout_left;
       	    
	   P14=0;
	   return(outdate);
	}
    
	void  writecom_right(uchar command)                    //右半屏写命令函数
	{
	   P14=1;
	   while(!decbusy_right());	   
	   Commandin_right=command;
	   
	   P14=0;
	}

	void  writedate_right(uchar date)                      //右半屏写数据函数
	{
	   P14=1;
	  while(!decbusy_right());	  
	   Datein_right=date;
	   
	   P14=0;
	}

    void  comddateWR_left(uchar page,uchar column,uchar date)        //左半屏写两个命令一个数据
	{
	   writecom_left(page);
	   writecom_left(column);
	   writedate_left(date); 	   
	}
    void  comddateWR_right(uchar page,uchar column,uchar date)        //右半屏写两个命令一个数据
    {
	   writecom_right(page);
	   writecom_right(column);
	   writedate_right(date);       
    }
    //LCM初始化
    void  Initscreen(void)
    {
       writecom_right(0xc0);                               // 设置显示起始行为第一行
	   writecom_right(0x3f);                               // 开显示设置
	   writecom_left(0xc0);
	   writecom_left(0x3f);
	}
	//页地址确定函数
	void  setpage(uchar L_or_R,uchar page)
	{
	   page=page&0x07;
	   page=page|(0xb8);
       
	   if(L_or_R>0)
	     writecom_right(page);                          //设置右半屏
	   else
	     writecom_left(page);                           //设置左半屏
	}
	//列地址设置函数
	void  setcolumn(uchar L_or_R,uchar column)
	{
	   column=column&0x3f;
	   column=column|(0x40);

	   if(L_or_R>0)
	     writecom_right(column);                          //设置右半屏
	   else
	     writecom_left(column);                           //设置左半屏
	}
    //清屏程序
    void  screencls(void)
	{
	   uchar  i;	   
	   uchar  t;
	   uchar  j;      
	   uchar  L_or_R=0;
       
	   P14=1;
	   for(j=0;j<2;j++)
	   {  	      
	      for(t=0;t<8;t++)
	      {	                
             setpage(L_or_R,t); 
             for(i=0;i<64;i++)
             {  
		        setcolumn(L_or_R,i);
                if(L_or_R)
				  writedate_right(0x00);                           //清右半屏
				writedate_left(0x00);                              //清左半屏 			                                                                
             }
         }
		 L_or_R=1;
	   }
	   P14=0;
   }
    //左右半屏判断
    uchar  decleft_right(uchar  column)
    {
	   uchar  i;
	   
	   if(column<64)
	     i=0;                                               //在左半屏
	   else 
	     i=1;                                               //在右半屏
	   return(i);
	}

    //汉字写入程序(16*16)
    void  HZshow(uchar *T,uchar L_or_R,uchar page,uchar column,uchar n)
	{
	   uchar  i;
	   uchar  t;
	   uchar  m;
       uchar  line;
	   uchar  col;
       
	   for(t=0;t<n;t++)
	   { 
         line=page;
	     for(m=0;m<2;m++)
		 {
		    col=column;
			setpage(L_or_R,line);
            for(i=0;i<16;i++)
            {		      
		      if(L_or_R>0)
			  {			     
                 setcolumn(L_or_R,col);
				 writedate_right(*T);
				 T++;
                 col++;
			  }
			  else
			  {
			     setcolumn(L_or_R,col);
				 writedate_left(*T);
				 T++;
				 col++;
 			  }
		    }
		    line++;
         }
		 column=column+16;	
	  }
   }  
    //字母写入程序
	void  Othershow(uchar *T,uchar L_or_R,uchar page,uchar column,uchar n)
    {
	   uchar  i;
	   uchar  t;
	   uchar  m;
       uchar  line;
	   uchar  col;
       
	   for(t=0;t<n;t++)
	   { 
         line=page;
	     for(m=0;m<2;m++)
		 {
		    col=column;
			setpage(L_or_R,line);
            for(i=0;i<8;i++)
            {		      
		      if(L_or_R>0)
			  {			     
                 setcolumn(L_or_R,col);
				 writedate_right(*T);
				 T++;
                 col++;
			  }
			  else
			  {
			     setcolumn(L_or_R,col);
				 writedate_left(*T);
				 T++;
				 col++;
 			  }
		    }
		    line++;
         }
		 column=column+8;	
	  }
	 }
 void main(void)
{
   Initscreen();              //初始化
   screencls();
   Othershow(tab1,0,1,1,1);  //tab1为汉字库首地址
   HZshow(tab2,1,1,1,1);     //tab2为数字或者字符库地址
}

⌨️ 快捷键说明

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