Отображение символов на ЖК-дисплее на плате разработки XBee - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю с программируемой платой разработки XBee для взаимодействия с LCD HD44780 (20x4). Я получаю беспроводную рамку на XBee и отображаю ее на ЖК-дисплее.

Это прекрасно работает, когда длина в 80 символов, потому что я не могу отобразить больше, чем это. Для этого я хочу отображать кадр за символом, чтобы при отображении последнего символа курсор снова перемещался на 0,0, а затем перезаписывался. Таким образом, я мог отображать столько, сколько я могу, в зависимости от ОЗУ XBee.

Приведенный ниже код подходит для кадра, длина которого не превышает 80 символов. Любые советы о том, как сделать посимвольную вещь для кадра?

#include <xbee_config.h>
#include <types.h>
#include <string.h>
#include <ctype.h>

#define char_lcd_write_str(a)       char_lcd_write(a, strlen(a))

static uint8_t test_stage = 0;
static uint8_t test_stage_done = 0;


  #if defined(RTC_ENABLE_PERIODIC_TASK)
     void rtc_periodic_task(void)
 {
  test_stage++;
  if (test_stage == 8)
    test_stage = 0;
  test_stage_done = 0;
 }
 #endif

#ifdef ENABLE_XBEE_HANDLE_RX
 int xbee_transparent_rx(const wpan_envelope_t FAR *envelope, void FAR  *context)
  {
int c,k; 
char addrbuf[ADDR64_STRING_LENGTH];
char_lcd_init(CHAR_LCD_CFG);
char_lcd_clear();

addr64_format(addrbuf, &envelope->ieee_address);
sys_watchdog_reset();


char_lcd_write_str(envelope->payload);
delay_ticks(HZ / 10);



return 0;
}
 #endif



void main(void)
{
uint8_t i, j;
int data,l;

sys_hw_init();
sys_xbee_init();
sys_app_banner();

char_lcd_init(CHAR_LCD_CFG);

for (;;) {
    if (!test_stage_done) {
        switch (test_stage) {


        case 0:
            char_lcd_goto_xy(0, 0);
            char_lcd_write_str("All working fine");

            break;
        }
        test_stage_done = 1;
    }

    sys_watchdog_reset();
    sys_xbee_tick();
}
}

1 Ответ

0 голосов
/ 08 декабря 2018

Структура wpan_envelope_t включает длину полезной нагрузки, которую вы можете использовать.

uint16_t length = envelope->length;
uint16_t offset = 0;
while (offset < length) {
    uint16_t write = length - offset;
    if (write > 80) write = 80;
    char_lcd_goto_xy(0, 0);
    char_lcd_write(&envelope->payload[offset], write);
    offset += write;
}

Обратите внимание, что это будет выглядеть немного странно, так как конец вашей строки будет перекрывать ранее напечатанные 80 символов.Возможно, вы захотите написать достаточно пробелов после последнего вызова char_lcd_write(), чтобы очистить эти данные (или добавить специальный символ, указывающий конец сообщения).

...