我正在进一步使用STM32进行嵌入式开发,并且最近开始尝试使用Keil,而不是我自己一起使用gcc / st-util的程序(因为将代码导入设备的步骤更少,易于调试等)。 。无论如何,我都在尝试将一个字符串写入一个小的1.8英寸TFT屏幕的函数(这是Geoffery Brown的书中的一项练习),并且如果我使用gcc而不是Keil进行编译,它似乎可以正常工作。感觉我必须做一些不符合标准C的工作,或者在Keil编译器中有我不了解的特质。
我敢肯定还有很多改进的余地,但是我目前的问题是array
永远不会更新,当它将实际数据写入屏幕时,它似乎是一个空数组。我已经尝试了一些方法(使用malloc
,重新排列了要更新的位置),但是它总是一样的,我可以看到该过程到达了在下一个数组值中设置color
的那一行,但该值不会出现在array
中。有什么想法吗?
代码:
void ST7735_WriteString(uint8_t *c, uint16_t size, uint16_t fgColor, uint16_t bgColor)
{
uint8_t i = 0;
// How many chars fit across
uint8_t needAnotherLine = 1;
uint16_t currentPosition = 0;
uint8_t currentLine = 0;
uint16_t boxesLeft = size - currentPosition;
uint16_t arraySize;
while (needAnotherLine)
{
uint16_t boxesThisRow = 0;
if (boxesLeft > 25)
{
needAnotherLine = 1;
boxesThisRow = 25;
}
else
{
needAnotherLine = 0;
boxesThisRow = boxesLeft;
}
// Initialize array which holds the pixel-color data for the row
arraySize = 66 * boxesThisRow;
uint16_t array[arraySize];
// Set new box for line
ST7735_setAddrWindow(110 - 10 * currentLine, 6, 120 - 10 * currentLine, 6 + 6 * boxesThisRow, 0x6);
for (i = 0; i < boxesThisRow; i++)
{
int8_t k = 0, j = 0;
uint16_t line; // font column
uint8_t bit; // foreground or background?
uint16_t color; // which color to draw
for (k = 0; k < 6; k++)
{
line = (k < 5) ? ASCII[5 * (*c++) + k] : 0; // 7-bit bitmap
for (j = 10; j >= 0; j--)
{
// Get bit values
bit = (line >> j) & 1;
color = bit ? fgColor : bgColor;
array[10 - j + k * 11 + i * 66] = color;
}
}
}
LcdWrite16(LCD_D, array, 66 * boxesThisRow);
currentPosition += boxesThisRow;
boxesLeft -= boxesThisRow;
currentLine++;
}
}