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

📄 gui.c

📁 工厂环境污染控制数据采集器
💻 C
📖 第 1 页 / 共 5 页
字号:
* 出口参数:无
*******************************************************************************************************************/
void OutData(uint8 dat)
{
	unsigned char i;
	unsigned char var1;
	
	var1=dat;
	
  /*if((dat & 0x01)==1)   H_LCM12864_D0(); else L_LCM12864_D0();
  if((dat & 0x02)==2)   H_LCM12864_D1(); else L_LCM12864_D1();
  if((dat & 0x04)==4)   H_LCM12864_D2(); else L_LCM12864_D2();
  if((dat & 0x08)==8)   H_LCM12864_D3(); else L_LCM12864_D3();
  if((dat & 0x10)==16)  H_LCM12864_D4(); else L_LCM12864_D4();
  if((dat & 0x20)==32)  H_LCM12864_D5(); else L_LCM12864_D5();
  if((dat & 0x40)==64)  H_LCM12864_D6(); else L_LCM12864_D6();
  if((dat & 0x80)==128) H_LCM12864_D7(); else L_LCM12864_D7();
  */
  
  /////////FOR HC595 OUTPUT
  L_HC595_STCP();
  for(i=0;i<8;i++)
  {
  	if((dat&0x80)==0)
  	{
  		L_HC595_DS();
  	}
  	else
  	{
  		H_HC595_DS();
  	}
  	H_HC595_SHCP();
  	dat<<=1;
  	L_HC595_SHCP();
  }
  H_HC595_STCP();
  //delay(1);
  L_HC595_DS();
  L_HC595_STCP();
  
}

/******************************************************************************************************************
* 函数名称:LCM12864_WriteCMD()
* 功    能:向LCM12864写命令。
* 入口参数:command    要写入LCM12864的命令字
* 出口参数:无
*******************************************************************************************************************/
void LCM12864_WriteCMD(uint8 command) 
{

  L_LCM12864_E();                                // 将E置低
  L_LCM12864_RS();                               // RS=0,表示发送命令
  OutData(command);
  LCM12864_Delay();
  H_LCM12864_E();
  LCM12864_Delay();
  L_LCM12864_E();
  LCM12864_Delay();
   
}

/******************************************************************************************************************
* 函数名称:LCM12864_WritEDAta()
* 功    能:向LCM12864写数据。
* 入口参数:data   要写入LCM12864的数据
* 出口参数:无
*******************************************************************************************************************/
void LCM12864_WritEDAta(uint8 data) 
{ 
	
  L_LCM12864_E();                                // 将E置低
  H_LCM12864_RS();                               // RS=1,表示发送数据
  OutData(data);
  LCM12864_Delay();
  H_LCM12864_E();
  LCM12864_Delay();
  L_LCM12864_E();
  LCM12864_Delay();

}

/******************************************************************************************************************
* 函数名称:LCM12864_WriteByte()
* 功    能:向LCM12864指定点写一字节数据。
* 入口参数:x   x坐标值(0-127)
*           y       y坐标值(0-63)
*           data 所要写的数据
* 出口参数:无
*******************************************************************************************************************/
void LCM12864_WriteByte(uint8 x, uint8 y, uint8 data) 
{ 
  /* 参数过滤 */
  x = x&0xff;       //7f                  
  y = y&0x3f;

  H_LCM12864_CSA(); 
  H_LCM12864_CSB();  
  H_LCM12864_CSC();          // 不选中左半屏及右半屏     
  
  y = y>>3;                                      // 更新显示缓冲区
  gui_disp_buf[y][x] = data;
   
  /* 更新LCD12864显示 */
  if(x<64)                                // 判断选择左、右半屏
   { 
     L_LCM12864_CSA();                           // CSA置高,控制前64个点
   }
  else if(x<128)
   { 
     L_LCM12864_CSB();                           // CSB置高,控制中64个点
     x = x-64;
   }
  else
   { 
     L_LCM12864_CSC();                           // CSC置高,控制后64个点
     x = x-128;
   }
      
  LCM12864_WriteCMD(LCM12864_ADDRSTRY+x);        // 设置当前列地址,即x坐标
  LCM12864_WriteCMD(LCM12864_ADDRSTRX+y);        // 设置当前页地址,即y坐标
  LCM12864_WritEDAta(data);                      // 向LCM12864写数据
}

/******************************************************************************************************************
* 函数名称:LCM12864_ReadByte()
* 功    能:从显示缓冲区读取指定点上的数据。
* 入口参数:x   x坐标值(0-127)
*           y       y坐标值(0-63)
* 出口参数:返回该点上的字节数据。
*******************************************************************************************************************/
uint8  LCM12864_ReadByte(uint8 x, uint8 y)
{ 
  /* 参数过滤 */
  x = x&0xff;     //7f                    
  y = y&0x3f;

  y = y>>3;
  return (gui_disp_buf[y][x]);                   // 返回显示缓冲区指定点上的数据
}

/******************************************************************************************************************
* 函数名称:LCM12864_DispFill()
* 功    能:向LCM12864填充数据。
* 入口参数:filldata   要写入LCM12864的填充数据
* 出口参数:无
* 说    明:此函数会设置显示起始行为0,且会自动选中CSA有效。
*******************************************************************************************************************/
void LCM12864_DispFill(uint8 filldata)
{ 
  uint8  x,y;

  L_LCM12864_CSA();  L_LCM12864_CSB();  L_LCM12864_CSC();     // 选中左半屏及右半屏 
 
 
  LCM12864_WriteCMD(LCM12864_STARTROW);          // 设置显示起始行为0

  for(x=0; x<8; x++)
    { 
      LCM12864_WriteCMD(LCM12864_ADDRSTRX+x);  // 设置页地址,即X
      LCM12864_WriteCMD(LCM12864_ADDRSTRY);      // 设置列地址,即Y
      for(y=0; y<64; y++)
        { 
          LCM12864_WritEDAta(filldata);
     } 
    }


  L_LCM12864_CSA();
  H_LCM12864_CSB();
  H_LCM12864_CSC();

}

/******************************************************************************************************************
* 函数名称:LCM12864_DispIni()
* 功    能:LCM12864显示初始化。
* 入口参数:无
* 出口参数:无
*******************************************************************************************************************/
void LCM12864_DispIni(void)
{ 
  uint32 i;
  
  /* 选择LPC213X/214X的相关引脚为GPIO用来模拟总线驱动LCM12864 */
 // PINSEL0&=~((uint32)0x03<<22);                  // P0.11选择为GPIO
 // PINSEL1&=~((uint32)0x3fc<<2);                  // P0.17~P0.20选择为GPIO
 // PINSEL2&=~((uint32)0x01<<3);                   // P1.16~P1.25选择为GPIO
  
  /* 设置用来模拟总线用的GPIO方向为输出 */
  IODIR0|=((uint32)0x01<<LCM12864_RS) | ((uint32)0x01<<LCM12864_CSA) | ((uint32)0x01<<LCM12864_CSB)  |
          ((uint32)0x01<<LCM12864_RST)  | ((uint32)0x01<<LCM12864_BLK);
          
  IODIR1|=((uint32)0x01<<LCM12864_RW) | ((uint32)0x01<<HC595_DS) | 
          ((uint32)0x01<<HC595_STCP) | ((uint32)0x01<<HC595_SHCP);
  

  //FIO2DIR|=((uint32)0x01<<LCM12864_D0)  | ((uint32)0x01<<LCM12864_D1)  | ((uint32)0x01<<LCM12864_D2) |
  //        ((uint32)0x01<<LCM12864_D3)  | ((uint32)0x01<<LCM12864_D4)  | ((uint32)0x01<<LCM12864_D5)  |
  //        ((uint32)0x01<<LCM12864_D6)  | ((uint32)0x01<<LCM12864_D7)  | ((uint32)0x01<<LCM12864_E);
  
  FIO2DIR|=((uint32)0x01<<LCM12864_E);  
    

  H_LCM12864_BLK();                              // 打开背光
  L_LCM12864_RW();                               // 只写数据到总线

  /* 复位LCM */
  L_LCM12864_RST();    
  for(i=0; i<5000; i++);
  H_LCM12864_RST();   
  for(i=0; i<5000; i++); 
  ////////
  L_LCM12864_CSA(); L_LCM12864_CSB();  L_LCM12864_CSC();  // 选中左半屏及右半屏 
    

  LCM12864_WriteCMD(LCM12864_DISPON);          // 打开显示 
  LCM12864_WriteCMD(LCM12864_STARTROW);          // 设置显示起始行为0
        
  LCM12864_WriteCMD(LCM12864_ADDRSTRX);          // 设置页地址,即X 
  LCM12864_WriteCMD(LCM12864_ADDRSTRY);          // 设置列地址,即Y    
  
}

/******************************************************************************************************************
* 函数名称:GUI_FillSCR()
* 功    能:全屏填充。填充显示缓冲区及LCM12864。
* 入口参数:data      填充的数据
* 出口参数:无
*******************************************************************************************************************/
void  GUI_FillSCR(TCOLOR data)
{
  uint8 i,j;
   
  // 填充显示缓冲区 
  for(i=0; i<(GUI_LCM_YMAX/8); i++)
    {  
      for(j=0; j<GUI_LCM_XMAX; j++)
        {  
          gui_disp_buf[i][j] = data;
        }
    }
   
  LCM12864_DispFill(data);                       // 填充LCM12864
}

/******************************************************************************************************************
* 函数名称:GUI_Initialize()
* 功    能:初始化GUI,包括初始化显示缓冲区及LCM12864并清屏。
* 入口参数:无
* 出口参数:无
*******************************************************************************************************************/
void  GUI_Initialize(void)
{  
   LCM12864_DispIni();                       // 初始化LCM12864模块工作模式,纯图形模式
   GUI_FillSCR(0x00);                          // 初始化缓冲区为0x00,并输出屏幕(清屏)
}

uint8 const DEC_HEX_TAB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/******************************************************************************************************************
* 函数名称:GUI_Point()
* 功    能:在指定位置上画点。
* 入口参数:x        指定点所在列的位置
*           y        指定点所在行的位置
*           color    对于黑白色或蓝白色LCM12864,为0时灭,为1时显示
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。
*******************************************************************************************************************/
uint8  GUI_Point(uint8 x, uint8 y, TCOLOR color)
{
  uint8   bak;
   
  /* 参数过滤 */
  if(x>=GUI_LCM_XMAX)  return(0);
  if(y>=GUI_LCM_YMAX)  return(0);
  
  /* 设置相应的点为1或0 */
  bak = LCM12864_ReadByte(x,y);
  if(0==color)
   {  
     bak &= (~DEC_HEX_TAB[y&0x07]);
   }
  else
   {  
     bak |= DEC_HEX_TAB[y&0x07];
   }
  
  LCM12864_WriteByte(x, y, bak);                 // 刷新显示
  return(1);
}

/******************************************************************************************************************
* 函数名称:GUI_ReadPoint()
* 功    能:读取指定点的颜色。
* 入口参数:x        指定点所在列的位置
*           y        指定点所在行的位置
*           ret      保存颜色值的指针
* 出口参数:返回0表示指定地址超出缓冲区范围。
* 说    明:对于单色,设置ret的d0位为1或0
*******************************************************************************************************************/
uint8  GUI_ReadPoint(uint8 x, uint8 y, TCOLOR *ret)
{
  uint8  bak;

  /* 参数过滤 */
  if(x>=GUI_LCM_XMAX) return(0);
  if(y>=GUI_LCM_YMAX) return(0);
  
  bak = LCM12864_ReadByte(x,y);
  if( (bak & (DEC_HEX_TAB[y&0x07])) == 0 )
     *ret = 0x00;
  else  
     *ret = 0x01;
   
  return(1);
}

/******************************************************************************************************************
* 函数名称:GUI_HLine()
* 功    能:画水平线。
* 入口参数:x0  水平线起点所在列的位置
*           y0  水平线起点所在行的位置
*           x1      水平线终点所在列的位置
*           color 显示颜色(对于黑白色或蓝白色LCM12864,为0时灭,为1时显示LCM12864,为0时灭,为1时显示)
* 出口参数:无
*******************************************************************************************************************/
void  GUI_HLine(uint8 x0, uint8 y0, uint8 x1, TCOLOR color) 
{
  uint8  bak;

  /* 对x0、x1大小进行排列,以便画图 */
  if(x0>x1)         
    {  
      bak = x1;
      x1 = x0;
      x0 = bak;
    }
   
   do
    {  
      GUI_Point(x0, y0, color);               // 逐点显示,描出垂直线
      x0++;
    }while(x1>=x0);
}

/******************************************************************************************************************
* 函数名称:GUI_RLine()
* 功    能:画竖直线。根据硬件特点,实现加速。
* 入口参数:x0  垂直线起点所在列的位置
*           y0  垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color 显示颜色(对于黑白色或蓝白色LCM12864,为0时灭,为1时显示LCM12864,为0时灭,为1时显示)
* 出口参数:无
***********************************************************

⌨️ 快捷键说明

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