未分类 · 2022年10月27日

蓝桥杯嵌入式单片机显示图像

蓝桥杯嵌入式资料下载地址点击进入
教程资料下载:
链接:https://pan.baidu.com/s/1vXk8Ep9ZXpEYdwWNZRkE2g 提取码:f123


一、起因

最近学习蓝桥杯单片机,由于库都是官方提供的LCD是液晶显示器,可以显示字符(包括汉字)、图片等,是嵌入式比较常用的模块,也是比赛必考的模块。因为LCD的功能很强大,所以LCD包含的函数也是非常多的。不过蓝桥杯嵌入式对LCD的考核降低了很多,所用到的函数不多,而且也不用自己编写任何有关的函数,只需能够熟练的调用常用的函数即可。蓝桥杯的屏幕是彩色的,但是却只提供了显示颜色,和文字的相关函数,没提供屏幕显示图像的例程,于是就编写了这个显示图像的库


这里我们使用VScode编程,基于EIDE进行编写程序

关于蓝桥杯嵌入式开发板的使用,入门教程有很多,这里就不再赘述

蓝桥杯嵌入式HAL库入门教程——》教程

蓝桥杯嵌入式LCD使用——》笔记

- 相关API

1、LCD初始化函数(比赛给的例程中有)

STM3210B_LCD_Init();

2、LCD字符显示的颜色选择

LCD_SetTextColor();

其中参数可以为White、Black、Grey、Blue、Blue2、Red、Magenta、Green、Cyan、Yellow。定义在lcd.h中的第135行。

3、LCD背景颜色选择

LCD_SetBackColor();

参数同上。

4、LCD清屏颜色选择

LCD_Clear();

5、LCD字符串显示

LCD_DisplayStringLine(u8 Line, u8 *ptr);

第一个参数是选择行数,及在哪一行进行显示,第二个参数为显示的内容(以字符串表示)。例:

LCD_DisplayStringLine(Line4,"+  LCD_ASCII DEMO  +");

在第四行显示+ LCD_ASCII DEMO +。

第一个参数的全部取值为Line0、Line1、Line2、Line3、Line4、Line5、Line6、Line7、Line8、Line9。第二个参数为任意字符串,但是不能太长,不能显示变量的值,否则不能正常显示。

6、LCD清除某一行的内容

LCD_ClearLine(u8 Line);

参数的全部取值为Line0、Line1、Line2、Line3、Line4、Line5、Line6、Line7、Line8、Line9。将改行的内容全部清除,背景颜色为离刚执行最近的背景颜色选择函数。

7、用LCD显示变量的值

可以用sprintf函数将要显示的变量的值和字符串等组合在一起存放到某一连续的内存中,并设置其首地址的名字。例:

sprintf((char *)string,"%s%.3f","ADC Value:",a);
LCD_DisplayStringLine(Line7,string);

%s与后面ADC Value:的相对应,也可以将%s替换为ADC Value:。%.3f与后面a的的值相对应。保留小数点后3位,且a为实型。若要显示整型变量的值可以将%.3f替换为%d,加.3会占用几个字符位置。与C语言的显示函数printf类似。

注意该函数的使用需要头文件stdio.h。首地址的名字可以重复,但不建议这样做。首地址的名字要进行强制转换,使其符合函数形参的要求。首地址的名字要进行相应的定义,如:

uint8_t  string[20];

常见的LCD函数也就这么多。如果想知道其它的功能函数的话,可以打开lcd.h文件,里面有很多有关LCD显示的函数,

官方提供了显示图像的函数,但是提供的函数并不能正常显示图像,因此自己修改了一个

显示垂直格式图片

/*******************************************************************************
* Function Name  : LCD_ShowVerticalPicture
* Description    : 显示一个RGB565图片
* Input          : - picture: 图片数组,坐标 (P_y<320)
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_ShowVerticalPicture(const u8* picture,uint8_t P_x,uint8_t P_y)
{
    int index,flack=0;
    LCD_SetCursor(0x00, 0x0000); 

    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */

    for(index = 0; index < (P_x*P_y*2);index+=2)//76800; index++)
    {
            if(index%((P_y)*2)==0&&flack==1)
            {
                int i = 0;
                for(i=0;i<(320-P_y);i++)
                    LCD_WriteRAM((uint16_t)0xffff);
            }
            LCD_WriteRAM((picture[index+1]<<8)|picture[index]);
        flack = 1;
    }
}

显示水平格式图片

/*******************************************************************************
* Function Name  : LCD_ShowVerticalPicture
* Description    : 显示一个RGB565图片
* Input          : - picture: 图片数组,坐标 (P_y<320)
* Output         : None
* Return         : None
*******************************************************************************/
void LCD_ShowcrosswisePicture(const u8* picture,uint8_t P_x,uint8_t P_y)
{
    int index,flack=0;
    LCD_SetCursor(0x00, 0x0000); 

    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */

    for(index = 0; index < (P_x*P_y*2);index+=2)//76800; index++)
    {
        if(index%((P_x)*2)==0&&flack==1)
        {
            int i = 0;
            for(i=0;i<(320-P_x);i++)
                LCD_WriteRAM((uint16_t)0xffff);
        }
        LCD_WriteRAM((picture[index+1]<<8)|picture[index]);
        flack = 1;
    }
}

由于单片机的内存有限,新版的板子没有外置内存卡,只能写入小一点的图片

步骤

  1. 打开image2Lcd 图片取模软件
    打开我们的图片

    第一步 选择c语言数组
    第二步 选择水平扫描
    第三部 选择16位真彩色
    第四部 设置大小
    第五步 去掉图像头数据
    第六步 自己修改合适的参数
  2. 设置image2Lcd 图片输出格式

    选择TFT-LCD屏幕常用的16位色,位数选择RGB565格式,这个格式也是大多数TFT屏幕底层采用的图片位数通道。
  3. 保存图片数据

    点击保存按钮,选择官方的屏幕例程项目例程的inc目录中,命名pack_img.h
    一定是.h文件,这样我们才可以在main文件中调用
    4.打开工程

    打开我们的项目工程,把.h路径添加上,把烧入器配置好,这里我采用vscode,如果是keil也是一样的。
  4. 引用头文件

    把我们的代码加入工程,配置好初始化

    6.使用函数

    我们是通过水平的方式生成的图片,因此调用的是水平函数,其中有三个参数,第一个是图片数组的名字,这个是默认的名字,第二个和第三个是图片的大小,这个在img2Lcd软件右下角可以查看

    7.烧入程序,查看显示效果

    8.使用垂直显示图片


    这样我们就可以看到垂直的图片

有细心的小伙伴发现了,我们的图片没有显示全屏,这是因为全屏了数据太大了,数据量太大,没办法烧入单片机,所以用来小一个的图片

到此我们就完成了蓝桥杯单片机图片的显示功能。


2022-10-27 17:28:19 星期四