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

Calculating position of element in fixed point for TFT drawing

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

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

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

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

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

        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?

即将 counter 的值乘以 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);
}

在非常小的 misros 上你需要做一些技巧:

uint8_t result;
static uint8_t counter1 = 0, counter2 = 0;

void handleEncoderTickUp(void)
{   
    if(++counter1 == 2) {result++; counter1 = 0;}
    if(++counter2 == 3) {result +=2; counter2 = 0;}
}

非常类似于倒计时