570|6

6107

帖子

4

TA的资源

版主

楼主
 

【STM32H7S78-DK】 七 特殊功能计算器 [复制链接]

本帖最后由 damiaa 于 2024-11-10 13:03 编辑
                        【STM32H7S78-DK】 七 特殊功能计算器
 
 
 
想用这个板子做个特殊功能计算器,能计算左移右移乘除和取余,开始。
 

一、打开touchgfx designer ,加上提按键0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,<<,>>,%,*,/,clear,=按键。
如下:

 

二、加上每个按键的虚函数如下是0按键的,其他类似。


 

三、增加textArea1textArea3,textArea3分别加入wildcard1 并且勾选使用这个缓冲更新数据。

 

四、给每个设置字体为Large,40pt


并且在Texts的Typographies里面设置wildcard Ranges 0~f

 

五、Screep1view.hpp中加入头文件:

#ifndef SCREEN1VIEW_HPP
#define SCREEN1VIEW_HPP

#include <gui_generated/screen1_screen/Screen1ViewBase.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>

class Screen1View : public Screen1ViewBase
{
public:
    Screen1View();
    virtual ~Screen1View() {}
    virtual void setupScreen();
    virtual void tearDownScreen();
    virtual void function_bt0();
    virtual void function_bt1();
    virtual void function_bt2();
    virtual void function_bt3();
    virtual void function_bt4();
    virtual void function_bt5();
    virtual void function_bt6();
    virtual void function_bt7();
    virtual void function_bt8();
    virtual void function_bt9();
    virtual void function_bta();
    virtual void function_btb();
    virtual void function_btc();
    virtual void function_btd();
    virtual void function_bte();
    virtual void function_btf();
    virtual void function_bt_eq();
    virtual void function_bt_right();
    virtual void function_bt_left();
    virtual void function_bt_mul();
    virtual void function_bt_els();
    virtual void function_bt_div();
    virtual void function_bt_clr();
    void updateGFXElements(uint8_t bt_val);
protected:
    uint32_t dat_a;
    uint32_t dat_b;
    uint32_t dat_c;
    uint8_t point;
    char oldchar;
};

#endif // SCREEN1VIEW_HPP

六、Screep1view.cpp中加入虚函数和更新按键函数的具体实现如下:

#include <gui/screen1_screen/Screen1View.hpp>

Screen1View::Screen1View()
{

}

void Screen1View::setupScreen()
{
    Screen1ViewBase::setupScreen();
}

void Screen1View::tearDownScreen()
{
    Screen1ViewBase::tearDownScreen();
}
void Screen1View::function_bt0()
{
        updateGFXElements(0);
}
void Screen1View::function_bt1()
{
        updateGFXElements(1);
}
void Screen1View::function_bt2()
{
        updateGFXElements(2);
}
void Screen1View::function_bt3()
{
        updateGFXElements(3);
}
void Screen1View::function_bt4()
{
        updateGFXElements(4);
}
void Screen1View::function_bt5()
{
       updateGFXElements(5);
}
void Screen1View::function_bt6()
{
        updateGFXElements(6);
}
void Screen1View::function_bt7()
{
        updateGFXElements(7);
}
void Screen1View::function_bt8()
{
        updateGFXElements(8);
}
void Screen1View::function_bt9()
{
        updateGFXElements(9);
}
void Screen1View::function_bta()
{
        updateGFXElements(0x0a);
}
void Screen1View::function_btb()
{
       updateGFXElements(0x0b);
}
void Screen1View::function_btc()
{
        updateGFXElements(0x0c);
}
void Screen1View::function_btd()
{
        updateGFXElements(0x0d);
}
void Screen1View::function_bte()
{
        updateGFXElements(0x0e);
}
void Screen1View::function_btf()
{
       updateGFXElements(0x0f);
}
void Screen1View::function_bt_eq()
{
        updateGFXElements(0x20);
}
void Screen1View::function_bt_right()
{
        updateGFXElements(0x21);
}
void Screen1View::function_bt_left()
{
        updateGFXElements(0x22);
}
void Screen1View::function_bt_els()
{
        updateGFXElements(0x23);
}
void Screen1View::function_bt_mul()
{
        updateGFXElements(0x24);
}
void Screen1View::function_bt_div()
{
        updateGFXElements(0x25);
}
void Screen1View::function_bt_clr()
{
       updateGFXElements(0x26);
}
void Screen1View::updateGFXElements(uint8_t bt_val)
{
        if( bt_val <= 0x0f)
        {
                if(point == 0)
                {
                        dat_a <<=4;
                        dat_a +=bt_val;
                }
                else
                {
                        dat_b <<=4;
                        dat_b +=bt_val;
                }
        }
        else
        {       switch(bt_val)
                {
                        case 0x20: //=
                                if(oldchar == 0x21)
                                         dat_c = dat_a >> dat_b;
                                else
                                {
                                        if(oldchar == 0x22)
                                        { 
                                              dat_c =dat_a << dat_b;
                                        }
                                        else
                                        {
                                                if(oldchar == 0x23)
                                                {
                                                        if(dat_b !=0)
                                                                dat_c =dat_a%dat_b;
                                                }
                                                else
                                                {
                                                       if(oldchar == 0x24) 
                                                                dat_c =dat_a*dat_b;
                                                        else
                                                        {
                                                                if(oldchar == 0x25)
                                                                {
                                                                        if(dat_b !=0)
                                                                                dat_c =dat_a/dat_b;
                                                                }
                                                                else
                                                                {
                                                                        if(oldchar == 0x26)
                                                                        {
                                                                                point =0;oldchar =0x0;dat_a=dat_b=dat_c=0;
                                                                        }
                                                                }
                                                        }
                                                }
                                        }     

                                }
                               point =0;oldchar =0;         
                        break;
                        case 0x21:point =1;oldchar =0x21;break;//>>
                        case 0x22:point =1;oldchar =0x22;break;//<<
                        case 0x23:point =1;oldchar =0x23;break;//%
                        case 0x24:point =1;oldchar =0x24;break;//*
                        case 0x25:point =1;oldchar =0x25;break;//div
                        case 0x26:point =0;oldchar =0x0;dat_a=dat_b=dat_c=0;break;//clear
                }      
        }
        
        touchgfx::Unicode::snprintf(textArea1Buffer,TEXTAREA1_SIZE,"%x", dat_a );
        textArea1.invalidate();
        touchgfx::Unicode::snprintf(textArea2Buffer,TEXTAREA2_SIZE,"%x", dat_b );
        textArea2.invalidate();
        touchgfx::Unicode::snprintf(textArea3Buffer,TEXTAREA3_SIZE,"%x", dat_c );
        textArea3.invalidate();
        
}
五、编译运行,效果如下:
6

 
好,先分析到这里。
                                                                          谢谢

此帖出自stm32/stm8论坛

最新回复

直接来个工程师专属计算器     详情 回复 发表于 2024-11-12 12:19
点赞 关注
 

回复
举报

6822

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

Screep1view.cpp中加入虚函数和更新按键函数,这段代码还是比较长

此帖出自stm32/stm8论坛

点评

是啊,应该可以合并到一个虚函数里面判断是哪个按键按下的。 没仔细看是哪个api是判断哪个按键按下。所以就这样先将就着。  详情 回复 发表于 2024-11-11 13:50
 
 

回复

6107

帖子

4

TA的资源

版主

板凳
 
本帖最后由 damiaa 于 2024-11-11 14:04 编辑
Jacktang 发表于 2024-11-11 07:25 Screep1view.cpp中加入虚函数和更新按键函数,这段代码还是比较长

是啊,应该可以合并到一个虚函数里面判断是哪个按键按下的。

没仔细看是哪个api是判断哪个按键按下。

再加上昨天是10号。到了结束日。没时间仔细研究。

所以就这样先将就着。

多几个函数,但也还算比较直观。

也便于后面加功能,比如每个按键按下,弹起的颜色改变,形状改变就可以在自己按键的虚函数里面区实现。

还有数字框里面输入达到8位数字后数字颜色变灰,不让再输入,必须输入左移右移、*、%等。

此帖出自stm32/stm8论坛
 
 

回复

6533

帖子

9

TA的资源

版主

4
 

直接上面显示区间充足,各种进制数直接显示

此帖出自stm32/stm8论坛

点评

有道理,要把各种进制直接显示。这样更好进行对比。 有时间还可以加按位与或非异或, 逻辑与或非异或等。  详情 回复 发表于 2024-11-12 09:41
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6107

帖子

4

TA的资源

版主

5
 
秦天qintian0303 发表于 2024-11-11 23:42 直接上面显示区间充足,各种进制数直接显示

有道理,要把各种进制直接显示。这样更好进行对比。

有时间还可以加按位与或非异或, 逻辑与或非异或等。

 

搞了也可以转到C#,在电脑里面玩。

此帖出自stm32/stm8论坛

点评

直接来个工程师专属计算器    详情 回复 发表于 2024-11-12 12:19
 
 
 

回复

6533

帖子

9

TA的资源

版主

6
 
damiaa 发表于 2024-11-12 09:41 有道理,要把各种进制直接显示。这样更好进行对比。 有时间还可以加按位与或非异或, 逻辑与或非异 ...

直接来个工程师专属计算器  

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6107

帖子

4

TA的资源

版主

7
 
秦天qintian0303 发表于 2024-11-12 12:19 直接来个工程师专属计算器  

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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