发 帖  
[经验]

【正点原子STM32H7R3开发套件试用体验】桌面化多传感器管理与控制

2024-12-8 15:00:50  2743 正点原子
0
jinglixixi 2024-12-22 13:25:34
回复

举报

jinglixixi 2024-12-22 17:27:49
22#
回复

举报

jinglixixi 2024-12-22 22:54:55
23#

桌面化管理的界面设计与实现:


为了便于对设计功能的管理,可仿照Windows系统式的桌面化管理。


在通常情况下,开发板是以竖屏的显示来使用。但这不太适合桌面化管理的显示,故需转化为横屏的方式来使用。


此时,可使用函数 lcd_display_dir(1)将屏幕转化为横屏的形式。


为增强直观性,这里也为各种功能制作了相应的图标,其尺寸规格为50*50像素点。


实现图标显示的函数为:


void show_tb(unsigned int x,unsigned int y,unsigned int n) //200*200
{  
        unsigned int i,j,k;
        unsigned int da;
        k=0;
        for(i=0;i<50;i++)
        {       
                for(j=0;j<50;j++)
                {
                        if(n==0) da=gImage_tb[k*2];
                        if(n==1) da=gImage_pwm[k*2];
                        if(n==2) da=gImage_rtc[k*2];
                        if(n==3) da=gImage_adc[k*2];
                        if(n==4) da=gImage_tft[k*2];
                        if(n==5) da=gImage_sz[k*2];
                        if(n==6) da=gImage_kz[k*2];
                        if(n==7) da=gImage_dht[k*2];
                        da<<=8;
                        if(n==0) da|=gImage_tb[k*2+1];
                        if(n==1) da|=gImage_pwm[k*2+1];
                        if(n==2) da|=gImage_rtc[k*2+1];
                        if(n==3) da|=gImage_adc[k*2+1];
                        if(n==4) da|=gImage_tft[k*2+1];
                        if(n==5) da|=gImage_sz[k*2+1];
                        if(n==6) da|=gImage_kz[k*2+1];
                        if(n==7) da|=gImage_dht[k*2+1];
                       lcd_draw_point(x-j, y+i, da);                       
                        k++;  
                }
        }
}

为进一步标识图标的功能,还配备了相应的文字注释,在选取功能时可以反显的显示来标识当前的选项。


在显示汉字本打算直接利用系统所提供的汉字显示功能,但意外的是由于图标占用了一定的存储空间,会导致超出编译的范围。为此,只好舍去这种方案,而自建了小字库并配置了对应的显示函数。


显示汉字的函数为:


void showhanzi16(unsigned int x,unsigned int y,unsigned char index)        
{  
        unsigned char i,j,k;
        const unsigned char *temp=hanzi16;   
        temp+=index*32;       
        unsigned char p;
        for(j=0;j<16;j++)
        {
                p=0;
                for(k=0;k<2;k++)
                {
                        for(i=0;i<8;i++)
                        {                      
                                 if((*temp&(1<0)
                                {
                                          lcd_draw_point(x+p, y+j, BACK_COLOR);
                                }
                                else
                                {
                                          lcd_draw_point(x+p, y+j, POINT_COLOR);
                                }
                                p=p+1;                               
                        }
                        temp++;
                }
         }
}

所构建的字库由工具软件来提取,其界面如图1所示,提取字模的方式见图2所示。
image.png


图1 软件界面
image.png


图2 提取方式


字库的存储形式为:


uint8_t hanzi16[]=
{
0x00,0x00,0xFE,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,
0x00,0x00,0xFF,0x7F,0x20,0x02,0x20,0x02,0xFE,0x3F,0x22,0x22,0x22,0x22,0x12,0x22,
0x0A,0x3C,0x06,0x20,0x02,0x20,0xFE,0x3F,0x02,0x20,0x02,0x20,0xFE,0x3F,0x02,0x20,
...
}

实现图标与文字标识显示的主程序为:


int main(void)
{
     uint8_t x = 0;
     uint8_t lcd_id[13];
     sys_mpu_config();
     sys_cache_enable();
     HAL_Init();
     sys_stm32_clock_init(300, 6, 2);
     delay_init(600);
     led_init();
     lcd_init();
     lcd_clear(WHITE);
     show_tb(75,20,0);
     show_tb(149,20,1);
     show_tb(223,20,2);
     show_tb(297,20,3);
     show_tb(75,140,7);
     show_tb(149,140,6);
     show_tb(223,140,5);
     show_tb(297,140,4);
     lcd_show_string(190, 80, 320, 16, 16, "RTC", RED);
     lcd_show_string(110, 80, 320, 16, 16, "PWM", RED);
     POINT_COLOR=RED;
     BACK_COLOR=WHITE;
     showhanzi16(34,80,3);
     showhanzi16(50,80,4);
     showhanzi16(256,80,1);
     showhanzi16(272,80,2);
     showhanzi16(34,200,5);
     showhanzi16(50,200,6);
     showhanzi16(110,200,7);
     showhanzi16(126,200,8);
     showhanzi16(186,200,9);
     showhanzi16(202,200,10);
     showhanzi16(260,200,11);
     showhanzi16(276,200,12);
     while (1);
}

经程序的编译与下载,其显示效果图3和图4所示。


image.png


图3 整体形式


image.png


图4 显示效果


后续再为其配置相应的功能选择处理功能,以便进行功能的调用。




回复

举报

jinglixixi 2024-12-23 22:57:58
24#

以按键进行功能选择:


前面以实现了一个桌面化管理的界面,那该如何来选取功能选项呢?

这里先设计了一个通过按键KEY1控制功能选取的程序,主程序为:


int main(void)
{
    uint8_t i;
    uint8_t j,k;
    uint8_t key;
    uint8_t x = 0;
    uint8_t lcd_id[13];
    sys_mpu_config();
    sys_cache_enable();
    HAL_Init();
    sys_stm32_clock_init(300, 6, 2);
    delay_init(600);
    led_init();
    lcd_init();
    key_init();
    lcd_clear(WHITE);
    show_tb(75,20,0);
    show_tb(149,20,1);
    show_tb(223,20,2);
    show_tb(297,20,3);       
    show_tb(75,140,7);
    show_tb(149,140,6);
    show_tb(223,140,5);
    show_tb(297,140,4);
    i=0;
    j=0;
    while (i<8)
    {
        switch (i)
        {
             case 0:
             {
                    POINT_COLOR=WHITE;
                    BACK_COLOR=RED;
                    showhanzi16(34+i*75,80+j*120,i*2+1);
                    showhanzi16(50+i*75,80+j*120,i*2+2);
                    POINT_COLOR=RED;
                    BACK_COLOR=WHITE;
                    break;
            }
            case 1:
            {
                    lcd_show_string(34+i*75, 80, 320, 16, 16, "PWM", RED);
                    break;
            }
            case 2:
            {
                    lcd_show_string(34+i*75, 80, 320, 16, 16, "RTC", RED);
                    break;
            }
            case 3:
            {
                     showhanzi16(34+i*75,80+j*120,i*2-3);
                     showhanzi16(50+i*75,80+j*120,i*2-2);
                     j=1;
                     break;
            }
            case 4:
            {
                     showhanzi16(34+(i-4)*75,80+j*120,i*2-3);
                     showhanzi16(50+(i-4)*75,80+j*120,i*2-2);
                     break;
            }
            case 5:
            {
                     showhanzi16(34+(i-4)*75,80+j*120,i*2-3);
                     showhanzi16(50+(i-4)*75,80+j*120,i*2-2);
                     break;
            }
            case 6:
            {
                     showhanzi16(34+(i-4)*75,80+j*120,i*2-3);
                     showhanzi16(50+(i-4)*75,80+j*120,i*2-2);
                     break;
            }
            case 7:
            {
                     showhanzi16(34+(i-4)*75,80+j*120,i*2-3);
                     showhanzi16(50+(i-4)*75,80+j*120,i*2-2);
                     break;
            }
          }
          i=i+1;
        }
               
        while (1)
        {
            key = key_scan(0);
            if (key == KEY1_PRES)
            {
                   i=(i+1)%8;
                     POINT_COLOR=WHITE;
                   BACK_COLOR=RED;
                   if(i==0)
                   {
                          showhanzi16(34,80,1);
                          showhanzi16(50,80,2);
                          POINT_COLOR=RED;
                          BACK_COLOR=WHITE;
                          showhanzi16(259,200,11);
                          showhanzi16(274,200,12);
               }
                                                 
               if(i==1)
               {
                         lcd_show_string(109, 80, 320, 16, 16, "PWM", BLUE );
                         POINT_COLOR=RED;
                         BACK_COLOR=WHITE;
                         showhanzi16(34,80,1);
                         showhanzi16(50,80,2);
              }
              if(i==2)
              {
                         lcd_show_string(184, 80, 320, 16, 16, "RTC", BLUE);
                         lcd_show_string(109, 80, 320, 16, 16, "PWM", RED);
              }
                                         
              if(i==3)
              {
                         showhanzi16(259,80,3);
                         showhanzi16(274,80,4);
                         lcd_show_string(184, 80, 320, 16, 16, "RTC", RED);
             }
             if(i==4)
             {
                          showhanzi16(34,200,5);
                          showhanzi16(50,200,6);
                          POINT_COLOR=RED;
                          BACK_COLOR=WHITE;
                          showhanzi16(259,80,3);
                          showhanzi16(274,80,4);
             }
             if(i==5)
             {
                           showhanzi16(109,200,7);
                           showhanzi16(125,200,8);
                           POINT_COLOR=RED;
                           BACK_COLOR=WHITE;                                                         
                           showhanzi16(34,200,5);
                           showhanzi16(50,200,6);
             }
             if(i==6)
             {
                            showhanzi16(184,200,9);
                            showhanzi16(200,200,10);
                            POINT_COLOR=RED;
                            BACK_COLOR=WHITE;       
                            showhanzi16(109,200,7);
                            showhanzi16(125,200,8);
             }
             if(i==7)
             {
                            showhanzi16(259,200,11);
                            showhanzi16(274,200,12);
                             POINT_COLOR=RED;
                             BACK_COLOR=WHITE;       
                            showhanzi16(184,200,9);
                            showhanzi16(200,200,10);
             }
         }
         delay_ms(200);
     }
}

经程序的编译与下载,其运行起始状态如图1所示。在KEY1按键的控制下,选取提示功能时如图2所示。

这样就实现与桌面化的形式来选取功能处理,后续的目标是利用显示屏的触摸功能以触摸图标的方式来进行功能选择。
image.png

图1 音乐选项


image.png

图2 提示选项



回复

举报

只有小组成员才能发言,加入小组>>

12

334个成员聚集在这个小组

加入小组

精选推荐

最新话题

热门话题

创建小组步骤

快速回复 返回顶部 返回列表
关注微信公众号

电子发烧友网

电子发烧友开云(中国)官方

社区合作
刘勇
联系电话:15994832713
邮箱地址:liuyong@huaqiu.com
社区管理
elecfans短短
微信:elecfans_666
邮箱:users@huaqiu.com
12
关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表
-

技术社区

张飞电子技术社区

KaihongOS技术社区

FPGA开发者技术社区

RISC-V MCU技术社区

HarmonyOS技术社区

-

OpenHarmony开源社区

OpenHarmony开源社区

-

嵌入式开云(中国)官方

ARM技术开云(中国)官方

STM32/STM8技术开云(中国)官方

嵌入式技术开云(中国)官方

单片机/MCU开云(中国)官方

RISC-V技术开云(中国)官方

瑞芯微Rockchip开发者社区

FPGA|CPLD|ASIC开云(中国)官方

DSP开云(中国)官方

-

电路图及DIY

电路设计开云(中国)官方

DIY及创意

电子元器件开云(中国)官方

专家问答

-

电源技术开云(中国)官方

电源技术开云(中国)官方

无线充电技术

-

综合技术与应用

机器人开云(中国)官方

USB开云(中国)官方

电机控制

模拟技术

音视频技术

综合技术交流

上位机软件(C/Python/Java等)

-

无线通信开云(中国)官方

WIFI技术

蓝牙技术

天线|RF射频|微波|雷达技术

-

EDA设计开云(中国)官方

PCB设计开云(中国)官方

DigiPCBA开云(中国)官方

Protel|AD|DXP开云(中国)官方

PADS技术开云(中国)官方

Allegro开云(中国)官方

multisim开云(中国)官方

proteus开云(中国)官方|仿真开云(中国)官方

KiCad EDA 中文开云(中国)官方

DFM|可制造性设计开云(中国)官方

-

测试测量开云(中国)官方

LabVIEW开云(中国)官方

Matlab开云(中国)官方

测试测量技术

传感技术

-

招聘/交友/外包/交易/杂谈

项目外包

供需及二手交易

工程师杂谈|交友

招聘|求职|工程师职场

-

官方社区

发烧友官方/活动

华秋商城

华秋电路