📄 text.c
字号:
/*****************************************************************
* XIAMEN YAXON NETWORK CO.LTD.
* XINXI BUILDING,HULI,XIAMEN
* (c) Copyright 2002,XIAMEN YAXON NETWORK CO.LTD. ,XIAMEN
* All Rights Reserved
*
* FileName : TEXT.C
* Programmer(s): WuJingYu
* Description :
******************************************************************
*/
/*
*****************************************************************
* REVISION HISTORY
*
* Date: 2002-10-16
*****************************************************************
*/
#define TEXT_GLOBALS
#include "includes.h"
#include "Lcd.h"
/*
******************************************************************************
Attation: 在本液晶屏上不管是写字还是画图,均是按照行来操作,
故先将所要修改的这一行的数据全部存储到shiftstrm[]
中,对shiftstrm[]做好修改之后,再将数据存入缓冲区
DplyImagMem中。这就是shiftstrm[4]的作用。
******************************************************************************
*/
static INT32U shiftstrm[4];
static INT8U leftmod_col,leftfull_col,rightmod_col,rightfull_col;
static INT8U leftbyte,rightbyte;
//static INT8U FontsBuf[32];
//判断所操作区域是否有效,未编写
BOOLEAN IsAreaValid(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
row_dot = row_dot;
col_dot = col_dot;
lenrow_dot = lenrow_dot;
lencol_dot = lencol_dot;
return TRUE;
}
//获取row、col在数据缓冲区中的相应地址
INT8U *GetPosAddr(INT8U *baseaddr,INT8U row_dot,INT8U col,INT8U colsize)
{
return baseaddr + row_dot*colsize + col;
}
//将缓冲DplyImagMem全部清零
void ClearArea_Full(void)
{
memset(DplyImagMem,0,PAGESIZE);
ClearLcd();
}
//恢复边界数据
void ResumeSideBytes(INT8U row1)
{
INT8U *ptr;
if (leftmod_col) //处理要恢复部分的左部
{
ptr = GetPosAddr(DplyImagMem,row1,leftfull_col,COLSIZE);
*ptr &= (0xFF<<leftmod_col); //要显示的数据的低字节(即左部)清零
leftbyte &= (0xFF>>(8-leftmod_col)); //upbyte用于存放原先存在的数据,把upbyte的下部清零
*ptr |= leftbyte; //两者相或,得到了原先的恢复
}
if (rightmod_col) //处理要恢复部分的右部,方法类似leftmod_col处理
{
ptr = GetPosAddr(DplyImagMem,row1,rightmod_col,COLSIZE);
*ptr &= (0xFF>>(8-rightmod_col));
rightbyte &= (0xFF<<rightmod_col);
*ptr |= rightbyte;
}
}
//清除规定区域的内容,应当是清除缓冲区的内容
void ClearArea(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
INT8U i,j;
INT8U *ptr;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
leftmod_col = col_dot - (col_dot >> 3 << 3); //col_dot % 8;
leftfull_col = col_dot >> 3; //col_dot / 8;
rightmod_col = (col_dot + lencol_dot) - ((col_dot + lencol_dot) >> 3 << 3); //(col_dot + lencol_dot) % 8;
rightfull_col = (col_dot + lencol_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
for (i=row_dot;i<lenrow_dot+row_dot;i++)
{
j = leftfull_col;
ptr = GetPosAddr(DplyImagMem,i,j,COLSIZE);
leftbyte = *ptr; //读出欲清除区域左边临界区的数据
for (;j<=rightfull_col;j++) //读出右边临界区的数据,并将整个区域清零
{
rightbyte = *ptr;
*ptr++ = 0;
}
ResumeSideBytes(i); //恢复左边和右边临界区的数据
}
}
void ClearArea_Cursor(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
INT8U i,j;
INT8U *ptr;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
leftmod_col = col_dot - (col_dot >> 3 << 3); //col_dot % 8;
leftfull_col = col_dot >> 3; //col_dot / 8;
rightmod_col = (col_dot + lencol_dot) - ((col_dot + lencol_dot) >> 3 << 3); //(col_dot + lencol_dot) % 8;
rightfull_col = (col_dot + lencol_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
for (i=row_dot;i<lenrow_dot+row_dot;i++)
{
j = leftfull_col;
ptr = GetPosAddr(DplyImagMem,i,j,COLSIZE);
leftbyte = *ptr; //读出欲清除区域左边临界区的数据
for (;j<=rightfull_col;j++) //读出右边临界区的数据,并将整个区域清零
{
rightbyte = *ptr;
*ptr++ = CursorTmp[j]; //y
}
ResumeSideBytes(i); //恢复顶部和底部临界区的数据
}
}
//填充所设定的区域,对缓冲区填充0xFF,操作类似上面的清除
void FillArea(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
INT8U i,j;
INT8U *ptr;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
leftmod_col = col_dot - (col_dot >> 3 << 3); //col_dot % 8;
leftfull_col = col_dot >> 3; //col_dot / 8;
rightmod_col = (col_dot + lencol_dot) - ((col_dot + lencol_dot) >> 3 << 3); //(col_dot + lencol_dot) % 8;
rightfull_col = (col_dot + lencol_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
for (i=row_dot;i<lenrow_dot+row_dot;i++)
{
j = leftmod_col;
ptr = GetPosAddr(DplyImagMem,i,j,COLSIZE);
leftbyte = *ptr; //读出欲清除区域左边临界区的数据
for (;j<=rightfull_col;j++) //读出右边临界区的数据,并将整个区域清零
{
rightbyte = *ptr;
*ptr++ = 0xff;
}
ResumeSideBytes(i);
}
}
void FillArea_Cursor(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
INT8U i,j;
INT8U *ptr;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
leftmod_col = col_dot - (col_dot >> 3 << 3); //col_dot % 8;
leftfull_col = col_dot >> 3; //col_dot / 8;
rightmod_col = (col_dot + lencol_dot) - ((col_dot + lencol_dot) >> 3 << 3); //(col_dot + lencol_dot) % 8;
rightfull_col = (col_dot + lencol_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
for (i=row_dot;i<lenrow_dot+row_dot;i++)
{
j = leftmod_col;
ptr = GetPosAddr(DplyImagMem,i,j,COLSIZE);
leftbyte = *ptr; //读出欲清除区域左边临界区的数据
for (;j<=rightfull_col;j++) //读出右边临界区的数据,并将整个区域清零
{
rightbyte = *ptr;
CursorTmp[j] = *ptr;
*ptr++ = 0xff;
}
ResumeSideBytes(i);
}
}
//将所设定的区域反显,操作类似上面的填充
void ReverseArea(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot)
{
INT8U i,j;
INT8U *ptr;
INT8U temp;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
leftmod_col = col_dot - (col_dot >> 3 << 3); //col_dot % 8;
leftfull_col = col_dot >> 3; //col_dot / 8;
rightmod_col = (col_dot + lencol_dot) - ((col_dot + lencol_dot) >> 3 << 3); //(col_dot + lencol_dot) % 8;
rightfull_col = (col_dot + lencol_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
for (i=row_dot;i<lenrow_dot+row_dot;i++)
{
j = leftmod_col;
ptr = GetPosAddr(DplyImagMem,i,j,COLSIZE);
leftbyte = *ptr; //读出欲清除区域左边临界区的数据
for (;j<=rightfull_col;j++) //读出底部临界区的数据,并将整个区域取反
{
rightbyte = *ptr;
temp = *ptr;
*ptr++ = ~temp;
}
ResumeSideBytes(i);
}
}
#if 0
/*
以下四个函数都调试过,鉴于该项目中没有用到这些函数,所以屏蔽*/
//使设定的区域向下移动shift_dot的距离,单位为象素。注意:移出边界的内容被丢弃
void MovArea_Down(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
INT8U i,j,t;
INT8U *ptr;
INT8U fullrowcnt,shift_dottemp;
INT32U temp32a;
if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return;
if(shift_dot == 0 || shift_dot > lenrow_dot)return;
upmod_row = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
upfull_row = row_dot >> 3;//row_dot / 8;
downmod_row = (row_dot + lenrow_dot) - ((row_dot + lenrow_dot) >> 3 << 3);//(row_dot + lenrow_dot) % 8;
downfull_row = (row_dot + lenrow_dot - 1) >> 3;// / 8; //减1是为了调整,否则在临界的时候会出问题(8+8时应当分2行显示,而不减1则分3行了)
fullrowcnt = downfull_row - upfull_row;
for (i=col_dot;i<lencol_dot+col_dot;i++) {
j = upfull_row;
t = 0;
ptr = GetPosAddr(DplyImagMem,j,i,DOTSIZEX);
upbyte = *ptr;
shiftstrm[0] = 0;
shiftstrm[1] = 0;
shiftstrm[2] = 0;
for (;j<=downfull_row;j++) { //将该列的所有数据(行值)赋给shiftstrm[0~2]
if(j == upfull_row) {
temp32a = upbyte&(0xFF<<upmod_row);
} else {
downbyte = *ptr;
temp32a = downbyte;
}
//shiftstrm[t>>2] |= temp32a<<((t%4)*8);//每个shiftstrm[]里面放置4个8进制数,即32行
shiftstrm[t>>2] |= temp32a << ((t-(t>>2<<2))<<3);
t++;
ptr += DOTSIZEX;
}
shift_dottemp = shift_dot;
if (shift_dottemp >= 64) { //将位移大于32以上的先预处理一下,统一转化为32位以内的处理
shift_dottemp -= 64;
shiftstrm[2] = shiftstrm[0];
shiftstrm[0] = shiftstrm[1] = 0;
} else if (shift_dottemp >= 32) {
shift_dottemp -= 32;
shiftstrm[2] = shiftstrm[1];
shiftstrm[1] = shiftstrm[0];
shiftstrm[0] = 0;
}
if (shift_dottemp) {
shiftstrm[2] <<= shift_dottemp; //shiftstrm[2]向下移动shift_dottemp个位置
temp32a = shiftstrm[1];
temp32a >>= (32 - shift_dottemp);
shiftstrm[2] |= temp32a; //与shiftstrm[1]移下来的部分相或
shiftstrm[1] <<= shift_dottemp;
temp32a = shiftstrm[0];
temp32a >>= (32 - shift_dottemp);
shiftstrm[1] |= temp32a;
shiftstrm[0] <<= shift_dottemp;
}
//至此,已将位移好的内容放到shiftstrm[]中
ptr = GetPosAddr(DplyImagMem,upfull_row,i,DOTSIZEX);
for (j=0;j<=fullrowcnt;j++) {
//*ptr = (shiftstrm[j/4]>>((j%4)*8)) & 0x0000ff;//将shiftstrm[]内容写入到DplayImagMem中
*ptr = (shiftstrm[j>>2]>>((j - (j>>2<<2))<<3)) & 0xff;
ptr += DOTSIZEX;
}
ResumeSideBytes(i); //恢复边界
}
}
//使设定的区域向上移动shift_dot的距离,单位为象素。方法类似上面的函数。注意:移出边界的内容被丢弃
void MovArea_Up(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
INT8U i,j,t;
INT8U *ptr;
INT8U fullrowcnt,shift_dottemp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -