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

📄 ks0108.c

📁 液晶0108控制器驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:

/**********************************************************************************************************************************************************
* 文 件 名:LCM12864Drive.C
* 功    能:LCM12864点阵图形液晶模块(KS0107/KS0108)驱动。使用GPIO模拟总线控制操作。
* 版    本:V2.0
* 作    者:
* 日    期:2007年7月6号 
**********************************************************************************************************************************************************/

//#include "includes.h"
#include "GUIConf.h"
#include "lcd_108.h"
#include "lcdconf.h"

#include <stddef.h>           /* needed for definition of NULL */
#include "LCD_Private.H"      /* private modul definitions & config */
#include "GUI_Private.H"
#include "GUIDebug.h"
#include "LCD_0.h"            /* Defines for first display */



#define LCD_PIXELINDEX u8
#define PIXELCOLOR     u8
/***********************************************************************************************************************************************************/
/* 定义显示缓冲区 */
/* 为了提高显示速度,不从LCM12864读回数据,而是在arm内部RAM开辟一缓冲区作为显示缓冲区。*/
/* 注意:由于LCM12864的显示单元是按垂直方向排列的,即1字节数据表示某一列的8个点,所以定义  */
/*       显示缓冲区时就使用了"列宽/8"作为第1维数组的大小。                                 */
/*=========================================================================================*/
u8 LCM12864_DisplayBuffer[8][128];
/*=========================================================================================*/



/******************************************************************************************************************
* 函数名称:LCM12864_WriteByteToBuffer()
* 功    能:向LCM12864指定点的对应显示缓冲区(在STR710内部RAM)写一字节数据。
* 入口参数:x 		x坐标值(0-127)
*           y       y坐标值(0-63)
*           data	所要写的数据
* 出口参数:无
/*******************************************************************************************************************/
void LCM12864_WriteByteToBuffer(u8 x, u8 y, u8 data) 
{
  x&=0x7f; y&=0x3f;	                             // 参数过滤		                     
  
  /* 更新显示缓冲区 */
  /*==========================================================================*/
  y = y>>3;                                      // 根据y坐标值算出指定页
  LCM12864_DisplayBuffer[y][x] = data;
  /*==========================================================================*/
}

/******************************************************************************************************************
* 函数名称:LCM12864_ReadByteFromBuffer()
* 功    能:从LCM12864指定点的对应显示缓冲区(在STR710内部RAM)读一字节数据。
* 入口参数:x 		x坐标值(0-127)
*           y       y坐标值(0-63)
* 出口参数:返回该点上的字节数据。
/*******************************************************************************************************************/
u8 LCM12864_ReadByteFromBuffer(u8 x, u8 y)
{ 
  x&=0x7f; y&=0x3f;	                             // 参数过滤
  
  /* 返回显示缓冲区指定点上的数据 */
  /*==========================================================================*/
  y = y>>3;                                      // 根据y坐标值算出指定页
  return (LCM12864_DisplayBuffer[y][x]);         // 返回显示缓冲区指定点上的数据
  /*==========================================================================*/
 }
/******************************************************************************************************************
* 函数名称:GUI_ClearScreen()
* 功    能:清屏。清除显示缓冲区。
* 入口参数:无
* 出口参数:无
/*******************************************************************************************************************/
void GUI_ClearScreen(void)
{
    u8 i,j;
    for(i=0;i<8;i++)
    for(j=0;j<128;j++)
    LCM12864_DisplayBuffer[i][j]=0xff;
	        // 显示缓冲区清0
}

/******************************************************************************************************************
* 函数名称:LCM12864_FillDataFromBuffer()
* 功    能:将显示缓冲区的数据写入STR710,即用显示缓冲区的数据对LCM12864进行全屏幕填充。
* 入口参数:无
* 出口参数:无
* 说    明:
/*******************************************************************************************************************/
void LCM12864_FillDataFromBuffer(void)
{ 
  u8  x,y;

  
 // LCD_X_Write00(0xc0);
 // LCD_X_Write10(0xc0);
  for(x=0; x<8; x++)
    { 
      for(y=0; y<64; y++)
        { 
          LCD_X_Write00(0xb8 | x);	 // 设置页地址,即X
          LCD_X_Write00(0x40 | y);	 // 设置列地址,即Y
          LCD_X_Write01(LCM12864_DisplayBuffer[x][y]);
	    }	
    }
  

  for(x=0; x<8; x++)
    { 
      for(y=0; y<64; y++)
        { 
          LCD_X_Write10(0xb8 | x);	 // 设置页地址,即X
          LCD_X_Write10(0x40 | y);	 // 设置列地址,即Y
          LCD_X_Write11(LCM12864_DisplayBuffer[x][y+64]);
	    }	
    }
 GUI_ClearScreen();
 
    
}


/******************************************************************************************************************
* 函数名称:LCM12864_InitPIN()
* 功    能:连接引脚初始化。
* 入口参数:无
* 出口参数:无
/*******************************************************************************************************************/
void LCM12864_InitPIN(void)
{
    GPIO_Config(GPIO1, 1<<4, GPIO_OUT_PP);
    GPIO_Config(GPIO1, 1<<3, GPIO_OUT_PP);
    GPIO_Config(GPIO1, 1<<2, GPIO_OUT_PP); 
    GPIO_Config(GPIO0, 1<<14, GPIO_OUT_PP);
    GPIO_Config(GPIO0, 1<<13, GPIO_OUT_PP);
    GPIO_Config(GPIO1, 1<<5, GPIO_OUT_PP);
    GPIO_Config(GPIO1, 1<<6, GPIO_OUT_PP);
  
    GPIO_Config(GPIO2, 0xff00, GPIO_OUT_PP);

}



/******************************************************************************************************************
* 函数名称:LCM12864_Init()
* 功    能:LCM12864初始化。
* 入口参数:无
* 出口参数:无
/*******************************************************************************************************************/
void LCM12864_Init(void)
{ 
  u16 i;
  
  LCM12864_InitPIN();                    // 与LCM12864的连接引脚初始化
  
  /* 复位LCM */
  /*===================================================================*/
  LCD_RST_0;				
  for(i=0; i<5000; i++);
  for(i=0; i<5000; i++);
  for(i=0; i<5000; i++);
  for(i=0; i<5000; i++);
  for(i=0; i<5000; i++);
  for(i=0; i<5000; i++);
  LCD_RST_1;   
  for(i=0; i<5000; i++); 
  /*===================================================================*/
  LCD_CS1_1;
  LCD_CS2_1;
  LCD_E_0;
  LCD_RW_1;
  LCD_K_0;
  
  LCD_X_Write00(0x3f);
  LCD_X_Write10(0x3f);
}





/******************************************************************************************************************
* 函数名称:GUI_Init()
* 功    能:初始化GUI。
* 入口参数:无
* 出口参数:无
/*******************************************************************************************************************/
void LCDInit(void)
{  
   LCM12864_Init();                              // LCM12864初始化
   GUI_ClearScreen();	                         // 清屏
   LCM12864_FillDataFromBuffer();                // 将显示缓冲区的内容刷新到LCM12864
}





















u8 const DEC_HEX_TAB[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; // 定义数据转换表
/******************************************************************************************************************
* 函数名称:GUI_Point()
* 功    能:在LCM12864指定位置对应的显示缓冲区画点。
* 入口参数:x        指定点所在列的位置
*           y        指定点所在行的位置
*           color    对于黑白色或蓝白色LCM12864,为0时灭,为1时显示
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。操作失败原因是指定地址超出有效范围。
/*******************************************************************************************************************/
u8  GUI_Point(u8 x, u8 y, u8 color)
{
  u8   bak;
   
  if(x>=128)  return(0); if(y>=64)   return(0);  // 参数判断,出错返回0
 
  /* 设置指定点为1或0 */
  /*===========================================================================================*/
  bak = LCM12864_ReadByteFromBuffer(x,y);        // 从显示缓冲区读取指定点的1字节数据
  if(0==color)                                   // 若让该点灭
   {  
     bak &= (~DEC_HEX_TAB[y&0x07]);              // 该点对应的位复位,而其他7位不变
   }
  else                                           // 若让该点亮             
   {  
     bak |= DEC_HEX_TAB[y&0x07];                 // 该点对应的位置位,而其他7位不变
   }
  
  LCM12864_WriteByteToBuffer(x, y, bak);         // 向LCM12864指定点对应的显示缓冲区写一字节数据
  /*===========================================================================================*/

  return(1);                                     // 操作成功返回1
}



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

  if(x>=128)  return(0); if(y>=64)   return(0);  // 参数判断,出错返回0
  
  /* 读取指定点的颜色值 */
  /*===========================================================================================*/
  bak = LCM12864_ReadByteFromBuffer(x,y);        // 读取指定点的1字节数据
  if( (bak & (DEC_HEX_TAB[y&0x07])) == 0 )       // 若指定点的颜色值为0
     *ret = 0x00;                                // 保存该颜色值
  else                                           // 若指定点的颜色值为1
     *ret = 0x01;                                // 保存该颜色值
  /*===========================================================================================*/  
  
  return(1);                                     // 操作成功返回1
}

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

  if(x0>x1) {bak = x1;x1 = x0; x0 = bak;}        // 对x0、x1大小进行排列,以便画图 

⌨️ 快捷键说明

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