单片机---HLK-W801图形框架LVGL下开发(四)

发布者:Shuxiang最新更新时间:2022-07-28 来源: csdn关键字:单片机 手机看文章 扫描二维码
随时随地手机看文章

2022年3月24日效果,增加了汉化,APP包括温湿度,计算器,wifi连接,在wifi连接状态下,能够进行NTP时间同步及查询天气。

海凌科w801开发的单片机主机

本章重点

之前的版本,说是在w801下开发,也只是硬件是w801,而软件依旧用的是w806的代码框架,原因还是w806的代码框架逻辑十分清晰,使用起来也简单明了。

不过经过一天的奋战,还是将所有部分都移植到了w801的代码框架上了,为的就是能上网啊。

真是年轻人为了上网,啥都做得出来


最新版本LVGL移植

还是简单的步骤,将源码和头文件放在到工程中,我放在了src下的app中

然后就是编译,可能会报一些函数引用的问题,调整下头文件包含的顺序即可。别问我为什么调整一下就可以,这是我多年工作经验出来的结果。


屏幕驱动

我用的是ST7789的并口屏幕,配合的是SPI的触摸屏接口。移植部分前面介绍过,是在w806上,在w801上,主要就是一个写并口的操作,这个在demo中并没有,所以还是通过修改单个gpio的方式,分析出了写8080并口的方式。


下面是关键的并口写入方式。


void P_WRITE_B0_B15(uint16_t data )

{

u32 cpu_sr = 0;

u32 reg;

u32 reg_en;

u32 setval=0;

cpu_sr = tls_os_set_critical();

reg_en = tls_reg_read32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET);

tls_reg_write32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET, reg_en | P_DATA_PIN);


reg = tls_reg_read32(HR_GPIO_DATA + TLS_IO_AB_OFFSET);

setval=reg&0xFFFF0000;

tls_reg_write32(HR_GPIO_DATA + TLS_IO_AB_OFFSET, setval | data);

    tls_reg_write32(HR_GPIO_DATA_EN + TLS_IO_AB_OFFSET, reg_en);


tls_os_release_critical(cpu_sr);

}


其他部分继续参考《单片机—HLK-W801并口驱动ST7789》即可


触摸屏

这里的移植没有什么区别,就是替换一下原来文档中的GPIO的操作。

继续参考《单片机—HLK-W801驱动触摸屏》


Port层代码

这部分几乎还是没有变化,继续参考《单片机—HLK-W801图形框架LVGL移植》



主页功能

这里介绍一下我制作的这个主页

其实就是简单的时钟,配合几个button,实现了一个类似桌面菜单的功能,这里值得学习的一点,就是关于win空间的使用,每个简单功能,可以理解为一个app,都是在一个win上面实现了,在点击一个button的时候,会先关闭桌面,释放桌面的资源,包括定时任务,然后启用一个新的win来绘制所有的app内容。退出的时候,也是类似,释放所有资源,然后再重新绘制桌面。

这样才能在单片机这种资源比较少的设备上创建这种多个app的桌面。

资源紧张,就得省着用啊


WIFI联网

这里才是移植到w801上的最重要的目的。首先绘制了一个页面用来填写ssid和密码

这个空间在官方的例子中就能找到。

然后再点击确认的时候,调用官方wifidemo的接口就可以联网,并且稍微做个小弹窗,就知道wifi是否连接成功了。



下面是核心代码。


static void con_net_status_changed_event(u8 status )

{

    switch(status)

    {

    case NETIF_WIFI_JOIN_SUCCESS:

    {

mbox1 = lv_msgbox_create(NULL, "", "WIFI JOIN SUCCESS", NULL, true);

    lv_obj_center(mbox1);

wifi_on=true;

    }

        break;

    case NETIF_WIFI_JOIN_FAILED:

    {

mbox1 = lv_msgbox_create(NULL, "", "WIFI JOIN FAILED", NULL, true);

    lv_obj_center(mbox1);

wifi_on=false;

        }

    break;

    case NETIF_WIFI_DISCONNECTED:

        {

mbox1 = lv_msgbox_create(NULL, "", "WIFI DISCONNECTED", NULL, true);

    lv_obj_center(mbox1);

wifi_on=false;

        }

break;

    case NETIF_IP_NET_UP:

    {

        struct tls_ethif *tmpethif = tls_netif_get_ethif();

ip_addr_t *ip=&tmpethif->ip_addr;


sprintf(wifi_ip,"%d.%d.%d.%d", ip4_addr1(ip_2_ip4(ip)),ip4_addr2(ip_2_ip4(ip)), ip4_addr3(ip_2_ip4(ip)), ip4_addr4(ip_2_ip4(ip)));

printf("wifi_ip:%sn",wifi_ip);

#if TLS_CONFIG_IPV6

        print_ipaddr(&tmpethif->ip6_addr[0]);

        print_ipaddr(&tmpethif->ip6_addr[1]);

        print_ipaddr(&tmpethif->ip6_addr[2]);

#endif

    }

    break;

    default:

        //printf("UNKONWN STATE:%dn", status);

        break;

    }

}


int demo_connect_net(char *ssid, char *pwd)

{

    struct tls_param_ip *ip_param = NULL;

    u8 wireless_protocol = 0;


    if (!ssid)

    {

        return WM_FAILED;

    }


    printf("ssid:%sn", ssid);

    printf("password:%sn", pwd);

    tls_wifi_disconnect();


    tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, TRUE);

    if (TLS_PARAM_IEEE80211_INFRA != wireless_protocol)

    {

        tls_wifi_softap_destroy();

        wireless_protocol = TLS_PARAM_IEEE80211_INFRA;

        tls_param_set(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, FALSE);

    }


    tls_wifi_set_oneshot_flag(0);


    ip_param = tls_mem_alloc(sizeof(struct tls_param_ip));

    if (ip_param)

    {

        tls_param_get(TLS_PARAM_ID_IP, ip_param, FALSE);

        ip_param->dhcp_enable = TRUE;

        tls_param_set(TLS_PARAM_ID_IP, ip_param, FALSE);

        tls_mem_free(ip_param);

    }


    tls_netif_add_status_event(con_net_status_changed_event);

    tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd));

    printf("nplease wait connect net......n");


    return WM_SUCCESS;

}


NTP功能

前面的版本时间是手动设置,我们有了wifi,那自然是更希望联网对时了。界面就很简单,一个button就可以。

点击的时候,参考demo中的ntp操作,并且设置到实时时钟rtc中,就完成了

核心操作函数。


static void ntp_process(lv_event_t * e)

{

lv_obj_t * mbox1=NULL;

char resultntp[128]={0};

    unsigned int t;

    struct tm *tblock;

    t = tls_ntp_client();


    tblock = localtime((const time_t *)&t); //switch to local time

    tblock->tm_mon+=1;

    tls_set_rtc(tblock);

sprintf(resultntp,"time:%d.%d.%d %02d:%02d:%02d",tblock->tm_year,tblock->tm_mon,tblock->tm_mday,tblock->tm_hour,tblock->tm_min,tblock->tm_sec);

mbox1 = lv_msgbox_create(NULL, "", resultntp, NULL, true);

lv_obj_center(mbox1);

}


天气预报

这里就是简单的自动调用web的客户端程序,参考demo,访问一个天气预报的接口,需要是http的,然后解析一下返回的数据即可。


我这里返回的数据是json格式,只取了天气那一项,然后显示到界面上就可以。

简陋是简陋了点,不过道理就是这样


注意事项

联网与不联网,可以通过记录在全局变量中,控制桌面不同的app出现,当wifi不连接的时候,我这里只显示本地的日期和时间设置,不显示NTP与天气预报

当网络连接之后,才显示联网的设置,并且不再显示本地设置时间和日期

并且在设置的操作之后,尽量要添加msg box来提示操作结果。


另外。这个w801的资源也比较紧张,之前还能放张老师的照片,现在只能黑屏当背景了

在这里插入图片描述

介绍硬件

这个单片机的主机,其实就是一块HLK W801的主板,加了一个触摸显示屏做的,被我焊接了一下,因为杜邦线实在是太容易掉了,反正也没别的屏幕了,然后加了一个DHT11模块,就被我塞到一个牙线盒子里了,


感兴趣的可以自己做一个。

关键字:单片机 引用地址:单片机---HLK-W801图形框架LVGL下开发(四)

上一篇:获取W806的芯片唯一ID
下一篇:单片机---HLK-W801图形框架LVGL下开发(五)

推荐阅读最新更新时间:2024-11-09 19:24

51单片机按键控制输出pwm的占空比
之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机。这样做的话不但麻烦、效率低,还又把芯片的可烧写次数减少了一次,虽然51的芯片现在很便宜,但能省点就省点,能不浪费就不浪费,哈哈,开玩笑啦!最主要的还是为了灵活性,为此特地通过加入按键的功能来实现动态修改输出的pwm的占空比。这样在用pwm控制电机的时候就能使用按键来控制电机转速了。废话不多说,见下: #include reg51.h #define uint unsigned int #define uchar unsigned char uchar
[单片机]
零基础带你入门单片机
单片机到底是什么? 单片机又称单片微控制器,它的全称是单片微型计算机简称单片机(MCU)。它是典型的嵌入式微控制器,同时也是一种集成电路芯片。 单片机不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。简单地说,单片机就是一个小计算机系统。 1、无人机工作原理以及主控MCU是如何工作的 MCU也叫单片机,是把中央处理器的频率与规格做适当缩减,并将内存(memory)、计数器(TImer)、US
[单片机]
单片机和RTOS的中断系统也就这么回事
摘要:操作系统实际上我们接触的很多,比如说windows,安卓、IOS、linux都是一种操作系统。单片机也有它自己的操作系统,叫做实时操作系统。那么这种实时操作系统和我们用的这些系统有什么区别呢? 我们经常使用的这些实际上是非实时的操作系统。为什么说它是非实时的,因为它的内核实际上是对任务进行时间片轮转的调度方式。比如说有3个任务,分别是任务A,任务B和任务C。那么在时间片轮转的调度机制里,它会让任务A运行一断时间,然后切换到任务B,然后切换到任务C,这样子不断的轮转。 两个任务间通过 Systick 轮转调度的简单模式 那么这样有一个什么缺点呢?如果有一台自动驾驶的汽车里面任务C,是用来检测障碍物和躲避障碍物的,如果任
[单片机]
PIC单片机实现RS232串口异步通讯的设计
编写程序实现以下功能。在计算机上使用串口大师向开发板发每次发送1个字符。开发板每接收到一个数据,则交换该数据的高低4位,再发送回计算机。 端口初始化时使能发送与接收,使用扫描方式接收数据,接收到数据后立即交换高低四位并发送,交换高低四位方式如下: 完整程序: * 标 题: 异步串口通讯 * 功能描述: 在计算机上使用串口大师向开发板发每次发送1个字符。 * 开发板每接收到一个数据,则交换该数据的高低4位,再发送回计算机。 #include #define uint8 unsigned char #define uint16 unsigned int __CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF
[单片机]
PIC<font color='red'>单片机</font>实现RS232串口异步通讯的设计
通过单片机来控制蜂鸣器
开发板原理图上面蜂鸣器的电路图是这样的,根据视频知道它是一个无源蜂鸣器。 可以看到蜂鸣器的一端和电阻相连,另一端和引脚BZ相连,注意这个BZ并不是元气名称,有图可知,元气名称都是蓝色的,而这个BZ是红色的。我们在开发板原理图上找一个 BZ引脚,发现在ULN2003D这个芯片上有BZ引脚,所以我们就把蜂鸣器的图和ULN2003D的图放在一张图上,而且把他们该连的引脚连起来了。 有图可知BZ1蜂鸣器的BZ引脚和ULN2003引脚的12引脚相连的,这是一个输出引脚,对应的输入引脚是5引脚,有图可知STC89C52单片机的P15引脚是和ULN2003的5引脚相连的。 所以可以通过单片机来控制蜂鸣器,是这么个道道。 ULN2003
[单片机]
通过<font color='red'>单片机</font>来控制蜂鸣器
STM32F0单片机 PWM + ADC 控制有刷电机
1.有刷电机驱动电路 有刷电机是电机里面最简单,也是历史最悠久的一种,到现在仍然广泛应用于各个领域。他的控制很简单,在电机的两个电极加正向电压,则正向旋转,如果加反向电压,则旋转方向也反过来。电机的转速可以通过控制加在电极上的电压来调节。 在电机控制电路中最常用的器件就是 MOS 管了。可以分为两个大的类型:P 沟道 MOS 和 N 沟道 MOS。MOS 管可以简单的理解为一个自来水阀门,Gate 是控制端,调节 Drain 和 Source 端之间流过的电流大小。 下面是两种 MOS 的典型用法。P 沟道的 MOS 一般 S 接电源正极,然后 Vgs 需要一个负电压来打开电流通道,而 N 沟道的 S 极一般接电源的负极,
[单片机]
51单片机学习笔记8 -- OLED显示(SPI)
1.OLED简介 有机发光二极管(Organic Light-Emitting Diode, OLED)又称为有机电激光显示、有机发光半导体。由美籍华裔教授邓青云(Ching W. Tang)于1979年在实验室中发现。OLED显示技术具有自发光、广视角、几乎无穷高的对比度、较低耗电、极高反应速度等优点。 1.2 OLED结构 由基板、阴极、阳极、空穴注入层(HIL)、电子注入层(EIL)、空穴传输层(HTL)、电子传输层(ETL)、电子阻挡层(EBL)、空穴阻挡层(HBL)、发光层(EML)等部分构成。其中,基板是整个器件的基础,所有功能层都需要蒸镀到器件的基板上;通常采用玻璃作为器件的基板,但是如果需要制作可弯曲的柔性
[单片机]
51<font color='red'>单片机</font>学习笔记8 -- OLED显示(SPI)
51单片机教程第4讲_寄存器
任何单片机,内部都有寄存器,用来存储数据和控制器件。51单片机的寄存器是8位的,用二进制表示就是00000000到11111111之间的数据。我们在学习51单片机,本质上就是在学习它的寄存器。单片机的寄存器被放到内部特定的地址空间,并被命名,这个命名文件就叫做单片机的头文件,例如reg51.h文件内容如下所示: #ifndef __REG51_H__ #define __REG51_H__ /* BYTE Register */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0x
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved