📄 s60753.c
字号:
/* 1层原关闭,则打开0层时两层均打开,并刷新显示 */
currentLayerState = 0x11;
s60753_setLayerCompMtd(compMode);
return;
}
}else{/* 关闭 */
s60753_setCurrentLayer(0);
if((currentLayerState & 0x10) == 0){
/* 原来状态是关闭则直接返回 */
return;
}else{
currentLayerState = 0x01;/* 不允许两层同时关闭 */
s60753_displayLayer(0);
return;
}
}
}
}
}
/******************************************************************************
*
* s60753_drawBmp - 在指定的坐标位置绘制位图数据
*
* INPUTS:
* int layer: 图层号
* int xstart: 起点的横坐标 pixels
* int ystart: 起点的纵坐标 pixels
* int width: 位图的宽度
* int height: 位图的高度
* uchar* pbmp: 位图数据头指针
*
* RETURNS:
* 0:成功 -1:输入的位图数据为空 -2:位图范围超出屏幕范围
*
******************************************************************************/
extern int s60753_drawBmp(int layer, int xstart,int ystart,int width,int height,uchar* pbmp )
{
uchar i,j,k;
unsigned int bmpPointer=0;
/* 判断绘图条件是否合法 */
if((xstart >= 160)||(xstart < 0)||(ystart >= 160)||(ystart < 0))
return ERROR;
if((xstart + width > SCREEN_HIGHT) || (ystart + height > SCREEN_HIGHT))
return ERROR;
s60753_setCurrentLayer(layer);
/* 显示图层 */
if((layer < 0)||(layer > 1))
return ERROR;
for(i = 0; i < height; i++){
for(j = 0; j < width / 8; j++){
for(k = 0; k < 8; k++){
if(BITS(pbmp[bmpPointer], 7 - k))
currentLayer[(ystart + i) * 162 + xstart + 2 + (j * 8) + ( k & 0x07)] = 0xFF;
else
currentLayer[(ystart + i) * 162 + xstart + 2 + (j * 8) + ( k & 0x07)] = 0x00;
}
bmpPointer ++;
}
/* 以上为整8个像素字节 */
/* 以下为不足8个像素的剩余位 */
if(width & 7){
for(k = 0; k < (width & 7); k++){
if(BITS(pbmp[bmpPointer], 7 - k))
currentLayer[(ystart + i) * 162 + xstart + 2 + (j * 8) + ( k & 0x07)] = 0xFF;
else
currentLayer[(ystart + i) * 162 + xstart + 2 + (j * 8) + ( k & 0x07)] = 0x00;
}
bmpPointer ++;
}
}
return s60753_refreshArea(xstart, ystart, width, height);
}
#if 0
/******************************************************************************
*
* s60753_drawGrayBmp - 在指定的坐标位置绘制位图数据(灰度)
*
* INPUTS:
* int layer: 图层号
* int xstart: 起点的横坐标 pixels
* int ystart: 起点的纵坐标 pixels
* int width: 位图的宽度
* int height: 位图的高度
* uchar* pbmp: 位图数据头指针
*
* RETURNS:
* 0:成功 -1:输入的位图数据为空 -2:位图范围超出屏幕范围
*
******************************************************************************/
extern int s60753_drawGrayBmp(int layer, int xstart,int ystart,int width,int height,uchar* pbmp )
{
uchar i,j;
unsigned int bmpPointer=0;
/* 判断绘图条件是否合法 */
if((xstart >= 160)||(xstart < 0)||(ystart >= 160)||(ystart < 0))
return ERROR;
if((xstart + width > SCREEN_HIGHT) || (ystart + height > SCREEN_HIGHT))
return ERROR;
s60753_setCurrentLayer(layer);
/* 设定显示图层 */
if(layer == 0){
currentLayerState |= 0x01;
}else if(layer == 1){
currentLayerState |= 0x10;
}else
return ERROR;
for(i = 0; i < height; i++)
for(j = 0; j < width; j++){
currentLayer[(ystart + i) * 162 + xstart + 2 + j] = pbmp[bmpPointer++];
}
s60753_refreshArea(xstart, ystart, width, height);
}
#endif
/******************************************************************************
*
* s60753_readBlock - 读取指定的坐标位置位图数据
*
* INPUTS:
* int layer: 图层号
* int xstart: 起点的横坐标 pixels
* int ystart: 起点的纵坐标 pixels
* int width: 位图的宽度
* int height: 位图的高度
* uchar* pblock: 数据头指针
*
* RETURNS:
* 0:成功 -1:输入的位图数据为空 -2:位图范围超出屏幕范围
*
******************************************************************************/
extern int s60753_readBlock(int layer, int xstart,int ystart,int width,int height,uchar * pblock)
{
uchar i,j,y;
uchar w, left, bittemp;
unsigned int blockPointer = 0;
/* 判断绘图条件是否合法 */
if((xstart >= 160)||(xstart < 0)||(ystart >= 160)||(ystart < 0))
return ERROR;
if((xstart + width > SCREEN_HIGHT) || (ystart + height > SCREEN_HIGHT))
return ERROR;
/* 显示图层 */
if((layer < 0)||(layer > 1))
return ERROR;
s60753_setCurrentLayer(layer);
left = width & 0x07;/* 剩余位数 */
if(left == 0)
w = width >> 3; /* 整数个字节 */
else
w = (width >> 3) + 1; /* 整数个字节 */
for (y = ystart; y < ystart + height; y++){
for(i = 0; i < (width + 7)/8; i++){
bittemp = 0;
for(j = 0; j < 8; j++){
if(currentLayer[162 * y + xstart + 2 + (i << 3) + j] != 0){
bittemp |= 1 << (7 - j);
}
}
pblock[blockPointer ++] = bittemp;
}
}
return OK;
}
#if 0
/******************************************************************************
*
* s60753_readGrayBlock - 读取指定的坐标位置位图数据
*
* INPUTS:
* int layer: 图层号
* int xstart: 起点的横坐标 pixels
* int ystart: 起点的纵坐标 pixels
* int width: 位图的宽度
* int height: 位图的高度
* uchar* pblock: 数据头指针
*
* RETURNS:
* 0:成功 -1:输入的位图数据为空 -2:位图范围超出屏幕范围
*
******************************************************************************/
extern int s60753_readGrayBlock(int layer, int xstart,int ystart,int width,int height,uchar * pblock)
{
uchar i,j;
unsigned int blockPointer = 0;
/* 判断绘图条件是否合法 */
if((xstart >= 160)||(xstart < 0)||(ystart >= 160)||(ystart < 0))
return ERROR;
if((xstart + width >= SCREEN_HIGHT) || (ystart + height >= SCREEN_HIGHT))
return ERROR;
/* 显示图层 */
if((layer < 0)||(layer > 1))
return ERROR;
if(layer == 0){
for(i = 0; i < height; i++)
for(j = 0; j < width; j++)
pblock[blockPointer ++] = layer0[162 * (i + ystart) + xstart + j + 2];
}else if(layer == 1){
for(i = 0; i < height; i++)
for(j = 0; j < width; j++)
pblock[blockPointer ++] = layer1[162 * (i + ystart) + xstart + j + 2];
}
return OK;
}
#endif
/******************************************************************************
*
* s60753_dispCode - 通用字模显示函数(字符宽度只能为8的倍数
* 在固定的坐标位置绘制字符位图数据,该方法的调用必须满足
* xstart%8==0并且width%8==0两个条件,与s60753_drawBmp相比,该
* 方法会有比较快的显示速度
*
* INPUTS:
* int layer: 图层号
* int xstart: 起点的横坐标 pixels
* int ystart: 起点的纵坐标 pixels
* int width: 字符位图的宽度
* int height: 字符位图的高度
* uchar* pCode: 字符位图数据头指针
*
* RETURNS:
* 0:成功 -1:输入的位图数据为空 -2:位图范围超出屏幕范围
*
******************************************************************************/
extern int s60753_dispCode(int layer, int xstart,int ystart,int width,int height,uchar* pCode)
{
return s60753_drawBmp( layer, xstart, ystart, width, height, pCode );
}
/******************************************************************************
*
* s60753_drawPoint - 画点函数,首先将光标移至画点处,读出当前该点处的信息,
* 将该信息和画点所需要的颜色通过逻辑加工后,重新
* 写入目标区域。这种方法效率低,不适合大片绘图。
*
* INPUTS:
* int layer: 图层号
* int x: 横轴坐标 pixels
* int y: 纵轴坐标 pixels
* int color: 颜色 1 黑色 0 白色
*
* RETURNS:
* 画点成功与否标志 0:成功 -1:点坐标超出屏幕范围
*
******************************************************************************/
extern int s60753_drawPoint(int layer, int x,int y,int color)
{
uchar col;
if((x >= 160)||(x < 0)||(y >= 160)||(y < 0))
return ERROR;
if((color < 0x80) && (color > 0))
color = 0xFF;/* 颜色问题 */
if(layer == 0){
layer0[162 * y + x + 2] = color;
}else if(layer == 1){
layer1[162 * y + x + 2] = color;
}else
return ERROR;
s60753_setCurrentLayer(layer);
col = (47 + x)/3;
/*EXT 0*/
__LCDCommand(LCD_EXT_DISABLE);
/*Column Address Set*/
__LCDCommand(LCD_COLUMN_ADDR_SET);
__LCDParam(col); /* start column */
__LCDParam(col); /* end column */
/* Line Address Set */
__LCDCommand(LCD_LINE_ADDR_SET);
__LCDParam(y); /* start line */
__LCDParam(y); /* end line */
/* Writing to memory */
__LCDCommand(LCD_WRITE_DATA);
col = 3 * col;
/* 刷新到显示屏上 */
/* two layers are both open. */
if(currentLayerState == 0x11){
switch(compMode){
case 0:
__LCDParam(layer0[162 * y + col - 45] | layer1[162 * y + col - 45]);
__LCDParam(layer0[162 * y + col - 44] | layer1[162 * y + col - 44]);
__LCDParam(layer0[162 * y + col - 43] | layer1[162 * y + col - 43]);
break;
case 1:
__LCDParam(layer0[162 * y + col - 45] | layer1[162 * y + col - 45]);
__LCDParam(layer0[162 * y + col - 44] | layer1[162 * y + col - 44]);
__LCDParam(layer0[162 * y + col - 43] | layer1[162 * y + col - 43]);
break;
case 2:
__LCDParam(layer0[162 * y + col - 45] | layer1[162 * y + col - 45]);
__LCDParam(layer0[162 * y + col - 44] | layer1[162 * y + col - 44]);
__LCDParam(layer0[162 * y + col - 43] | layer1[162 * y + col - 43]);
break;
default:break;
}
}else { /* only one layer is open */
__LCDParam(currentLayer[162 * y + col - 45]);
__LCDParam(currentLayer[162 * y + col - 44]);
__LCDParam(currentLayer[162 * y + col - 43]);
}
return OK;
}
/******************************************************************************
*
* s60753_drawLine -画线函数,根据直线的起点和终点坐标,计算线上每一点的坐标,
* 然后调用画点函数。
*
* INPUTS:
* int layer: 图层号
* int x0: 起点横轴坐标 pixels
* int y0: 起点纵轴坐标 pixels
* int x1: 终点横轴坐标 pixels
* int y1: 起点纵轴坐标 pixels
* int color: 颜色 0xF1~0xFF 黑色 0 白色
*
*
* RETURNS:
* 画线成功与否标志 0:成功 -1:点坐标超出屏幕范围
*
******************************************************************************/
extern int s60753_drawLine(int layer, int x0,int y0,int x1, int y1,int color)
{
int i;
uchar drawDirection;/* 0:horizontal; 1:vertical */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -