⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 3 页
字号:
     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++) {
           if (j == downfull_row) {
              downbyte = *ptr;
              if (downmod_row == 0) {     //downmod_row == 0时,该行要全部显示
                 temp32a =  downbyte;
              } else {
                 temp32a = downbyte & (0xFF>>(8-downmod_row));
              }   
           } else {
              temp32a = *ptr;
           } 
           //shiftstrm[t/4] |= temp32a<<((t%4)*8);
           shiftstrm[t>>2] |= temp32a<<((t-(t>>2<<2))<<3);
           t++;
           ptr += DOTSIZEX;
        }
        shift_dottemp = shift_dot;
        if (shift_dottemp >= 64) {
           
           shift_dottemp -= 64;
           shiftstrm[0] = shiftstrm[2];
           shiftstrm[1] = shiftstrm[2] = 0;
        } else if (shift_dottemp >= 32) {
           shift_dottemp -= 32;
           shiftstrm[0] = shiftstrm[1];
           shiftstrm[1] = shiftstrm[2];
           shiftstrm[2] = 0;
        }
        if (shift_dottemp) {
           shiftstrm[0] >>= shift_dottemp;
           temp32a = shiftstrm[1];
           temp32a <<= (32 - shift_dottemp);
           shiftstrm[0] |= temp32a;
           shiftstrm[1] >>= shift_dottemp;
           temp32a = shiftstrm[2];
           temp32a <<= (32 - shift_dottemp);
           shiftstrm[1] |= temp32a;
           shiftstrm[2] >>= shift_dottemp;
        }
        ptr = GetPosAddr(DplyImagMem,upfull_row,i,DOTSIZEX);
        for (j=0;j<=fullrowcnt;j++) {
           //*ptr = (shiftstrm[j/4]>>((j%4)*8)) & 0x0000ff;
           *ptr = (shiftstrm[j>>2]>>((j-(j>>2<<2))<<3)) & 0xff;
           ptr += DOTSIZEX;
        }    
        ResumeSideBytes(i);
     }
}
#endif
/*
//使设定的区域向左移动shift_dot的距离,单位为象素。注意:移出左边界的内容被丢弃
void MovArea_Left(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
     INT8U  i,j;
     INT8U  *leftptr,*rightptr;
     INT8U  shiftoft;

     if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return; 
     if(shift_dot == 0 || shift_dot > lencol_dot)return;

     upmod_row  = row_dot % 8;
     upfull_row = row_dot / 8;
     downmod_row  = (row_dot + lenrow_dot) % 8;
     downfull_row = (row_dot + lenrow_dot - 1) / 8;
     
     for (i=upfull_row;i<=downfull_row;i++) {
        leftptr  = GetPosAddr(DplyImagMem,i,col_dot,DOTSIZEX);
        rightptr = GetPosAddr(DplyImagMem,i,col_dot+shift_dot,DOTSIZEX);
        shiftoft = col_dot+lencol_dot-shift_dot;
        if(i == upfull_row) {//如果是上边临界区,则一个象素行一个象素行的移动,超过col_dot的内容被抛弃
           for (j=col_dot;j<shiftoft;j++){//把不会被移出边界的部分((col+shift)~(col+len))直接移到(col~shiftoft)
              upbyte = *leftptr;
              *leftptr = *rightptr++;
              *leftptr &= (0xFF<<upmod_row);
              upbyte &= (0xFF>>(8-upmod_row));
              *leftptr++ |= upbyte;	//与临界区上部相或
           }    
           for(j=shiftoft;j<col_dot+lencol_dot;j++) {//剩下的部分则清零
              upbyte = *leftptr;
              *leftptr++ = 0;
              upbyte &= (0xFF>>(8-upmod_row));
              *leftptr++ |= upbyte;	//与临界区上部相或
           }
        } else if (i == downfull_row) {//如果是下边临界区,也是一个象素行一个象素行的移动,超过col_dot的内容被抛弃
           for (j=col_dot;j<shiftoft;j++){//把不会被移出边界的部分((col+shift)~(col+len))直接移到(col~shiftoft)
              downbyte = *leftptr;
              *leftptr = *rightptr++;
              *leftptr &= (0xFF>>(8-downmod_row));
              downbyte &= (0xFF<<downmod_row);
              *leftptr++ |= downbyte;	//与临界区下部相或
           }    
           for(j=shiftoft;j<col_dot+lencol_dot;j++) {//剩下的部分则清零
              downbyte = *leftptr;
              *leftptr = 0;
              downbyte &= (0xFF<<downmod_row);
              *leftptr++ |= downbyte;	//与临界区下部相或
           }
        } else {
           for (j=col_dot;j<shiftoft;j++){
              *leftptr++ = *rightptr++;
           }    
           for(j=shiftoft;j<col_dot+lencol_dot;j++) {
              *leftptr++ = 0;
           }
        }         
     }   
}    

//使设定的区域向右移动shift_dot的距离,单位为象素。方法类似向左移动。注意:移出右边界的内容不会被丢弃,而是移到下一行
void MovArea_Right(INT8U row_dot,INT8U col_dot,INT8U lenrow_dot,INT8U lencol_dot,INT8U shift_dot)
{
     INT8U  i,j;
     INT8U  *leftptr,*rightptr;
     INT8U  shiftoft,col_index;

     if (IsAreaValid(row_dot,col_dot,lenrow_dot,lencol_dot) == FALSE) return; 
     if(shift_dot == 0 || shift_dot > lencol_dot)return;

     upmod_row  = row_dot % 8;
     upfull_row = row_dot / 8;
     downmod_row  = (row_dot + lenrow_dot) % 8;
     downfull_row = (row_dot + lenrow_dot - 1) / 8;

     for (i=upfull_row;i<=downfull_row;i++) {
        col_index = col_dot + lencol_dot - 1;
        rightptr = GetPosAddr(DplyImagMem,i,col_index,DOTSIZEX);
        leftptr  = GetPosAddr(DplyImagMem,i,col_index-shift_dot,DOTSIZEX);
        shiftoft = col_dot+shift_dot-1;
        
        if(i == upfull_row) {
           for (j=col_index;j>shiftoft;j--) {
              upbyte = *rightptr;
              *rightptr = *leftptr--;
              *rightptr &= (0xFF<<upmod_row);
              upbyte &= (0xFF>>(8-upmod_row));
              *rightptr-- |= upbyte;
           }    
           for (j=col_dot;j<=shiftoft;j++) {
              upbyte = *rightptr;
              *rightptr = 0;
              upbyte &= (0xFF>>(8-upmod_row));
              *rightptr-- |= upbyte;
           }
        } else if (i == downfull_row) {
           for (j=col_index;j>shiftoft;j--) {
              downbyte = *rightptr;
              *rightptr = *leftptr--;
              *rightptr &= (0xFF>>(8-downmod_row));
              downbyte &= (0xFF<<downmod_row);
              *rightptr-- |= downbyte;
           }    
           for (j=col_dot;j<=shiftoft;j++) {
              downbyte = *rightptr;
              *rightptr = 0;
              downbyte &= (0xFF<<downmod_row);
              *rightptr-- |= downbyte;
           }
        } else {
           for (j=col_index;j>shiftoft;j--) {
              *rightptr-- = *leftptr--;
           }    
           for (j=col_dot;j<=shiftoft;j++) {
              *rightptr-- = 0;
           }
        }         
     }   
}    
*/
#if 0
//在设定的位置显示一个汉字或者ASCII字符,并在字符的下方插入spacedot行空格。显示在DplyImagMem中。要显示的字符是放在FontsBuf[]中
INT8U  OutTextSingle(INT8U row_dot,INT8U col_dot,INT8U spacedot,INT8U *charcode)
{
     INT8U i,j;
     INT8U  fontslen,columndot;
     INT8U *ptr;
     INT32U temp32;

     upmod_row  = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
     upfull_row = row_dot >> 3;//row_dot / 8;
     downmod_row  = (row_dot + 16 + spacedot) - ((row_dot + 16 + spacedot) >> 3 << 3);
     downfull_row = (row_dot + 16 + spacedot - 1) >> 3;

     fontslen = GetFonts(charcode,FontsBuf);	//这一步已将charcode在字库中的地址找到并赋给FontsBuf
     if (fontslen == 32) {	//是汉字
        columndot = 16;
     } else {				//是ASCII码    如果不是16,也会跳到这里
        columndot = FONTCOL;
     }   
     
     for (i=0;i<columndot;i++) {
        temp32 = 0;
        ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
        upbyte = *ptr;
        ptr = GetPosAddr(DplyImagMem,downfull_row,col_dot+i,DOTSIZEX);
        downbyte = *ptr;
        downbyte &= (0xFF<<downmod_row);		//downbyte是临界区下部原先就存在的数据
        temp32 = downbyte;						//装入临时的32位数temp32,此时有效数据位是(0xFF<<downmod_row),空出downmod_row
        temp32 <<= (8-downmod_row + spacedot);	//向右移动(8-downmod_row + spacedot),此时空出了(8+spacedot)位
        temp32 |= FontsBuf[i+columndot];		//将字符按照顺序装入临时32位数temp32,共16位
        temp32 <<= 8;
        temp32 |= FontsBuf[i];
        temp32 <<= upmod_row;
        upbyte &= (0xFF>>(8-upmod_row));		//upbyte是临界区上部原先就存在的数据
        temp32 |= upbyte;						//将upbyte装入临时32位数temp32,至此汉字的一列装入完闭
        ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
        for (j=0;j<=downfull_row-upfull_row;j++) {
           //*ptr = (temp32>>((j%4)*8)) & 0x0000ff;	//将temp32写入到DplyImagMem的相应位置中
           *ptr = (temp32>>((j-(j>>2<<2))<<3)) & 0xff;
           ptr += DOTSIZEX;
        }
     }
     return fontslen;
}
//从设定的起点开始在lenrow行(×8象素)、lencol列(×8象素)的范围内显示charlen长度的字符*charptr
void OutText(INT8U row_dot,INT8U col_dot,INT8U lenrow,INT8U lencol,INT8U spacerow_dot,INT8U *charptr,INT8U charlen)
{
     INT8U i,fontslen;
     INT8U  currow_dot,curcol_dot;
     INT8U  rowctr,colctr;

     if (IsAreaValid(row_dot,col_dot,lenrow*FONTROW,lencol*FONTCOL) == FALSE) return;
     
     ClearArea(row_dot,col_dot,lenrow*(2*FONTROW + spacerow_dot),lencol*FONTCOL);	//将这块区域清零
     currow_dot = row_dot;	//令当前行为row_dot,以象素为单位
     curcol_dot = col_dot;	//令当前列为col_dot,以象素为单位
     rowctr = 0;	//行计数器,以显示一行汉字为单位(16象素 + spacerow)
     colctr = 0;	//列计数器,以显示一列ASCII字符为单位(8个象素)
     i = 0;
    
     while (i<charlen) //若没有显示完
     {	
        if (colctr>=lencol || ((colctr == lencol-1) && (IsASCII(charptr)==FALSE))) {	//若已经到了列尾
           if(++rowctr < lenrow) //换行,且rowctr + 1
           {	
              currow_dot = row_dot + rowctr*(2*FONTROW + spacerow_dot);
              colctr = 0;
           } else {
              return;
           }
        }
        curcol_dot = col_dot + colctr*FONTCOL;
        fontslen = OutTextSingle(currow_dot,curcol_dot,spacerow_dot,charptr);//在当前行、当前列显示一个字符
        i++;	//i用来判断text有没有显示完毕
        charptr++;
        colctr++;
        if (fontslen == 4*FONTCOL) {  //若为中文,则长度、charptr和列计数器均多加一次
           i++;
           charptr++;
           colctr++;
        }
     }
}

//在设定的位置显示一个小字符,小字符一般用于显示时间。实现方法类似OutTextSingle
INT8U OutTextTinySingle(INT8U row_dot,INT8U col_dot,INT8U charcode)
{
     INT8U i,j;
     INT8U  fontslen;
     INT8U *ptr;
     INT16U temp16;
     
     upmod_row  = row_dot - (row_dot >> 3 << 3);//row_dot % 8;
     upfull_row = row_dot >> 3;//row_dot / 8;
     downmod_row  = (row_dot + FONTROW) - ((row_dot + FONTROW) >> 3 << 3);
     downfull_row = (row_dot + FONTROW - 1) >> 3;// / 8;

     fontslen = FindTinyFont(charcode,FontsBuf);
     for (i=0;i<8;i++) {
        temp16 = 0;
        ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
        upbyte = *ptr;
        ptr = GetPosAddr(DplyImagMem,downfull_row,col_dot+i,DOTSIZEX);
        downbyte = *ptr;
        downbyte &= (0xFF<<downmod_row);
        temp16 = downbyte;
        temp16 <<= (8-downmod_row);
        temp16 |= FontsBuf[i];
        temp16 <<= upmod_row;
        upbyte &= (0xFF>>(8-upmod_row));
        temp16 |= upbyte;
        ptr = GetPosAddr(DplyImagMem,upfull_row,col_dot+i,DOTSIZEX);
        for (j=0;j<=downfull_row-upfull_row;j++) {
           //*ptr = (temp16>>((j%4)*8)) & 0x0000ff;
           *ptr = (temp16>>((j-(j>>2<<2))<<3)) & 0xff;
           ptr += DOTSIZEX;
        } 
     }   
     return fontslen;  
}
//在设定位置显示一行小字符,实现方法类似OutText。由于小字符不存在分行显示,故参数较OutText有简化    
void OutTextTiny(INT8U row_dot,INT8U col_dot,INT8U *charptr,INT8U charlen)
{
     INT8U i;
     
     ClearArea(row_dot,col_dot,FONTROW,charlen * FONTCOL);
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -