计算元素在固定点的位置以进行 TFT 绘图

标签 c microcontroller fixed-point

我目前正在为一个小型 uC 项目编写 UI。在计算垂直线的位置时遇到一些问题。这个想法是将红线沿 x 轴移动到矩形的末端。

使用无限旋转编码器递增的值,范围为 0 到 800,增量为 1。矩形的左侧是 x - 轴的起点以及 x = 0。范围 0 - 800表示Q13.3定点数中的0-100.00,数据类型为uint16_t。

矩形当前为 300 像素宽,我对此很灵活,但不应小于 240 像素。线宽 1 像素。

要注意的是,由于性能限制,我只能使用定点数学,根本不能访问浮点单元。

enter image description here

我目前正在做的是有一个计数器,它会随着编码器的每次点击而递增。 ……喜欢:

        if(direction) counter++;        //Running forwards
        if(!direction) counter--;       //Running backwards
        if((counter % 8 ) == 0){
            if(direction) line.x += 3;
            if(!direction) line.x -= 3;
        }

由于间距为 3 像素,因此不太理想。

理想情况下,如果浮点计算是一个选项,我会简单地将计数器增加 0.375

感谢有关此问题的任何建议。

干杯

最佳答案

只需根据 0 ... 800 获取计数器的位置并将其缩小到 0 ... width

即将计数器的值乘以 width,然后然后除以 max,其中 max 是逻辑范围的最大值。

uint16_t scale(uint16_t value, uint16_t logical_max, uint16_t physical_max)
{
   uint32_t val = value * physical_max; // use a wider type to cope with overflow
   return (uint16_t) ((val / logical_max) & 0xFFFFU);
}

关于计算元素在固定点的位置以进行 TFT 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392341/

相关文章:

c - 防止 CEDET 语义解析某些文件类型

c - 受限3体重力模拟c

c - 在需要无符号字符指针的方法中传递整数地址

c - 调用 i2s_read 函数时 ESP32 上出现 StoreProhibited 错误

c - ARM Cortex-M3 上的 ELF 重定位

java - BigDecimal.add 奇怪的行为

algorithm - 如何使用定点算法在正弦查找表 (LUT) 中查找偏移量

c - 我应该避免同名的局部变量吗?

java - 如何在android中以编程方式查找网络上其他WiFi设备的IP地址

c - 将 [-1,+1] 浮点映射到 Q31 定点