- #include "lcd.h"
- #include "stdlib.h"
- #include "font.h"
- #include "usart.h"
- #include "delay.h"
- #include "ltdc.h"
- /** \addtogroup lcd_group 液晶显示模块 */
- /*@{*/
- //LCD的画笔颜色和背景色
- uint32_t PointColor=DEFAULT_POINT_COLOR; //画笔颜色
- uint32_t BackColor =DEFAULT_BACK_COLOR; //背景色
- //管理LCD重要参数
- //默认为竖屏
- _lcd_dev lcddev;
- /**
- * \brief 函数功能:写寄存器函数
- *
- * \param[in] regval:寄存器值
- *
- * \return
- *
- */
- void LCD_WR_REG(vuint16_t regval)
- {
- regval=regval; //使用-O2优化的时候,必须插入的延时
- LCD->LCD_REG=regval;//写入要写的寄存器序号
- }
- /**
- * \brief 函数功能:写LCD数据
- *
- * \param[in] data:要写入的值
- *
- * \return
- *
- */
- void LCD_WR_DATA(vuint16_t data)
- {
- data=data; //使用-O2优化的时候,必须插入的延时
- LCD->LCD_RAM=data;
- }
- /**
- * \brief 函数功能:读LCD数据
- *
- * \param[in]
- *
- * \return 读到的值
- *
- */
- uint16_t LCD_RD_DATA(void)
- {
- vuint16_t ram; //防止被优化
- ram=LCD->LCD_RAM;
- return ram;
- }
- /**
- * \brief 函数功能:写寄存器
- *
- * \param[in] LCD_Reg:寄存器地址
- * LCD_RegValue:要写入的数据
- * \return
- *
- */
- void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
- {
- LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号
- LCD->LCD_RAM = LCD_RegValue;//写入数据
- }
- /**
- * \brief 函数功能:读寄存器
- *
- * \param[in] LCD_Reg:寄存器地址
- *
- * \return 读到的数据
- *
- */
- uint16_t LCD_ReadReg(uint16_t LCD_Reg)
- {
- LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号
- delay_us(5);
- return LCD_RD_DATA(); //返回读到的值
- }
- /**
- * \brief 函数功能:开始写GRAM
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_WriteRAM_Prepare(void)
- {
- LCD->LCD_REG=lcddev.wramcmd;
- }
- /**
- * \brief 函数功能:LCD写GRAM
- *
- * \param[in] RGB_Code:颜色值
- *
- * \return
- *
- */
- void LCD_WriteRAM(uint16_t RGB_Code)
- {
- LCD->LCD_RAM = RGB_Code;//写十六位GRAM
- }
- /**
- * \brief 函数功能:当mdk -O1时间优化时需要设置
- *
- * \param[in] i:延时
- *
- * \return
- *
- */
- void opt_delay(uint8_t i)
- {
- while(i--);
- }
- /**
- * \brief 函数功能:读取个某点的颜色值
- *
- * \param[in] x,y:坐标
- *
- * \return 此点的颜色
- *
- */
- uint32_t LCD_ReadPoint(uint16_t x,uint16_t y)
- {
- if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回
-
- return LTDC_Read_Point(x,y);
- }
- /**
- * \brief 函数功能:LCD开启显示
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_DisplayOn(void)
- {
- LTDC_Switch(1);//开启LCD
- }
- /**
- * \brief 函数功能:LCD关闭显示
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_DisplayOff(void)
- {
- LTDC_Switch(0);//关闭LCD
- }
- /**
- * \brief 函数功能:点亮LCD背光
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_BlackLightOn(void)
- {
- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
- }
- /**
- * \brief 函数功能:熄灭LCD背光
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_BlackLightOff(void)
- {
- HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);
- }
- /**
- * \brief 函数功能:画点
- *
- * \param[in] x,y:坐标
- * PointColor:此点的颜色
- * \return
- *
- */
- void LCD_DrawPoint(uint16_t x,uint16_t y)
- {
- LTDC_Draw_Point(x,y,PointColor);
- }
- /**
- * \brief 函数功能:快速画点
- *
- * \param[in] x,y:坐标
- * color:颜色
- * \return
- *
- */
- void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint32_t color)
- {
- LTDC_Draw_Point(x,y,color);
- return;
- }
- /**
- * \brief 函数功能:设置LCD显示方向
- *
- * \param[in] dir:0,竖屏;1,横屏
- *
- * \return
- *
- */
- void LCD_Display_Dir(uint8_t dir)
- {
- LTDC_Display_Dir(dir);
- return;
- }
- /**
- * \brief 函数功能:初始化lcd
- *
- * \param[in]
- *
- * \return
- *
- */
- void LCD_Init(void)
- {
- LTDC_Init(); //初始化LTDC
- }
- /**
- * \brief 函数功能:清屏函数
- *
- * \param[in] color:要清屏的填充色
- *
- * \return
- *
- */
- void LCD_Clear(uint32_t color)
- {
- LTDC_Clear(color);
- delay_ms(5); //清屏以后不延时会导致LCD刷新次数多以后显示不全
- }
- /**
- * \brief 函数功能:在指定区域内填充单个颜色
- *
- * \param[in] (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
- * color:要填充的颜色
- * \return
- *
- */
- void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color)
- {
- LTDC_Fill(sx,sy,ex,ey,color);
- delay_ms(5); //填充以后不延时会导致LCD刷新次数多以后显示不全
- }
- /**
- * \brief 函数功能:在指定区域内填充指定颜色块
- *
- * \param[in] (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
- * color:要填充的颜色
- * \return
- *
- */
- void LCD_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color)
- {
- LTDC_Color_Fill(sx,sy,ex,ey,color);
- }
- /**
- * \brief 函数功能:画线
- *
- * \param[in] x1,y1:起点坐标
- * x2,y2:终点坐标
- * \return
- *
- */
- void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
- {
- uint16_t t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,incy,uRow,uCol;
- delta_x=x2-x1; //计算坐标增量
- delta_y=y2-y1;
- uRow=x1;
- uCol=y1;
- if(delta_x>0)incx=1; //设置单步方向
- else if(delta_x==0)incx=0;//垂直线
- else {incx=-1;delta_x=-delta_x;}
- if(delta_y>0)incy=1;
- else if(delta_y==0)incy=0;//水平线
- else{incy=-1;delta_y=-delta_y;}
- if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
- else distance=delta_y;
- for(t=0;t<=distance+1;t++ )//画线输出
- {
- LCD_DrawPoint(uRow,uCol);//画点
- xerr+=delta_x ;
- yerr+=delta_y ;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
- /**
- * \brief 函数功能:画矩形
- *
- * \param[in] (x1,y1),(x2,y2):矩形的对角坐标
- *
- * \return
- *
- */
- void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
- {
- LCD_DrawLine(x1,y1,x2,y1);
- LCD_DrawLine(x1,y1,x1,y2);
- LCD_DrawLine(x1,y2,x2,y2);
- LCD_DrawLine(x2,y1,x2,y2);
- }
- /**
- * \brief 函数功能 : 画矩形复选框
- *
- * \param[in] (x1,y1),(x2,y2):复选框的对角坐标
- *
- * \return 无
- */
- void LCD_DrawCheckBox(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
- {
- LCD_DrawRectangle(x1,y1,x2,y2);
- LCD_DrawRectangle(x1+1,y1+1,x2-1,y2-1);
- }
- /**
- * \brief 函数功能 : 填充矩形复选框
- *
- * \param[in] (x1,y1),(x2,y2):复选框的对角坐标
- *
- * \return 无
- */
- void LCD_FillCheckBox(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint32_t color)
- {
- LCD_Fill(x1+2,y1+2,x2-2,y2-2,color);
- PointColor = DEFAULT_POINT_COLOR;//恢复默认画笔颜色
- }
- /**
- * \brief 函数功能 : 画实心三角形
- *
- * \param[in] (x1,y1),(x2,y2):填充区域
- * x,y :三角形坐标
- *
- * \return 无
- */
- void LCD_DrawTriangle(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t x,uint16_t y)
- {
- LCD_Fill(x1,y1,x2,y2,BackColor);
-
- LCD_DrawLine(x, y-10,x , y+10);
- LCD_DrawLine(x+1, y-9, x+1, y+9);
- LCD_DrawLine(x+2, y-8, x+2, y+8);
- LCD_DrawLine(x+3, y-7, x+3, y+7);
- LCD_DrawLine(x+4, y-6, x+4, y+6);
- LCD_DrawLine(x+5, y-5, x+5, y+5);
- LCD_DrawLine(x+6, y-4, x+6, y+4);
- LCD_DrawLine(x+7, y-3, x+7, y+3);
- LCD_DrawLine(x+8, y-2, x+8, y+2);
- LCD_DrawLine(x+9, y-1, x+9, y+1);
- LCD_DrawLine(x+10,y , x+10,y );
- }
- /**
- * \brief 函数功能 : 画反向实心三角形
- *
- * \param[in] (x1,y1),(x2,y2):填充区域
- * x,y :三角形坐标
- *
- * \return 无
- */
- void LCD_DrawTriangleRE(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t x,uint16_t y)
- {
- LCD_Fill(x1,y1,x2,y2,BackColor);
-
- LCD_DrawLine(x, y-10,x , y+10);
- LCD_DrawLine(x-1, y-9, x-1, y+9);
- LCD_DrawLine(x-2, y-8, x-2, y+8);
- LCD_DrawLine(x-3, y-7, x-3, y+7);
- LCD_DrawLine(x-4, y-6, x-4, y+6);
- LCD_DrawLine(x-5, y-5, x-5, y+5);
- LCD_DrawLine(x-6, y-4, x-6, y+4);
- LCD_DrawLine(x-7, y-3, x-7, y+3);
- LCD_DrawLine(x-8, y-2, x-8, y+2);
- LCD_DrawLine(x-9, y-1, x-9, y+1);
- LCD_DrawLine(x-10,y , x-10,y );
- }
- /**
- * \brief 函数功能 : 画柱状图
- * 这个柱状图高度为固定的280像素,8个刻度,刻度没有数值标识
- * \param[in] x,y 柱状图坐标,这个坐标是柱状图矩形方框左上角的坐标
- * w 柱状图宽度
- *
- * \return 无
- */
- void LCD_DrawHistogram(uint16_t x,uint16_t y,uint16_t w)
- {
- LCD_DrawLine(x,y,x+w,y);
- LCD_DrawLine(x,y,x,y+280);
- LCD_DrawLine(x+w,y,x+w,y+280);
- LCD_DrawLine(x,y+280,x+w,y+280);
-
- LCD_DrawLine(x-10,y,x-2,y);
- LCD_DrawLine(x-6 ,y+35,x-2,y+35);
- LCD_DrawLine(x-10,y+70,x-2,y+70);
- LCD_DrawLine(x-6,y+105,x-2,y+105);
- LCD_DrawLine(x-10,y+140,x-2,y+140);
- LCD_DrawLine(x-6,y+175,x-2,y+175);
- LCD_DrawLine(x-10,y+210,x-2,y+210);
- LCD_DrawLine(x-6,y+245,x-2,y+245);
- LCD_DrawLine(x-10,y+280,x-2,y+280);
-
- LCD_DrawLine(x-2,y,x-2,y+280);
- }
- /**
- * \brief 函数功能 : 填充柱状图
- * 这个柱状图高度为固定的280像素
- * \param[in] x,y 柱状图坐标,这个坐标是柱状图矩形方框左上角的坐标
- * w 柱状图宽度
- * value 柱状图显示数值
- * range 柱状图量程
- *
- * \return 无
- */
- void LCD_FillHistogram(uint16_t x,uint16_t y,uint16_t w,uint16_t value,uint16_t range)
- {
- LCD_Fill(x+1,y+1,x+w-1,y-1+((range-value)*279)/range,BLACK);
- LCD_Fill(x+1,y+((range-value)*279)/range,x+w-1,y+279,YELLOW);
- }
- /**
- * \brief 函数功能 : 画柱状图上限
- * 这个柱状图高度为固定的280像素
- * \param[in] x,y 柱状图坐标,这个坐标是柱状图矩形方框左上角的坐标
- * w 柱状图宽度
- * limit 柱状图上限值
- * range 柱状图量程
- *
- * \return 无
- */
- void LCD_DrawHistogramLimit(uint16_t x,uint16_t y,uint16_t w,uint16_t limit,uint16_t range)
- {
- LCD_Fill(x+w+2,y,x+w+2,y-1+((range-limit)*279)/range,RED);
- LCD_Fill(x+w+2,y+((range-limit)*279)/range,x+w+2,y+279,BLACK);
- }
- /**
- * \brief 函数功能:在指定位置画一个指定大小的圆
- *
- * \param[in] (x,y):中心点
- * r :半径
- * \return
- *
- */
- void LCD_Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r)
- {
- int a,b;
- int di;
- a=0;b=r;
- di=3-(r<<1); //判断下个点位置的标志
- while(a<=b)
- {
- LCD_DrawPoint(x0+a,y0-b); //5
- LCD_DrawPoint(x0+b,y0-a); //0
- LCD_DrawPoint(x0+b,y0+a); //4
- LCD_DrawPoint(x0+a,y0+b); //6
- LCD_DrawPoint(x0-a,y0+b); //1
- LCD_DrawPoint(x0-b,y0+a);
- LCD_DrawPoint(x0-a,y0-b); //2
- LCD_DrawPoint(x0-b,y0-a); //7
- a++;
- //使用Bresenham算法画圆
- if(di<0)di +=4*a+6;
- else
- {
- di+=10+4*(a-b);
- b--;
- }
- }
- }
- /**
- * \brief 函数功能:在指定位置显示一个字符
- *
- * \param[in] x,y:起始坐标
- * num:要显示的字符:" "--->"~"
- * size:字体大小 12/16/24/32
- * mode:叠加方式(1)还是非叠加方式(0)
- * \return
- *
- */
- void LCD_ShowChar(uint16_t x,uint16_t y,char num,uint8_t size,uint8_t mode)
- {
- uint8_t temp,t1,t;
- uint16_t y0=y;
- uint8_t csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
- num=num-' ';//得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库)
- for(t=0;t<csize;t++)
- {
- if(size==12)temp=asc2_1206[num][t]; //调用1206字体
- else if(size==16)temp=asc2_1608[num][t]; //调用1608字体
- else if(size==24)temp=asc2_2412[num][t]; //调用2412字体
- else if(size==32)temp=asc2_3216[num][t]; //调用3216字体
- else return; //没有的字库
- for(t1=0;t1<8;t1++)
- {
- if(temp&0x80)LCD_Fast_DrawPoint(x,y,PointColor);
- else if(mode==0)LCD_Fast_DrawPoint(x,y,BackColor);
- temp<<=1;
- y++;
- if(y>=lcddev.height)return; //超区域了
- if((y-y0)==size)
- {
- y=y0;
- x++;
- if(x>=lcddev.width)return; //超区域了
- break;
- }
- }
- }
- }
- /**
- * \brief 浮点数转换至ASC2(右对齐)
- * 把浮点数值转化为ASC2码,小数点后最多2位,转换后数值长度为8,没有数值的部分是空格
- * 超过部分将被忽略,数值字符为ASCII字符。
- * 转换后的字符为右对齐
- *
- * \param[in] value 需要转化的数值 转换数值0~99999
- * \param[in] dot 小数点后位数 小数点最大为2
- * \return 转换后的字符串指针
- */
- char* FloatAsc2Right(float value, uint8_t dot)
- {
- float temp_val, compensate;
- uint16_t n, int_num, int_temp;
- uint8_t i,j,k;
- static char temp_char[9] = {0};
- temp_char[8] = 0; //字符串结尾,字符串输出函数需要检测字符串结尾,如果没有这个会导致字符串输出的时候多一位
- i = 2 - dot; //根据小数点数移位
- compensate = 0.51;
-
- for(j = 0;j < 8;j++) //初始化字符串数组,static变量如果不赋值就会保留原来的值
- {
- temp_char[j] = ' ';
- }
-
- for(k = 0; k < dot; k++) //根据小数点位数加数值起到四舍五入的作用
- {
- compensate = compensate / 10;
- }
-
- temp_val = value + compensate; //由于浮点数运算问题需要加个数
- int_num = (uint16_t)temp_val;
- int_temp = int_num;
- if(dot == 0)
- {
- i++;
- }
-
- n = 10000;
- if(int_num == 0)
- {
- i = i+4;
- }else
- {
- while(n > 0)
- {
- if(int_num >= n)
- {
- temp_char[i] = (char)(int_temp / n) + 48;
- int_temp = int_temp % n;
- }
- i += 1;
- n /= 10;
- }
- }
- if(temp_val < 1)
- {
- temp_char[i] = 48;
- i +=1;
- }
- int_temp = (uint16_t)((temp_val - int_num) * 10000);
- if(dot > 0)
- {
- temp_char[i] = 46;
- i += 1;
- temp_char[i] = (char)(int_temp / 1000) + 48;
- i += 1;
- }
- if(dot > 1)
- {
- int_temp = int_temp % 1000;
- temp_char[i] = (char)(int_temp / 100) + 48;
- i += 1;
- }
-
- return temp_char;
- }
- /**
- * \brief 浮点数转换至ASC2(左对齐)
- * 把浮点数值转化为ASC2码,小数点后最多2位
- * 超过部分将被忽略,数值字符为ASCII字符。
- * 转换后的字符为右对齐
- *
- * \param[in] value 需要转化的数值 转换数值0~99999
- * \param[in] dot 小数点后位数 小数点最大为2
- * \return 转换后的字符串指针
- */
- char* FloatAsc2Left(float value, uint8_t dot)
- {
- float temp_val, compensate;
- uint16_t n, int_num, int_temp;
- uint8_t i,j,k;
- static char temp_char[8] = {0};
- i = 0;
- compensate = 0.51;
-
- for(j = 0;j < 8;j++) //初始化字符串数组,static变量如果不赋值就会保留原来的值
- {
- temp_char[j] = 0;
- }
-
- for(k = 0; k < dot; k++) //根据小数点位数加数值起到四舍五入的作用
- {
- compensate = compensate / 10;
- }
-
- temp_val = value + compensate; //由于浮点数运算问题需要加个数
- int_num = (uint16_t)temp_val;
- int_temp = int_num;
- n = 10000;
- while(n > 0)
- {
- if(int_num >= n)
- {
- temp_char[i] = (char)(int_temp / n) + 48;
- int_temp = int_temp % n;
- i += 1;
- }
- n /= 10;
- }
- if(temp_val < 1)
- {
- temp_char[i] = 48;
- i +=1;
- }
- int_temp = (uint16_t)((temp_val - int_num) * 10000);
- if(dot > 0)
- {
- temp_char[i] = 46;
- i += 1;
- temp_char[i] = (char)(int_temp / 1000) + 48;
- i += 1;
- }
- if(dot > 1)
- {
- int_temp = int_temp % 1000;
- temp_char[i] = (char)(int_temp / 100) + 48;
- i += 1;
- }
-
- return temp_char;
- }
- /**
- * \brief 函数功能:显示字符串
- *
- * \param[in] x,y:起点坐标
- * width,height:区域大小
- * size:字体大小
- * *p:字符串起始地址
- * \return
- *
- */
- void LCD_ShowString(uint16_t x,uint16_t y,uint16_t width,uint16_t height,uint8_t size,volatile char *p)
- {
- uint8_t x0=x;
- width+=x;
- height+=y;
- while((*p<='~')&&(*p>=' '))//判断是不是非法字符!
- {
- if(x>=width){x=x0;y+=size;}
- if(y>=height)break;//退出
- LCD_ShowChar(x,y,*p,size,0);
- x+=size/2;
- p++;
- }
- }
- /**
- * \brief 函数功能:显示一个指定大小的汉字
- * 显示24x24汉字,字体采用横向取模方式(即从左到右然后从上到下)
- * \param[in] x,y :汉字的坐标
- * size:字体大小
- * mode:0,正常显示,1,叠加显示
- * \return
- *
- */
- void LCD_ShowFont(uint16_t x,uint16_t y,uint8_t size,const volatile char *p,uint8_t mode)
- {
- uint16_t i=0,j=0,k=0;
- uint16_t num_font;
- uint16_t x0=x;
- if(size == 24)
- {
- num_font = sizeof(GB24_Code) / sizeof(typFNT_GB24); //计算字库中汉字个数
-
- for(i=0;i<num_font;i++)//在所有的汉字结构体数组中查找
- {
- if((*p==GB24_Code[i].Index[0]) && (*(p+1)==GB24_Code[i].Index[1]))//索引汉字成功
- {
- for(j=0;j<MSKNUM24;j++)//写入数据
- {
- unsigned short word=GB24_Code[i].Msk[j];
- for(k=0;k<8;k++)//循环8次移位
- {
- if(word&0x80)LCD_Fast_DrawPoint(x,y,PointColor);
- else if(mode==0)LCD_Fast_DrawPoint(x,y,BackColor);
- word<<=1;//往前移位
- x++;
- if((x-x0)==size)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- }else if(size == 32)
- {
- num_font = sizeof(GB32_Code) / sizeof(typFNT_GB32); //计算字库中汉字个数
-
- for(i=0;i<num_font;i++)//在所有的汉字结构体数组中查找
- {
- if((*p==GB32_Code[i].Index[0]) && (*(p+1)==GB32_Code[i].Index[1]))//索引汉字成功
- {
- for(j=0;j<MSKNUM32;j++)//写入数据
- {
- unsigned short word=GB32_Code[i].Msk[j];
- for(k=0;k<8;k++)//循环8次移位
- {
- if(word&0x80)LCD_Fast_DrawPoint(x,y,PointColor);
- else if(mode==0)LCD_Fast_DrawPoint(x,y,BackColor);
- word<<=1;//往前移位
- x++;
- if((x-x0)==size)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- }
- }else
- {
- ; //字体大小不合法
- }
- }
- /**
- * \brief 函数功能:显示一个单色位位图片
- *
- * \param[in] x,y :图片坐标
- * width,heigth :显示区域
- * data :图片数据
- * mode:0,正常显示,1,叠加显示
- * \return
- *
- */
- void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t width,uint16_t heigth, const uint8_t *data,uint8_t mode)
- {
- uint16_t i=0,j=0;
- uint16_t num_font;
- uint16_t x0=x;
-
- num_font = width * heigth / 8; //计算图片字节数
-
- for(i=0;i<num_font;i++)//在所有的汉字结构体数组中查找,i最大为结构体数组成员的个数
- {
- uint8_t word=data[i];
- for(j=0;j<8;j++)//循环8次移位
- {
- if(word&0x80)LCD_Fast_DrawPoint(x,y,WHITE);
- else if(mode==0)LCD_Fast_DrawPoint(x,y,BackColor);
- word<<=1;//往前移位
- x++;
- if((x-x0)==width)
- {
- x=x0;
- y++;
- break;
- }
- }
- }
- }
- /**
- * \brief 函数功能:在指定位置开始显示一个字符串
- * 支持自动换行
- * \param[in] (x,y):起始坐标
- * width,height:区域
- * str :字符串
- * size :字体大小
- * mode:0,非叠加方式;1,叠加方式
- * \return
- *
- */
- void LCD_ShowText(uint16_t x,uint16_t y,uint16_t width,uint16_t height,volatile char*str,uint8_t size,uint8_t mode)
- {
- while(*str!=0)//数据未结束
- {
- if((uint8_t)*str<0x81)//字符
- {
- LCD_ShowChar(x,y,*str,size,mode);//有效部分写入
- str++;
- x+=size/2; //字符,为全字的一半
- }
- else//中文
- {
- LCD_ShowFont(x,y,size,str,mode); //显示这个汉字,空心显示
- str+=2;
- x+=size;//下一个汉字偏移
- }
- }
- }
- /*@}*/
- LTDC.H
- ```c
- #ifndef _LCD_H
- #define _LCD_H
- #include "sys.h"
- //LCD LTDC重要参数集
- typedef struct
- {
- uint32_t pwidth; //LCD面板的宽度,固定参数,不随显示方向改变,如果为0,说明没有任何RGB屏接入
- uint32_t pheight; //LCD面板的高度,固定参数,不随显示方向改变
- uint16_t hsw; //水平同步宽度
- uint16_t vsw; //垂直同步宽度
- uint16_t hbp; //水平后廊
- uint16_t vbp; //垂直后廊
- uint16_t hfp; //水平前廊
- uint16_t vfp; //垂直前廊
- uint8_t activelayer; //当前层编号:0/1
- uint8_t dir; //0,竖屏;1,横屏;
- uint16_t width; //LCD宽度
- uint16_t height; //LCD高度
- uint32_t pixsize; //每个像素所占字节数
- }_ltdc_dev;
- extern _ltdc_dev lcdltdc; //管理LCD LTDC参数
- extern LTDC_HandleTypeDef LTDC_Handler; //LTDC句柄
- extern DMA2D_HandleTypeDef DMA2D_Handler; //DMA2D句柄
- #define LCD_PIXEL_FORMAT_ARGB8888 0X00
- #define LCD_PIXEL_FORMAT_RGB888 0X01
- #define LCD_PIXEL_FORMAT_RGB565 0X02
- #define LCD_PIXEL_FORMAT_ARGB1555 0X03
- #define LCD_PIXEL_FORMAT_ARGB4444 0X04
- #define LCD_PIXEL_FORMAT_L8 0X05
- #define LCD_PIXEL_FORMAT_AL44 0X06
- #define LCD_PIXEL_FORMAT_AL88 0X07
- ///
- //用户修改配置部分:
- //定义颜色像素格式,一般用RGB565
- #define LCD_PIXFORMAT LCD_PIXEL_FORMAT_RGB565
- //定义默认背景层颜色
- #define LTDC_BACKLAYERCOLOR BLACK
- //LCD帧缓冲区首地址,这里定义在SDRAM里面.
- #define LCD_FRAME_BUF_ADDR 0XC0000000
- void LTDC_Switch(uint8_t sw); //LTDC开关
- void LTDC_Layer_Switch(uint8_t layerx,uint8_t sw); //层开关
- void LTDC_Select_Layer(uint8_t layerx); //层选择
- void LTDC_Display_Dir(uint8_t dir); //显示方向控制
- void LTDC_Draw_Point(uint16_t x,uint16_t y,uint32_t color);//画点函数
- uint32_t LTDC_Read_Point(uint16_t x,uint16_t y); //读点函数
- void LTDC_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color); //矩形单色填充函数
- void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t *color); //矩形彩色填充函数
- void LTDC_Clear(uint32_t color); //清屏函数
- uint8_t LTDC_Clk_Set(uint32_t pllsain,uint32_t pllsair,uint32_t pllsaidivr);//LTDC时钟配置
- void LTDC_Layer_Window_Config(uint8_t layerx,uint16_t sx,uint16_t sy,uint16_t width,uint16_t height);//LTDC层窗口设置
- void LTDC_Layer_Parameter_Config(uint8_t layerx,uint32_t bufaddr,uint8_t pixformat,uint8_t alpha,uint8_t alpha0,uint8_t bfac1,uint8_t bfac2,uint32_t bkcolor);//LTDC基本参数设置
- uint16_t LTDC_PanelID_Read(void); //LCD ID读取函数
- void LTDC_Init(void); //LTDC初始化函数