我正在使用可编程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();
}
}
答案 0 :(得分:0)
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()
调用之后写出足够的空格以清除该数据(或添加一个特殊字符以指示消息的结尾)。