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

📄 display.c

📁 基于MST-G240128点阵液晶的 状态机机制 人机界面四级滚屏菜单 源代码 ,带时间片机制模拟操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
     return 0;
   }
}

/***********************************************************************
* 名称:LCD_TestStaBit03()
* 功能:数据自动写状态是否允许。
* 入口参数:无
* 出口参数:返回0表示禁止,否则表示允许
***********************************************************************/
bit LCD_TestStaBit03(void)
{  
   uint8 i;

   for(i=100; i>0; i--)
   {  
      if( (LCD_ReadState() & 0x08) == 0x08 ) 
	    break;
   } 
   if(i>0)
     return 1;
   else
//     return 0;
   {
	 LED_OnOff(ErrLED,1);  // Error   Indicating LED On.   
	 DmS(200);
     LED_OnOff(ErrLED,0);  // Error   Indicating LED Off.  
	 D1S(1);
     return 0;
   }
}

/***********************************************************************
* 名称:LCD_WriteTCommand1()
* 功能:写无参数命令子程序。会先判断LCM状态字。
* 入口参数:ucCMD  (要写入LCM的命令字)
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
bit LCD_WriteTCommand1(uint8 ucCMD)
{  
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteCommand(ucCMD);		// 发送命令字
   return 1;
}

/***********************************************************************
* 名称:LCD_WriteTCommand2()
* 功能:写单参数命令子程序。会先判断LCM状态字。
* 入口参数:ucCMD  (要写入LCM的命令字)
*           ucDATA1 (参数1)
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送参数据数据,再发送命令字
***********************************************************************/
bit LCD_WriteTCommand2(uint8 ucCMD, uint8 ucDATA1)
{  
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteData(ucDATA1);			// 发送数据1
   
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteCommand(ucCMD);		    // 发送命令字
   
   return 1;
}

/***********************************************************************
* 名称:LCD_WriteTCommand3()
* 功能:写双参数命令子程序。会先判断LCM状态字。
* 入口参数:ucCMD   (要写入LCM的命令字)
*           ucDATA1	(参数1)
*           ucDATA2	(参数2)
* 出口参数:操作出错返回0,否则返回1
* 说明:先发送两字节参数据数据,再发送命令字
***********************************************************************/
bit LCD_WriteTCommand3(uint8 ucCMD, uint8 ucDATA1, uint8 ucDATA2)
{  
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteData(ucDATA1);		    // 发送数据1
   
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteData(ucDATA2);		    // 发送数据2
   
   if( LCD_TestStaBit01()==0 ) 
     return 0;
   LCD_WriteCommand(ucCMD);	    	// 发送命令字
     
   return 1;
}

/***********************************************************************
* 名称:LCD_WriteTData1()
* 功能:写1字节数据子程序。先判断状态字。
* 入口参数:ucDATA  	   要写入LCM的数据
* 出口参数:操作出错返回0,否则返回1
***********************************************************************/
bit LCD_WriteTData1(uint8 ucDATA)
{  
   if( LCD_TestStaBit03()==0 ) 
     return 0;
   LCD_WriteData(ucDATA);			// 发送命令字
   
   return 1;
}

/***********************************************************************
* 名称:LCD_Initialize()
* 功能:LCM初始化,将LCM初始化为纯图形模式,显示起始地址为0x0000,。
* 入口参数:无
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void  LCD_Initialize(void)
{  
   LCD_Reset();
   LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00);	 // 设置文本方式RAM起始地址
   LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00);	 // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00);	 // 设置图形方式RAM起始地址
   LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00);	 // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240
   LCD_WriteTCommand1(LCD_MOD_OR);				 // 设置显示方式为"或"
   LCD_WriteTCommand1(LCD_DIS_SW|0x08);			 // 设置纯图形显示模式
}

/***********************************************************************
* 名称:LCD_FillAll()
* 功能:LCD填充。以图形方式进行填充,起始地址为0x0000。
* 入口参数:ucDATA		要填充的数据
* 出口参数:无
***********************************************************************/
void LCD_FillAll(uint8 ucDATA)
{  
   uint16 i;
   LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);	 // 置地址指针
   LCD_WriteTCommand1(LCD_AUT_WR);				 // 自动写
   for(i=0;i<128*30;i++)
   {  
      LCD_WriteTData1(ucDATA);					 // 写数据
   }
   LCD_WriteTCommand1(LCD_AUT_OVR);				 // 自动写结束
   LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);	 // 重置地址指针
}

/****************************************************************************
* 名称:LCD_UpdatePoint()
* 功能:在指定位置上画点,刷新某一点。
* 入口参数:x 指定点所在列的位置
*           y 指定点所在行的位置
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void LCD_UpdatePoint(uint16 x,uint16 y)
{  
   uint16  addr;    
   addr = y*(GUI_LCM_XMAX>>3) + (x>>3);                    /* 找出目标地址 */
   LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8);	   /* 置地址指针   */   
   LCD_WriteTCommand2(LCD_INC_WR, GUI_disp_buff[y][x>>3]); /* 输出数据     */
}

/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:ucDATA  填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void GUI_FillSCR(uint8 ucDATA)
{  
   uint8 i, j;

   for(i=0; i<GUI_LCM_YMAX; i++)		// 历遍所有行
   {  
      for(j=0; j<GUI_LCM_XMAX/8; j++)	// 历遍所有行
      {  
	     GUI_disp_buff[i][j] = ucDATA;	// 填充数据
	  }
   }     
   LCD_FillAll(ucDATA);                 /* 填充LCM */
}

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数:x	  指定点所在列的位置
*           y	  指定点所在行的位置
*           color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*          效范围)
****************************************************************************/
bit GUI_Point(uint16 x, uint16 y, uint8 color)
{   
   /* 参数过滤,超出显示区域不显示 */
   if(x>=GUI_LCM_XMAX)   
     return 0;
   if(y>=GUI_LCM_YMAX)   
     return 0;
   
   /* 设置缓冲区相应的点 */
   if( (color&0x01) != 0 ) 
     GUI_disp_buff[y][x>>3] |= DCB_HEX_TAB[x&0x07];
   else  
     GUI_disp_buff[y][x>>3] &= (~DCB_HEX_TAB[x&0x07]);

   /* 刷新显示 */
   LCD_UpdatePoint(x,y);
   return 1;
}

/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数:x0	  水平线起点所在列的位置
*           y0	  水平线起点所在行的位置
*           x1    水平线终点所在列的位置
*           color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(uint16 x0, uint16 y0, uint16 x1, uint8 color) 
{  
   uint16  bak;

   if(x0>x1) 						// 对x0、x1大小进行排列,以便画图
   {  
      bak = x1;
      x1 = x0;
      x0 = bak;
   }
   if(x0==x1)
   {  
      GUI_Point(x0,y0,color);
      return;
   }
   
   do
   {  /* 设置相应的点为1 */
      if(0!=color) 
	    GUI_disp_buff[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
      else  
	    GUI_disp_buff[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);
      /* 刷新显示(一次刷新一字节) */
      if( (x0&0x07)==0x07 ) 
	    LCD_UpdatePoint(x0, y0);

      x0++;
   } while(x1>x0);
   
   /* 对最后一点显示操作 */
   if(0!=color) 
     GUI_disp_buff[y0][x0>>3] |= DCB_HEX_TAB[x0&0x07];
   else  
     GUI_disp_buff[y0][x0>>3] &= (~DCB_HEX_TAB[x0&0x07]);

   LCD_UpdatePoint(x0, y0);
}


/****************************************************************************
* 名称:LCD_SelfTest()
* 功能:RT240128A显示测试
* 入口参数:无          
* 出口参数:无
* 说明:
****************************************************************************/
void LCD_SelfTest(void)
{  
   uint8  x, y;
   uint8  i, j;
   uint8  color;

   LCD_Initialize();		// 初始化LCM模块工作模式,纯图形模式  
   GUI_FillSCR(0x00);		// 初始化缓冲区为0x00,并输出屏幕(清屏)

   x=0; 
   y=0;
   color = 1;
   
   // 在液晶屏上显示均匀的黑白方格  
   for(j=0; j<7; j++)
   {  
      for(i=0; i<20; i++)                 // 显示20行x_x_,从上至下,即形成黑白块
	  {  
	     for(x=0; x<240; x = x + 24)      // 显示一行 x_x_ (x表示画线,_表示空白)
         {  
		    GUI_HLine(x,y,x+23,color);
            if(0==color) 
			  color = 1;
            else 
			  color = 0;
         }
         y++;		                  	  // 指向下一行
      }              
      if(0==color) 
	    color = 1;                        // 下一个20行x_x_要切换起始色
      else 
	    color = 0;     
   }  
}










⌨️ 快捷键说明

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