📄 nokia_5110.c
字号:
if (command == 0)
IO0CLR=LCD_DC;
else
IO0SET=LCD_DC;
for(i=0;i<8;i++)
{
if(dat&0x80)
IO0SET=SDIN;
else
IO0CLR=SDIN;
IO0CLR=SCLK;
dat = dat << 1;
IO0SET=SCLK;
}
IO1SET=LCD_CE;
}
/*以上是NOKIA的底层驱动*/
/*下面是GUI驱动部分*/
TCOLOR gui_disp_buf[GUI_LCM_YMAX/8][GUI_LCM_XMAX];
/***********************************************************************
* 名称:LCM_WriteByte()
* 功能:向指定点写数据(一字节)。
* 入口参数:x x坐标值(0-127)
* y y坐标值(0-63)
* wrdata 所要写的数据
* 说明:会重新设置CS1/CS2,及其内部指针
***********************************************************************/
void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
{
x = x&0x7f; // 参数过滤
y = y&0x3f;
y = y>>3;
LCD_set_XY(x,y);
gui_disp_buf[y][x] = wrdata;
LCD_write_byte(wrdata,1);
}
/***********************************************************************
* 名称:LCM_ReadByte()
* 功能:读取指定点上的数据。
* 入口参数:x x坐标值(0-127)
* y y坐标值(0-63)
* 出口参数:返回该点上的字节数据。
***********************************************************************/
uint8 LCM_ReadByte(uint8 x, uint8 y)
{
x = x&0x7f; // 参数过滤
y = y&0x3f;
y = y>>3;
return(gui_disp_buf[y][x]);
}
/***********************************************************************
* 名称:LCM_DispFill()
* 功能:向显示缓冲区填充数据
* 入口参数:filldata 要写入LCM的填充数据
* 注:此函数会设置显示起始行为0,且会自动选中CS1有效
***********************************************************************/
void LCM_DispFill(uint8 filldata)
{
uint8 x,y;
LCD_set_XY(0,0);
for(x=0; x<8; x++)
{
LCD_set_XY(x,0);
for(y=0; y<84; y++)
{
LCD_write_byte(filldata,1);
}
}
}
/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat 填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_FillSCR(TCOLOR dat)
{ uint32 i,j;
// 填充缓冲区
for(i=0; i<(GUI_LCM_YMAX/8); i++)
{ for(j=0; j<GUI_LCM_XMAX; j++)
{ gui_disp_buf[i][j] = dat;
}
}
// 填充LCM
LCM_DispFill(dat);
}
/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void GUI_Initialize(void)
{
LCD_init(); //初始化液晶
LCD_clear(); // 初始化缓冲区为0x00,并输出屏幕(清屏)
}
uint8 const DEC_HEX_TAB[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数:x 指定点所在列的位置
* y 指定点所在行的位置
* color 显示颜色(对于黑白色LCM,为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 = LCM_ReadByte(x,y);
if(0==color)
{ bak &= (~DEC_HEX_TAB[y&0x07]);
}
else
{ bak |= DEC_HEX_TAB[y&0x07];
}
// 刷新显示
LCM_WriteByte(x, y, bak);
return(1);
}
/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜色。
* 入口参数:x 指定点所在列的位置
* y 指定点所在行的位置
* ret 保存颜色值的指针
* 出口参数:返回0表示指定地址超出缓冲区范围
* 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
* RGB结构则R、G、B变量有效。
****************************************************************************/
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 = LCM_ReadByte(x,y);
if( (bak & (DEC_HEX_TAB[y&0x07])) == 0 ) *ret = 0x00;
else *ret = 0x01;
return(1);
}
/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数:x0 水平线起点所在列的位置
* y0 水平线起点所在行的位置
* x1 水平线终点所在列的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void GUI_HLine(uint8 x0, uint8 y0, uint8 x1, TCOLOR color)
{ uint8 bak;
if(x0>x1) // 对x0、x1大小进行排列,以便画图
{ bak = x1;
x1 = x0;
x0 = bak;
}
do
{ GUI_Point(x0, y0, color); // 逐点显示,描出垂直线
x0++;
}while(x1>=x0);
}
/***********************************************************************
* 名称:GUI_RLine()
* 功能:画竖直线。根据硬件特点,实现加速。
* 入口参数:x0 垂直线起点所在列的位置
* y0 垂直线起点所在行的位置
* y1 垂直线终点所在行的位置
* color 显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数: 无
* 说明:操作失败原因是指定地址超出缓冲区范围。
***********************************************************************/
void GUI_RLine(uint8 x0, uint8 y0, uint8 y1, TCOLOR color)
{ uint8 bak;
uint8 wr_dat;
if(y0>y1) // 对y0、y1大小进行排列,以便画图
{ bak = y1;
y1 = y0;
y0 = bak;
}
do
{ // 先读取当前点的字节数据
bak = LCM_ReadByte(x0,y0);
// 进行'与'/'或'操作后,将正确的数据写回LCM
// 若y0和y1不是同一字节,则y0--当前字节结束,即(y0+8)&0x38,全写1,或者0。
// 若y0和y1是同一字节,则y0--y1,要全写1,或者0。
// 方法:dat=0xff,然后按y0清零dat低位,按y1清零高位。
if((y0>>3) != (y1>>3)) // 竖直线是否跨越两个字节(或以上)
{ wr_dat = 0xFF << (y0&0x07);// 清0低位
if(color)
{ wr_dat = bak | wr_dat; // 若color不为0,则显示
}
else
{ wr_dat = ~wr_dat; // 若color为0,则清除显示
wr_dat = bak & wr_dat;
}
LCM_WriteByte(x0,y0, wr_dat);
y0 = (y0+8)&0x38;
}
else
{ wr_dat = 0xFF << (y0&0x07);
wr_dat = wr_dat & ( 0xFF >> (7-(y1&0x07)) );
if(color)
{ wr_dat = bak | wr_dat; // 若color不为0,则显示
}
else
{ wr_dat = ~wr_dat; // 若color为0,则清除显示
wr_dat = bak & wr_dat;
}
LCM_WriteByte(x0,y0, wr_dat);
return;
} // end of if((y0>>3) != (y1>>3))... else...
}while(y1>=y0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -