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

📄 dc.c

📁 STM32 单片机例程
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/************************************************************
函数名:LCD写字符串函数8*16ASCII,16*16汉字
功能:向指定位置写入一个或多个字符,本函数带自动换行功能
入口参数:x,横向坐标,由左到右分别是0~240-1 
          y,纵向坐标,由上到下分别为0~320-1
          CharColaor,字符的颜色
          *p 指向要写的字符串
返回值:无
*************************************************************/
void LCD_WriteString16(uint16 x, uint16 y, uint16 CharColor, uint8* p)
{
 u8 dat;
   
   for(;*p!=0;p++)
   {
      if((*p&0x80)==0)//英文
      {
         if(*p=='\r')//回车
         {
            x=0;
            continue;
         }
         if(*p=='\n')//换行
         {
            y+=16;
            if(y > YMAX-16)
               y=0;
            continue;
         }

         dat=*p-0x20;  
         
         if(x > XMAX-8)//不够写1个字符就移到下一行
         {
            x=0;
           
            y+=16;
            if(y > YMAX-16)
               y=0;
         }
         LCDWriteEN(x, y, CharColor, dat);
         x+=8;
      }
      else//中文
      {
         if(x > XMAX-16)//不够写1个字符就移到下一行
         {
            x=0;
           
            y+=16;
            if(y > YMAX-16)
               y=0;
         }
         LCDWriteCN(x, y, CharColor, (u8*)p);
         x+=16;
         p++;
      }
      
   }
}

void LCD_WriteString(uint16 x, uint16 y, uint16 CharColor, uint8* p, uint8 font)
{
    if(font==16)
       LCD_WriteString16(x, y, CharColor, p);
    else //if(font==24)
       LCD_WriteString24(x, y, CharColor, p);
}

/************************************************************
函数名:LCD写字符串函数8*16ASCII,24*24汉字
功能:向指定位置写入一个或多个字符,本函数带自动换行功能
入口参数:x,横向坐标,由左到右分别是0~240-1 
          y,纵向坐标,由上到下分别为0~320-1
          CharColaor,字符的颜色
          *p 指向要写的字符串
返回值:无
*************************************************************/
void LCD_WriteString24(uint16 x, uint16 y, uint16 CharColor, uint8* p)
{
 u8 dat;
   
   for(;*p!=0;p++)
   {
      if((*p&0x80)==0)//英文
      {
         if(*p=='\r')//回车
         {
            x=0;
            continue;
         }
         if(*p=='\n')//换行
         {
            y+=24;
            if(y > YMAX-24)
               y=0;
            continue;
         }

         dat=*p-0x20;  
         
         if(x > XMAX-16)//不够写1个字符就移到下一行
         {
            x=0;
           
            y+=24;
            if(y > YMAX-24)
               y=0;
         }
         LCDWriteEN24(x, y, CharColor, dat);
         x+=16;
      }
      else//中文
      {
         if(x > XMAX-24)//不够写1个字符就移到下一行
         {
            x=0;
           
            y+=24;
            if(y > YMAX-24)
               y=0;
         }
         LCDWriteCN24(x, y, CharColor, (u8*)p);
         x+=24;
         p++;
      }
      
   }
}

/*********************************************************
函数名:SPI取ASCII码子程序
输入参数:u8 ASCII 输入的ASCII码,如'A'
          BaseAddr 基址 即ASCII显示代码在FLASH中的启示位置
返回值:无
说明:输入一个ASCII码,取得它在SPI FLASH中的16Byte显示代码
并将其存放到一个16byte的ASCII显示缓冲CharBuffer[]中
**********************************************************/
//void GetASCIICode(u8* buf, u8 ASCII)
void GetASCIICode(u8* buf, u8 ASCII, u8 dot)
//{uint32 address;
// u8 len;
//   
//   if(dot==16)
//      address=0x40000+16UL*ASCII, len=16;
//   else if(dot==24)
//      address=0xBB000+48UL*ASCII, len=48;
//   else
//      address=0, len=0;
//      
////   Read_Flash_Page ( address, len, buf );
//}
{
uint8* address;
   
   address=(uint8*)EZK;
   address+=(uint32)ASCII*16;
   memcpy(buf, address, 16);
}

/*********************************************************
函数名:SPI中文显示码子程序
输入参数:u16 ASCII 输入的中文,如"我"
          BaseAddr 基地 即显示代码在FLASH中的起始位置
返回值:无
说明:输入一个中文,取得它在SPI FLASH中的32Byte显示代码
并将其存放到一个32byte的显示缓冲ChineseBuffer[]
**********************************************************/
void GetChineseCode(u8* dot, u8 *p)
//{//uchar m;
// //uint8 dot[32];
// uint32 address;
//
//   //address=(uint32)32*( ((*p)-0xa1)*94 + ((*(p+1))-0xa1) )+4096;
//   address=32UL*( ((*p)-0xa1)*94 + ((*(p+1))-0xa1) );
//   //address+=HZK_FlashAddress;
////   Read_Flash_Page ( address, 32, dot );
//}
{uint8 *hz;
 uint8 hz_f=0;
 int i=0;
  for(hz=(uint8 *)PHZ;*hz!='\0';hz+=2)
  {
   if( *p==*hz && *(p+1)==*(hz+1) )
    {
     hz_f=1;
     break;
    }
   else
     i++;
  }
  if(hz_f==0)
    return;
  
  hz=(uint8 *)HZK;
  hz+=(uint32)i*32;
  memcpy(dot, hz, 32);
}

/*********************************************************
函数名:SPI中文显示码子程序
输入参数:u16 ASCII 输入的中文,如"我"
          BaseAddr 基地 即显示代码在FLASH中的起始位置
返回值:无
说明:输入一个中文,取得它在SPI FLASH中的32Byte显示代码
并将其存放到一个32byte的显示缓冲ChineseBuffer[]
**********************************************************/
void GetChineseCode24(u8* dot, u8 *p)
{//uchar m;
 //uint8 dot[32];
 uint32 address;

   //address=(uint32)32*( ((*p)-0xa1)*94 + ((*(p+1))-0xa1) )+4096;
   address=72UL*( ((*p)-15-0xa1)*94 + ((*(p+1))-0xa1) );
   address+=0x41000;
//   Read_Flash_Page ( address, 72, dot );
}


/*----------------------------------------------------------------------
调用该成员函数用指定的固体色填充矩形
x: 矩形左上角的X逻辑坐标。  
y: 矩形左上角的Y逻辑坐标。  
Width: 指定矩形的宽度。  
Height: 指定矩形的高度。  
Color: 填充颜色
----------------------------------------------------------------------*/
void FillSolidRect(u16 x, u16 y, u16 Width, u16 Height,  u16 Color)
{uint32 i;
   
   LCD_WR_CmdPar(0x20, x);//起始X坐标
   LCD_WR_CmdPar(0x21, y);//起始Y坐标
   
   LCD_WR_CmdPar(0x0050, x);//水平 GRAM起始位置
   LCD_WR_CmdPar(0x0051, x+Width-1);//水平GRAM终止位置
   LCD_WR_CmdPar(0x0052, y);//垂直GRAM起始位置
   LCD_WR_CmdPar(0x0053, y+Height-1);//垂直GRAM终止位置   
   
   LCD_WR_Cmd(0x0022);//开始读/写
   
   for(i=0; i<(u32)Width*Height; i++)
   {
      LCD_WR_DATA(Color);
   }
}


u16 BG_COLOR=GREY;	//全局的背景色,此变量是为了增加运行速度而设置的

u16 LCD_SET_Color(u16 color_front, u16 color_back, unsigned char Alpha)
{                    
        unsigned char R0,G0,B0,R1,G1,B1,newR,newG,newB; 
         
        R0=(color_back>>11)&0x1f; 
        G0=(color_back>>5)&0x3f; 
        B0=(color_back&0x1f); 
                 
        R1=(color_front>>11)&0x1f; 
        G1=(color_front>>5)&0x3f; 
        B1=(color_front&0x1f); 

        newR=   (R0*(255-Alpha)+R1*Alpha)/255;   //   Alpha取值范围从0到255   
        newG=   (G0*(255-Alpha)+G1*Alpha)/255;   //   Alpha取值范围从0到255   
        newB=   (B0*(255-Alpha)+B1*Alpha)/255;   //   Alpha取值范围从0到255  
        
        return RGB565(newR,newG,newB);
        
}


void TFTHLine(u16 x,u16 y,u16 len, u16 color,u8 cover)
{u16 i,tmp_rd,new_color;
   
	for(i=0;i<len;i++)
  {
	 LCD_WR_Cmd(0x0020);//x
	 LCD_WR_DATA(x+i);
	 LCD_WR_Cmd(0x0021);//y
	 LCD_WR_DATA(y);
	 LCD_WR_Cmd(0x0022);
	 if(cover==0)
	 {
	 	  LCD_WR_DATA(color);
	 }
	 else
	 {
	    //tmp_rd=LCD_Read();
	    tmp_rd=LCD_ReadPixel(x+i, y);
	    
	    if(tmp_rd!=BG_COLOR)
	    {
	       new_color=LCD_SET_Color(tmp_rd,color,150);
	    } 
	    else
	    {
	       new_color=color;
	    }
	    LCD_WR_Cmd(0x0020);//x
	    LCD_WR_DATA(x+i);
	    LCD_WR_Cmd(0x0021);//y
	    LCD_WR_DATA(y);
	    LCD_WR_Cmd(0x0022);
	    LCD_WR_DATA(new_color);
	 }
	}
}

/**************************************************************
** 函数名:TFTRectFill
** 功能:填充矩形
** 注意事项:
***************************************************************/
void TFTRectFill(u16 x0, u16 y0, u16 x1, u16 y1, u16 color,u8 cv)
{
	u16 i,cnt,len;
	len=x1-x0;
	cnt=y1-y0;
	for(i=0;i<cnt;i++)
	{	
		TFTHLine(x0,y0+i,len,color,cv);
	}
}


/*
写入1块图片
下面是利用GRAM窗体高速写入
x
y
w
h
pbuf
*/
void LCD_WriteBlock(u16 x, u16 y, u16 w, u16 h, u16 *pbuf)
{u32 i;
   
   LCD_WR_CmdPar(0x20, x);//起始X坐标
   LCD_WR_CmdPar(0x21, y);//起始Y坐标
   
   LCD_WR_CmdPar(0x0050, x);//水平 GRAM起始位置
   LCD_WR_CmdPar(0x0051, x+w-1);//水平GRAM终止位置
   LCD_WR_CmdPar(0x0052, y);//垂直GRAM起始位置
   LCD_WR_CmdPar(0x0053, y+h-1);//垂直GRAM终止位置   
   
   LCD_WR_Cmd(0x0022);//开始读/写
   
   for(i=0; i<(u32)w*h; i++)
   {
      LCD_WR_DATA(*pbuf++);
   }
}


void LCD_ReadBlock(u16 x, u16 y, u16 w, u16 h, u16 *pbuf)
{u16 ix,iy;
   
   for(iy=0; iy<h; iy++)
   {
      for(ix=0; ix<w; ix++)
      {
         *pbuf++=LCD_ReadPixel(x+ix, y+iy);
      }
   }
}


⌨️ 快捷键说明

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