📄 gui.c
字号:
* 出口参数:无
*******************************************************************************************************************/
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 + -