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

📄 text.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************
*                  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 + -