首页 > 解决方案 > XBee 开发板 LCD 显示屏上的字符显示

问题描述

我正在使用可编程 XBee 开发板与 LCD HD44780 (20x4) 接口。我在 XBee 上接收到一个无线帧并将其显示在 LCD 上。

当 的长度为 80 个字符时它工作正常,因为我不能显示更多。为此,我想逐个字符地显示帧,以便在显示最后一个字符时光标再次移动到 0,0 然后覆盖。这样我可以尽可能多地显示,具体取决于 XBee RAM。

以下代码适用于小于或等于 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();
}
}

标签: pointerscharacterdisplayxbeelcd

解决方案


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()以清除该数据(或添加特殊字符以指示消息结束)。


推荐阅读