计算元素在固定点的位置以进行 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;}
}
非常类似于倒计时
我目前正在为一个小型 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;}
}
非常类似于倒计时