STM32 串口屏T5UIC1通讯协议使用(含库函数)以及数据刷新去重叠方法

想要交流的,关注公众号,后台联系即可

在这里插入图片描述

我的测试是基于STM32F407平台,直接将下面的库和头函数添加调用即可.

我再使用中,需要通过串口通讯发送ADC数据到串口屏,这里因为要更新串口屏数字,因此如果直接显示,会造成数字重叠的情况,

库函数中只能全局清屏,因此,使用矩阵,局部填充白色,先覆盖掉之前的数据,然后再显示新的数值,根据自己需要设置时间间隔

选择串口,清屏,显示矩形,输出一串汉字

    DWINLCD_Init(USART1);
 	DWINLCD_Clear(White);
	DWINLCD_DrawRectangle(0x00, Black, 0, 0, 300, 180);
	DWINLCD_DrawRectangle(0x00, Black, 300, 0, 480, 60);
	DWINLCD_DrawRectangle(0x00, Black, 300, 0, 480, 120);
	DWINLCD_DrawRectangle(0x00, Black, 300, 0, 480, 180);
	DWINLCD_ShowXChar(1, 1, 0x05, Black, White, 30, 210, "这里可以输入任意的汉字串");

显示adcx这个变量数字,显示之前先将显示区域填充白色,相当于局部清屏

    DWINLCD_DrawRectangle(0x01, White, 30, 50, 220, 150);
	DWINLCD_ShowXNum(0, 1, 1, 0, 0x09, BLACK, BLUE, 4, 0, 30,50, adcx);

T5UIC1 的 库函数以及头文件,用的正点原子的库函数,所以有个sys.h

#ifndef __DWIN_H
#define __DWIN_H		
#include "sys.h"	 
#include "stdlib.h"
#include "string.h"	
#include "math.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "lcd.h"

//屏幕矩形区域移动宏定义
/***************************************************************************************************************
        移动方向: 0x00=环移向左。  0x01=环移向右。  0x02=环移向上。  0x03=环移向下。
                   0x80=平移向左。  0x81=平移向右。  0x82=平移向上。  0x83=平移向下。  
***************************************************************************************************************/
#define ROL       0x00      //环移向左
#define ROR       0x01      //环移向右
#define ROU       0x02      //环移向上
#define ROD       0x03      //环移向下

#define PTL       0x80      //平移向左
#define PTR       0x81      //平移向右
#define PTU       0x82      //平移向上
#define PTD       0x83      //平移向下

//画笔颜色
#define White         	 0xFFFF
#define Black         	 0x0000	  
#define Blue         	   0x001F  
#define BRed             0XF81F
#define GRed 			       0XFFE0
#define GBlue			       0X07FF
#define Red           	 0xF800
#define Magenta       	 0xF81F
#define Green         	 0x07E0
#define CYAN          	 0x7FFF
#define Yellow        	 0xFFE0
#define BROWN 	    		 0XBC40 //棕色
#define BRRED 		    	 0XFC07 //棕红色
#define GRAY  		    	 0X8430 //灰色
//GUI颜色

#define DARKBLUE      	 0X01CF	//深蓝色
#define LIGHTBLUE      	 0X7D7C	//浅蓝色  
#define GRAYBLUE       	 0X5458 //灰蓝色
//以上三色为PANEL的颜色 
 
#define LIGHTGREEN     	 0X841F //浅绿色 
#define LGRAY 			     0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)




//字符/汉字字号大小
#define    A12   0x00        //字符字号12*06汉字字号12*12
#define    A16   0x01	       //字符字号16*08汉字字号16*16
#define    A20   0x02        //字符字号20*10汉字字号20*20
#define    A24   0x03	       //字符字号24*12汉字字号24*24
#define    A28   0x04        //字符字号28*14汉字字号28*28
#define    A32   0x05        //字符字号32*16汉字字号32*32
#define    A40   0x06        //字符字号40*20汉字字号40*40
#define    A48   0x07        //字符字号48*24汉字字号48*48
#define    A56   0x08        //字符字号56*28汉字字号56*56
#define    A64   0x09        //字符字号64*32汉字字号64*64



void Data_init(void);                          //协议帧 帧头帧尾初始化	    															  
void DWINLCD_Init(USART_TypeDef* USARTx);		   //屏幕握手初始化
void Send_Data(uint8_t *buff);                 //协议指令发送

void DWIN_LightSet(uint8_t Light);                  //背光亮度调节
void DWINLCD_Clear(uint16_t Color);	 							 //全局清屏
void DWINLCD_DrawPoint(uint16_t Color,uint8_t Nx,uint8_t Ny,uint16_t X1,uint16_t Y1);		               //画点
void DWINLCD_DrawLine(uint16_t Color,uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);               //画线
void DWINLCD_DrawRectangle(uint8_t Mode,uint16_t Color,uint16_t Xs, uint16_t Ys, uint16_t Xe, uint16_t Ye);  //画矩形 /矩形填充/局部清屏
void DWINLCD_Area_Movement(uint8_t Mode,uint16_t DIS,uint16_t Color,uint16_t Xs, uint16_t Ys, uint16_t Xe, uint16_t Ye);	    //矩形区域移动
void DWINLCD_ShowChar(uint8_t CWA,uint8_t BCD,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs, uint16_t Ys,char*str);        //显示一个字符/汉字	
void DWINLCD_ShowXChar(uint8_t CWA,uint8_t BCD,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs, uint16_t Ys,char*str);       //显示多个字符						      
void DWINLCD_ShowNum(uint8_t BCD,uint8_t SymNum,uint8_t Dis0,uint8_t NDis,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs,uint16_t Ys,uint8_t Num);		              //显示一个数字
void DWINLCD_ShowXNum(uint8_t BCD,uint8_t SymNum,uint8_t Dis0,uint8_t NDis,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint8_t Num_I,uint8_t Num_F,uint16_t Xs,uint16_t Ys,uint32_t XNum);	//显示多位数字
void DWINLCD_QR_Code(uint8_t QR_Pixel,uint16_t Xs,uint16_t Ys,char*str);	    //显示二维码
void DWINLCD_JPEG_Display(uint16_t JPEG_ID);	                      //显示图片
void DWINLCD_Display_Dir(uint8_t Dis_CFG);								          //设置屏幕显示方向
void DWINLCD_ICO_Display(uint16_t Xs, uint16_t Ys,uint8_t IBD,uint8_t BIR,uint8_t BFI,uint8_t ISI,uint8_t Icon_IDs);	   //显示图标
void DWINLCD_ICOplay(uint16_t Xs, uint16_t Ys,uint8_t SC,uint8_t LM,uint8_t IconID,uint8_t Icon_lib,uint8_t Icon_IDs,uint8_t Icon_IDe,uint8_t Delay_time);//ICO图标动画play
void DWINLCD_Cartoon_Set(uint8_t Cartoon_Set,uint8_t on_off);     //ICO图标动画自动显示指令控制


/****************************本API为扩展指令,非手册内指令函数*****************************************/
void DWINLCD_Draw_Circle(uint16_t Color,uint16_t x0,uint16_t y0,uint8_t r);		  //画圆
void DWINLCD_CircleFill(uint16_t FColor,uint16_t x0,uint16_t y0,uint8_t r);			//圆型填充

						  		 
#endif

#include "dwin.h"
//#include "rtthread.h"

//初始化lcd

int DwinSend_Buff_Size=5;
uint8_t *DWINSend_Buff;
volatile  uint16_t Send_p = 0;
USART_TypeDef* Dwin_UART;


//帧头帧尾初始化
void Data_init()
{
	 
   DWINSend_Buff=(uint8_t *)malloc(DwinSend_Buff_Size);
 	
   /***********************************************************/		 
   DWINSend_Buff[DwinSend_Buff_Size -DwinSend_Buff_Size ]=0xAA;     //帧头//
   /***********************************************************/		
	 
	 /***********************************************************/	 
   DWINSend_Buff[DwinSend_Buff_Size -4]=0xCC;                       帧//
	 DWINSend_Buff[DwinSend_Buff_Size -3]=0x33;                       结//
	 DWINSend_Buff[DwinSend_Buff_Size -2]=0xC3;                       束//
	 DWINSend_Buff[DwinSend_Buff_Size -1]=0x3C;                       符//
	 /***********************************************************/	 
}
//迪文串口屏初始化
//传参:串口号
//例子:DWINLCD_Init(USART1);      //迪文屏采用串口1发送
void DWINLCD_Init(USART_TypeDef* USARTx)
{ 
	 DwinSend_Buff_Size=6; 
	 Data_init();                                   //更新数组     		
   Dwin_UART=USARTx;
	
	 DWINSend_Buff[DwinSend_Buff_Size -5]=0x00;     //握手指令
	 
	 Send_Data(DWINSend_Buff);                      //发送数据
	
	/**********判断回复消息,确认是否握手成功************/

	
	
}  		  
  
//发送指令数据 
void Send_Data(uint8_t *buff)
{
	 uint8_t i=DwinSend_Buff_Size;
	 Send_p = 0;
	 while(i--)
	 {
		 while((Dwin_UART->SR&0X40)==0);  //循环发送,直到发送完毕
		 Dwin_UART->DR = (DWINSend_Buff[Send_p++]&(uint16_t)0x01FF);    		 
	 } 
	 free(DWINSend_Buff);                 //释放内存     
}

//迪文屏背光亮度调节
//背光亮度值范围:0x00-0xFF
/*注意:0x00 背光关闭,0xFF 背光最亮,其中 0x01-0x1F 设置值背光可能会闪烁。*/
void DWIN_LightSet(uint8_t Light)
{
	
	DwinSend_Buff_Size=7;                         //指令数据长度为7(帧头+指令+数据+帧尾)
	Data_init();                                  //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -6]=0x30;    //背光指令
	
	DWINSend_Buff[DwinSend_Buff_Size -5]=Light;   //背光值
	
	Send_Data(DWINSend_Buff);                     //发送数据
}

//迪文屏全局清屏
//
void DWINLCD_Clear(uint16_t Color)	 					  //全局清屏
{
	DwinSend_Buff_Size=8;                         //指令数据长度为8(帧头+指令+数据+帧尾)
	Data_init();                                  //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -7]=0x01;    //清屏指令
	
	DWINSend_Buff[DwinSend_Buff_Size -6]=Color>>8;       //清屏颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -5]=Color&0x00FF;   //清屏颜色低8位
	
	Send_Data(DWINSend_Buff);                            //发送数据
  delay_ms(10);
}

//___________________________________画点 ____________________________________________\\
//指令:帧头+指令+画点颜色+画点像素大小(Nx,Ny)+画点位置【(X1,Y1)+(X2,Y2)+.........】+帧尾
//置点;处理时间=0.4*Nx*Ny*置点数目 uS。
//Color:置点颜色。
//Nx:实际像素点 X 方向像素大小,0x01-0x0F。
//Ny:实际像素点 Y 方向像素大小,0x01-0x0F。
//(Xn,Yn):置点坐标序列。
//举例:AA 02 F8 00 04 04 00 08 00 08  CC 33 C3 3C
/**************画点协议指令可以一次画多点(本函数只画一个位置的像素点)********************/
void DWINLCD_DrawPoint(uint16_t Color,uint8_t Nx,uint8_t Ny,uint16_t X1,uint16_t Y1)			  //画点
{
	DwinSend_Buff_Size=14;                         //指令数据长度为14(帧头+指令+数据+帧尾)
	Data_init();                                   //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -13]=0x02;    //画点指令
	
	DWINSend_Buff[DwinSend_Buff_Size -12]=Color>>8;          //画点颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -11]=Color&0x00FF;      //画点颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -10]=Nx;                //Nx:实际像素点 X 方向像素大小,0x01-0x0F
	DWINSend_Buff[DwinSend_Buff_Size -9]=Ny;                 //Ny:实际像素点 Y 方向像素大小,0x01-0x0F
	
	DWINSend_Buff[DwinSend_Buff_Size -8]=X1>>8;              //X1置点X坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=X1&0xFF;            //X1置点X坐标低八位
	
	DWINSend_Buff[DwinSend_Buff_Size -6]=Y1>>8;              //Y1置点Y坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=Y1&0xFF;            //Y1置点Y坐标低八位
	
	Send_Data(DWINSend_Buff);                                //发送数据
}
//_________________________________画线________________________________________\\

//指令:帧头+指令+画线颜色+画点起点位置(X1,Y1)+画点起点位置(X2,Y2)+帧尾
//Color:画线颜色
//起始坐标:(x1,y1)
//终点坐标:(x2,y2)
void DWINLCD_DrawLine(uint16_t Color,uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)					//画线
{
	DwinSend_Buff_Size=16;                                    //指令数据长度为16(帧头+指令+数据+帧尾)
	Data_init();                                              //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -15]=0x03;               //画线指令
	
	DWINSend_Buff[DwinSend_Buff_Size -14]=Color>>8;           //画线颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Color&0x00FF;       //画线颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -12]=x1>>8;              //X1坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -11]=x1&0xFF;            //X1坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -10]=y1>>8;              //Y1坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -9]=y1&0xFF;             //Y1坐标低八位
	
	DWINSend_Buff[DwinSend_Buff_Size -8]=x2>>8;               //X2坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=x2&0xFF;             //X2坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -6]=y2>>8;               //Y2坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=y2&0xFF;             //Y2坐标低八位
	
	Send_Data(DWINSend_Buff);                                 //发送数据
}

//___________________________________画矩形框____________________________________________\\

//指令:帧头+指令+模式+画线颜色+矩形框左上角起点坐标(Xs,Ys)+矩形框右下角坐标(Xe,Ye)+帧尾
//模式:  (0)0x00 显示矩形框颜色
//       (1)0x01 显示矩形区域填充颜色
//       (2)0x02 XOR 矩形区域数据,多用于菜单选中/不选中着色
//Color:矩形框颜色/矩形框填充颜色
//(Xs,Ys):矩形框左上角起点坐标
//(Xe,Ye):矩形框右下角终点坐标
void DWINLCD_DrawRectangle(uint8_t Mode,uint16_t Color,uint16_t Xs, uint16_t Ys, uint16_t Xe, uint16_t Ye)		   				//画矩形
{
	DwinSend_Buff_Size=17;                                    //指令数据长度为16(帧头+指令+数据+帧尾)
	Data_init();                                              //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -16]=0x05;               //画矩形指令
	DWINSend_Buff[DwinSend_Buff_Size -15]=Mode;               //模式选择
	
	DWINSend_Buff[DwinSend_Buff_Size -14]=Color>>8;           //画线颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Color&0x00FF;       //画线颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -12]=Xs>>8;              //Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -11]=Xs&0xFF;            //Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -10]=Ys>>8;              //Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -9]=Ys&0xFF;             //Ys坐标低八位
	
	DWINSend_Buff[DwinSend_Buff_Size -8]=Xe>>8;               //Xe坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=Xe&0xFF;             //Xe坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -6]=Ye>>8;               //Ye坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=Ye&0xFF;             //Ye坐标低八位
	
	Send_Data(DWINSend_Buff);                                 //发送数据
}
//____________________________________屏幕区域移动_________________________________________\\
//指令:帧头+指令+模式+移动方向+填充颜色+矩形框左上角起点坐标(Xs,Ys)+矩形框右下角坐标(Xe,Ye)+帧尾
/****************************************************************************************************
Mode:    ROL=环移向左。  ROR=环移向右。  ROU=环移向上。  ROD=环移向下。
          PTL=平移向左。  PTR=平移向右。  PTU=平移向上。  PTD=平移向下。   
****************************************************************************************************/
//DIS:  移动距离,像素点阵数目,0x0000-水平分辨率/2,2Bytes。
//Color:填充颜色,仅当平移时有效。
//(Xs,Ys):选定区域的左上角坐标。
//(Xe,Ye):选定区域的右下角坐标。
void DWINLCD_Area_Movement(uint8_t Mode,uint16_t DIS,uint16_t Color,uint16_t Xs, uint16_t Ys, uint16_t Xe, uint16_t Ye)	//矩形区域移动
{
	DwinSend_Buff_Size=19;                                    //指令数据长度为19(帧头+指令+Mode+数据+帧尾)
	Data_init();                                              //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -18]=0x09;               //矩形区域移动指令
	DWINSend_Buff[DwinSend_Buff_Size -17]=Mode;               //矩形区域移动模式指令   
	
	DWINSend_Buff[DwinSend_Buff_Size -16]=DIS>>8;             //矩形区域移动距离高八位  
	DWINSend_Buff[DwinSend_Buff_Size -15]=DIS&0xFF;           //矩形区域移动距离低八位
	
	DWINSend_Buff[DwinSend_Buff_Size -14]=Color>>8;           //填充颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Color&0xFF;         //填充颜色低8位
	
  DWINSend_Buff[DwinSend_Buff_Size -12]=Xs>>8;              //Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -11]=Xs&0xFF;            //Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -10]=Ys>>8;              //Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -9]=Ys&0xFF;             //Ys坐标低八位
	
	DWINSend_Buff[DwinSend_Buff_Size -8]=Xe>>8;               //Xe坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=Xe&0xFF;             //Xe坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -6]=Ye>>8;               //Ye坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=Ye&0xFF;             //Ye坐标低八位
	
	Send_Data(DWINSend_Buff);                                 //发送数据
}
//____________________________显示一个字符/汉字________________________________\\
//指令:    帧头+指令+模式+字符颜色+字符背景颜色+字符左上角坐标(Xs,Ys)+字符+帧尾
//CWA:     字符宽度调整(CWA)设置     1=调整 0=不调整。
//BCD:     背景颜色显示(BCD)设置     1=显示 0=不显示。
//Size:    字符字号大小
//Color:  字符显示颜色。
//Bcolor: 字符背景显示颜色。
//(Xs,Ys):文本显示位置左上角坐标
//Strings:要显示的字符。
/******************非 ASCII 字符按照 GB2312 编码格式汉字显示******************/

void DWINLCD_ShowChar(uint8_t CWA,uint8_t BCD,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs, uint16_t Ys,char*str)						      
{
	uint16_t strlenth=0;
	DwinSend_Buff_Size=17;                                    //指令数据长度为17(帧头+指令+Mode+数据+帧尾)
	Data_init();                                              //重新更新数组
	
	strlenth=strlen((const char*)str);
	
	DWINSend_Buff[DwinSend_Buff_Size -16]=0x11;               //显示字符指令
	DWINSend_Buff[DwinSend_Buff_Size -15]=CWA%2<<7|BCD%2<<6|Size; //显示字符模式指令   
	
	DWINSend_Buff[DwinSend_Buff_Size -14]=Color>>8;           //字符颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Color&0xFF;         //字符颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -12]=Bcolor>>8;          //填充字符背景颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -11]=Bcolor&0xFF;        //填充字符背景颜色低8位
	
    DWINSend_Buff[DwinSend_Buff_Size -10]=Xs>>8;            //字符Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -9]=Xs&0xFF;             //字符Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -8]=Ys>>8;               //字符Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=Ys&0xFF;             //字符Ys坐标低八位
	

	DWINSend_Buff[DwinSend_Buff_Size -6]=*str;                //字符内码/汉字高八位
	while(strlenth>1&*str>0x7E)                               //判断是否为汉字
		{
	    DWINSend_Buff[DwinSend_Buff_Size -5]=*(str+1); break; //汉字低八位
		}
	
	Send_Data(DWINSend_Buff);                                 //发送数据
	
	
}

//____________________________显示一个字符/汉字________________________________\\

//指令:   帧头+指令+模式+字符颜色+字符背景颜色+字符左上角坐标(Xs,Ys)+字符+帧尾
//CWA:     字符宽度调整(CWA)设置     1=调整 0=不调整。
//BCD:     背景颜色显示(BCD)设置     1=显示 0=不显示。
//Size:    字符字号大小
//Color:  字符显示颜色。
//Bcolor: 字符背景显示颜色。
//(Xs,Ys):文本显示位置左上角坐标
//Strings:要显示的字符。
/******************非 ASCII 字符按照 GB2312 编码格式汉字显示******************/
void DWINLCD_ShowXChar(uint8_t CWA,uint8_t BCD,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs, uint16_t Ys,char*str)						      
{
	uint16_t strlenth;
	int i;
	strlenth=strlen((const char*)str);
	DwinSend_Buff_Size=15+strlenth;                           //指令数据长度为15+strlenth(帧头+指令+Mode+数据+帧尾)
	
	Data_init();                                              //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -14-strlenth]=0x11;                    //显示字符指令
	DWINSend_Buff[DwinSend_Buff_Size -13-strlenth]=CWA%2<<7|BCD%2<<6|Size;  //显示字符模式指令   
	
	DWINSend_Buff[DwinSend_Buff_Size -12-strlenth]=Color>>8;           //字符颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -11-strlenth]=Color&0xFF;         //字符颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -10-strlenth]=Bcolor>>8;          //填充字符背景颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -9-strlenth]=Bcolor&0xFF;         //填充字符背景颜色低8位
	
  DWINSend_Buff[DwinSend_Buff_Size -8-strlenth]=Xs>>8;               //字符Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7-strlenth]=Xs&0xFF;             //字符Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -6-strlenth]=Ys>>8;               //字符Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5-strlenth]=Ys&0xFF;             //字符Ys坐标低八位
	

	for(i=strlenth;i>0;i--)
	{		DWINSend_Buff[DwinSend_Buff_Size -4-i]=*(str++); }             //字符Ys坐标低八位
	
	Send_Data(DWINSend_Buff);                                 //发送数据
	
	
}

//____________________________显示1个数字________________________________\\
//BCD:     背景色显示设置 1=显示 0=不显示。
//SymNum:  1=带符号数 0=无符号数。
//Dis0:     1= 无效0显示          0= 无效0不显示。
//NDis:     1= 无效0显示为0       0= 无效0显示为空格。
//Size:    字号大小,0x00-0x09,同 0x11 指令。
//Color:   字符显示颜色。
//Bcolor:  字符背景显示颜色。
//(x,y): 变量显示的左上角坐标。
//Datas:1位数据
void DWINLCD_ShowNum(uint8_t BCD,uint8_t SymNum,uint8_t Dis0,uint8_t NDis,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint16_t Xs,uint16_t Ys,uint8_t Num)						           //显示一个数字
{	
	DwinSend_Buff_Size=18;                                    //指令数据长度为17(帧头+指令+Mode+数据+帧尾)
	Data_init();                                              //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -17]=0x14;               //显示数字指令
	DWINSend_Buff[DwinSend_Buff_Size -16]=BCD%2<<7|SymNum%2<<6|Dis0%2<<5|NDis%2<<4|Size;       //显示数字模式指令   
	
	DWINSend_Buff[DwinSend_Buff_Size -15]=Color>>8;           //数字颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -14]=Color&0xFF;         //数字颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Bcolor>>8;          //填充字符背景颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -12]=Bcolor&0xFF;        //填充字符背景颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -11]=0x01;               //显示的整数位数。
	
	DWINSend_Buff[DwinSend_Buff_Size -10]=0x00;               //显示的小数位数。
	
	DWINSend_Buff[DwinSend_Buff_Size -9]=Xs>>8;               //数字Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -8]=Xs&0xFF;             //数字Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=Ys>>8;               //数字Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -6]=Ys&0xFF;             //数字Ys坐标低八位

	DWINSend_Buff[DwinSend_Buff_Size -5]=Num;
	
	Send_Data(DWINSend_Buff);                                 //发送数据
	
}

//____________________________显示多个数字________________________________\\
//BCD:  背景颜色显示开关     1=显示       0=不显示
//SymNum:     有无符号数     1=有符号数   0=无符号数
//Dis0:       1= 无效0显示          0= 无效0不显示。
//NDis:       1= 无效0显示为0       0= 无效0显示为空格。
//Size:       字符字号大小         12#/16#/20#/24#/28#/32#/40#/48#/56#/64#
//Color:     字符显示颜色         
//Bcolor:    字符背景显示颜色
//Num_I:      显示的整数位数,   1-20
//Num_F:      显示的小数位数,   0-20
//(x,y):     变量显示的左上角坐标
//Datas:     多位数据             最多 8 字节
/*******************Num_I+Num_F 之和不能超过 20****************************/
void DWINLCD_ShowXNum(uint8_t BCD,uint8_t SymNum,uint8_t Dis0,uint8_t NDis,uint8_t Size,uint16_t Color, uint16_t Bcolor,uint8_t Num_I,uint8_t Num_F,uint16_t Xs,uint16_t Ys,uint32_t XNum)	//显示多位数字
{
	
	uint8_t strlenth=4;
	DwinSend_Buff_Size=21;                                          //指令数据长度为17(帧头+指令+Mode+数据+帧尾)
	Data_init();                                                    //重新更新数组
	
	DWINSend_Buff[DwinSend_Buff_Size -16-strlenth]=0x14;               //显示数字指令
		
	DWINSend_Buff[DwinSend_Buff_Size -15-strlenth]=BCD%2<<7|SymNum%2<<6|Dis0%2<<5|NDis%2<<4|Size;      //显示数字模式指令   
	
	
	DWINSend_Buff[DwinSend_Buff_Size -14-strlenth]=Color>>8;           //数字颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -13-strlenth]=Color&0xFF;         //数字颜色低8位
	
	DWINSend_Buff[DwinSend_Buff_Size -12-strlenth]=Bcolor>>8;          //填充字符背景颜色高8位	
	DWINSend_Buff[DwinSend_Buff_Size -11-strlenth]=Bcolor&0xFF;        //填充字符背景颜色低8位
	
	if(Num_I<=20&Num_F<=20&Num_I+Num_F<=20)                            //Num_I+Num_F 之和不能超过 20
	{
		DWINSend_Buff[DwinSend_Buff_Size -10-strlenth]=Num_I;            //显示的整数位数,0x01-0x14(1-20)。
	  DWINSend_Buff[DwinSend_Buff_Size -9-strlenth]=Num_F;             //显示的小数位数,0x00-0x14(1-20)。
	}
	else
	{
		DWINSend_Buff[DwinSend_Buff_Size -10-strlenth]=1;                //显示的整数位数超出规定默认显示1位
	  DWINSend_Buff[DwinSend_Buff_Size -9-strlenth]=0;                 //显示的小数位数超出规定默认不显示
	}
	DWINSend_Buff[DwinSend_Buff_Size -8-strlenth]=Xs>>8;               //数字Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7-strlenth]=Xs&0xFF;             //数字Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -6-strlenth]=Ys>>8;               //数字Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5-strlenth]=Ys&0xFF;             //数字Ys坐标低八位

	DWINSend_Buff[DwinSend_Buff_Size -strlenth-4]= XNum>>24;           //数字高
	DWINSend_Buff[DwinSend_Buff_Size -strlenth-3]= XNum>>16&0xff;      //数字高
	DWINSend_Buff[DwinSend_Buff_Size -strlenth-2]= XNum>>8&0xff;       //数字低
	DWINSend_Buff[DwinSend_Buff_Size -strlenth-1]= XNum&0xFF;          //数字低
	
	Send_Data(DWINSend_Buff);                                          //发送数据
}

//____________________________显示二维码________________________________\\
//QR_Pixel:  二维码每个点占用像素点大小:0x01-0x0F(1-16)
//(Nx,Ny):  二维码显示的左上角坐标
//str:      多位数据 
/**************二维码大小为(46*QR_Pixel)*(46*QR_Pixle)点阵************/
void DWINLCD_QR_Code(uint8_t QR_Pixel,uint16_t Xs,uint16_t Ys,char*str)	    //显示二维码
{
	uint16_t strlenth;
	int i;
	strlenth=strlen((const char*)str);
	DwinSend_Buff_Size=11+strlenth;                       //指令数据长度为15+strlenth(帧头+指令+Mode+数据+帧尾)
	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -10-strlenth]=0x21;               //显示二维码指令
 
  DWINSend_Buff[DwinSend_Buff_Size -9-strlenth]=Xs>>8;               //二维码Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -8-strlenth]=Xs&0xFF;             //二维码Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -7-strlenth]=Ys>>8;               //二维码Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -6-strlenth]=Ys&0xFF;             //二维码Ys坐标低八位
	
if(QR_Pixel<=6)                                                      //根据实际屏幕大小设置上限像素点 
  DWINSend_Buff[DwinSend_Buff_Size -5-strlenth]=QR_Pixel;            //二维码像素点大小
 else
	DWINSend_Buff[DwinSend_Buff_Size -5-strlenth]=0x01;                //二维码像素点大小超出默认为1
 
	for(i=strlenth;i>0;i--)
	{		DWINSend_Buff[DwinSend_Buff_Size -4-i]=*(str++); }             //二维码内容显示	

	Send_Data(DWINSend_Buff);                                          //发送数据
	
}

//____________________________显示图片________________________________\\

/****JPEG 图片显示;480*272 分辨率 4:1:1 格式压缩处理时间为 250mS。****/
//JPEG_ID:   0x00-0x0F,对应 JPEG 存储的图片起始 ID。
void DWINLCD_JPEG_Display(uint16_t JPEG_ID)	                //显示图片
{
	
	DwinSend_Buff_Size=8;                                 //指令数据长度为8(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -7]=0x22;            //显示图片指令
	
  DWINSend_Buff[DwinSend_Buff_Size -6]=JPEG_ID>>8;      //
	DWINSend_Buff[DwinSend_Buff_Size -5]=JPEG_ID&0xFF;

	Send_Data(DWINSend_Buff);                             //发送数据
	delay_ms(300);                                        //等待屏幕处理时间
}

//____________________________显示方向调整________________________________\\
//Dis_CFG :  0x00=0   度,   不旋转。       0x01=90  度旋转。
//            0x02=180 度, 视角翻转。       0x03=270 度旋转。
void DWINLCD_Display_Dir(uint8_t Dis_CFG)								    //设置屏幕显示方向
{
		
	DwinSend_Buff_Size=9;                                 //指令数据长度为9(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -8]=0x34;            //屏幕显示方向调整指令
	DWINSend_Buff[DwinSend_Buff_Size -7]=0x5A;            
	DWINSend_Buff[DwinSend_Buff_Size -6]=0xA5;            
	
  DWINSend_Buff[DwinSend_Buff_Size -5]=Dis_CFG%4;       //屏幕显示方向调整指令
	
	Send_Data(DWINSend_Buff);                             //发送数据
}

//____________________________设置扩展串口波特率________________________________\\

/********上电默认值是 0x0088 ,对应 115200bps 波特率。***************************/

void  DWINLCDBode_Set(uint16_t Set)                          //调节扩展串口波特率
{
	
			
	DwinSend_Buff_Size=8;                                 //指令数据长度为8(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -7]=0x38;            //设置扩展串口波特率指令
	
	DWINSend_Buff[DwinSend_Buff_Size -6]=15667200/Set/256;            
	DWINSend_Buff[DwinSend_Buff_Size -5]=15667200/Set%256;            
	
	Send_Data(DWINSend_Buff);                             //发送数据
}

//____________________________画圆________________________________\\
//Color: 圆形颜色
//x0:    圆形圆心横坐标
//y0:    圆形圆心纵坐标
//r:     圆形半径

void DWINLCD_Draw_Circle(uint16_t Color,uint16_t x0,uint16_t y0,uint8_t r)			   //画圆
{
	int a,b;
	a=0;	  
	while(a<=b)
	{
		b=sqrt(r*r-a*a);
		while(a==0){ b=b-1;break;}
		DWINLCD_DrawPoint(Color,1,1,x0+a,y0+b);		               //画点扇区1	
		DWINLCD_DrawPoint(Color,1,1,x0+b,y0+a);		               //画点扇区2
		DWINLCD_DrawPoint(Color,1,1,x0+b,y0-a);		               //画点扇区3	
		DWINLCD_DrawPoint(Color,1,1,x0+a,y0-b);		               //画点扇区4
			
		DWINLCD_DrawPoint(Color,1,1,x0-a,y0-b);		              //画点扇区5			
		DWINLCD_DrawPoint(Color,1,1,x0-b,y0-a);		              //画点扇区6
		DWINLCD_DrawPoint(Color,1,1,x0-b,y0+a);		              //画点扇区7	
		DWINLCD_DrawPoint(Color,1,1,x0-a,y0+b);		              //画点扇区8	
		a++;   					    
	}
}


//____________________________圆型填充________________________________\\
//FColor: 圆形填充颜色
//x0:     圆形圆心横坐标
//y0:     圆形圆心纵坐标
//r:      圆形半径

void DWINLCD_CircleFill(uint16_t FColor,uint16_t x0,uint16_t y0,uint8_t r)			   //圆型填充
{
	int a,b;

for(;r>0;r--)  
	{  a=0;	
		while(a<=b)
		{
			b=sqrt(r*r-a*a);
			while(a==0){ b=b-1;break;}
			DWINLCD_DrawPoint(FColor,2,2,x0+a,y0+b);		               //画点扇区1	
			DWINLCD_DrawPoint(FColor,2,2,x0+b,y0+a);		               //画点扇区2
			DWINLCD_DrawPoint(FColor,2,2,x0+b,y0-a);		               //画点扇区3	
			DWINLCD_DrawPoint(FColor,2,2,x0+a,y0-b);		               //画点扇区4
				
			DWINLCD_DrawPoint(FColor,2,2,x0-a,y0-b);		               //画点扇区5			
			DWINLCD_DrawPoint(FColor,2,2,x0-b,y0-a);		               //画点扇区6
			DWINLCD_DrawPoint(FColor,2,2,x0-b,y0+a);		               //画点扇区7	
			DWINLCD_DrawPoint(FColor,2,2,x0-a,y0+b);		               //画点扇区8	
			a=a+2;   					    
		}
  }
}
//____________________________显示ICO图标________________________________\\
//(Xs,Ys): 图标显示的左上角坐标。
//图标背景显示IBD: 0=背景滤除不显示, 1=背景显示        \\设置背景滤除不显示时,背景必须为纯黑色//
//背景图片恢复BIR: 0=背景图片不恢复 ,1=自动使用        \\0#虚拟显示区图片做背景恢复//
//背景滤除强度BFI: 0=普通,1=增强                       \\(仅当图标背景显示=0时有效)//
//图标库存储位置ISI: 0X00-0X0F
//Icon_IDs:  需要显示的图标ID,1个ID用1个Byte表示, 0x00-0xFF
void DWINLCD_ICO_Display(uint16_t Xs, uint16_t Ys,uint8_t IBD,uint8_t BIR,uint8_t BFI,uint8_t ISI,uint8_t Icon_IDs)	     //显示图标
{
	
	DwinSend_Buff_Size=12;                                //指令数据长度为8(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -11]=0x23;            //显示图标令
	
	DWINSend_Buff[DwinSend_Buff_Size -10]=Xs>>8;               //二维码Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -9]=Xs&0xFF;             //二维码Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -8]=Ys>>8;               //二维码Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -7]=Ys&0xFF;             //二维码Ys坐标低八位
  DWINSend_Buff[DwinSend_Buff_Size -6]=IBD%2<<7|BIR%2<<6|BFI%2<<5|ISI;      //二维码Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=Icon_IDs;

	Send_Data(DWINSend_Buff);                             //发送数据
}

//____________________________ICO图标动画play________________________________\\
//(Xs,Ys): 图标显示的左上角坐标。
//开关控制SC:1=本组动画开启          0=本组动画关闭;         可由 0x29 指令控制
//启动模式LM:1=启动从起始图标开始    0=启动从上次停止位置开始
//本组动画是第几组动画:本组动画图标指令位置,0x00-0x0F,一共有 16 组动画指令。
//Icon_lib:  图标库存储位置,0x00-0x0F。
//Icon_IDs:  动画起始图标位置,0x00-0xFF。
//Icon_IDe:  动画终止图标位置,0x00-0xFF。
//Delay_time:动画图标显示时间间隔,0x00-0xFF,单位 10mS。
void DWINLCD_ICOplay(uint16_t Xs, uint16_t Ys,uint8_t SC,uint8_t LM,uint8_t IconID,uint8_t Icon_lib,uint8_t Icon_IDs,uint8_t Icon_IDe,uint8_t Delay_time)	     //ICO图标动画play
{
	
	DwinSend_Buff_Size=15;                                //指令数据长度为8(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                          //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -14]=0x28;            //显示图标令
	
	DWINSend_Buff[DwinSend_Buff_Size -13]=Xs>>8;              //ICO_Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -12]=Xs&0xFF;             //ICO_Xs坐标低八位
	DWINSend_Buff[DwinSend_Buff_Size -11]=Ys>>8;               //ICO_Ys坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -10]=Ys&0xFF;             //ICO_Ys坐标低八位
	
  DWINSend_Buff[DwinSend_Buff_Size -9]=SC%2<<7|LM%2<<6|IconID;      //二维码Xs坐标高八位
	
	DWINSend_Buff[DwinSend_Buff_Size -8]=Icon_lib;
	DWINSend_Buff[DwinSend_Buff_Size -7]=Icon_IDs;
  DWINSend_Buff[DwinSend_Buff_Size -6]=Icon_IDe;
	
	 DWINSend_Buff[DwinSend_Buff_Size -5]=Delay_time;
	
	Send_Data(DWINSend_Buff);                             //发送数据
}
//____________________________ICO图标动画自动显示指令控制________________________________\\
//Cartoon_Set:ICON 动画指令开关控制;
//on_off:  每个 bit 对应一组指令,1=开启on,0=关闭off;
//.15 对应第 15 组动画指令, .0 对应第 0 组动画指令。
//举例:AA 29 00 05 CC 33 C3 3C 开启第 0 组、第 2 组动画指令。
void DWINLCD_Cartoon_Set(uint8_t Cartoon_Set,uint8_t on_off)	     //ICO图标动画play
{
	
	DwinSend_Buff_Size=8;                                //指令数据长度为8(帧头+指令+Mode+数据+帧尾)	
	Data_init();                                         //重新更新数组
		
	DWINSend_Buff[DwinSend_Buff_Size -7]=0x29;            //ICO图标动画自动显示指令控制
	
	DWINSend_Buff[DwinSend_Buff_Size -6]=(on_off<<(Cartoon_Set-1))>>8;           //ICO_Xs坐标高八位
	DWINSend_Buff[DwinSend_Buff_Size -5]=(on_off<<(Cartoon_Set-1))&0xFF;         //ICO_Xs坐标低八位
  	
	Send_Data(DWINSend_Buff);                             //发送数据
}






































你可能感兴趣的:(STM32,串口通信,keil,mdk)