📄 ks0108.c
字号:
/**********************************************************************************************************************************************************
* 文 件 名: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 + -