Estoy haciendo un proyecto en un tablón de anuncios basado en bluetooth. ? En este proyecto, un usuario envía un mensaje usando la aplicación de voz a texto. El módulo bluetooth recibe el mensaje y lo envía al 8051, que lo descodifica y lo envía a la pantalla LCD para su visualización. . La pantalla LCD que estoy usando es de 20x4, por lo que puede mostrar un máximo de 80 caracteres, pero si supera los 80 caracteres, la cuarta línea comenzará a desplazarse por el mensaje. Actualmente, el código que he proporcionado puede recibir 9 caracteres. Pero, ¿cómo modificar este código para recibir cadenas de diferente longitud? (Como el mensaje de entrada que proporciona el usuario cada vez tendrá una longitud diferente) El código es el siguiente:
#include <reg51.h>
#include <string.h>
#define LCD_Data_Bus P1
#define FirstLine 0x80
#define SecondLine 0xC0
#define ThirdLine 0x94
#define FourthLine 0xD4
#define MaxSupportedChars 20
#define MaxSupportedLines 4
#define BlankSpace ' '
unsigned int LcdTrackLineNum; //Variable to track the line numbers
unsigned int LcdTrackCursorPos; //Variable to track the cursor
unsigned int LcdLineNumAddress[]={0x80,0xc0,0x94,0xd4};
sbit _RS= P2^2; // Register select pin connected to P2.2
sbit _RW= P2^1; // Read/Write pin connected to P2.1
sbit _EN= P2^0; // Enable pin connected to P2.0
/* Function prototypes for UART */
void uart_init();
unsigned rx_data();
void delay_ms(unsigned int);
/* Function prototypes for LCD */
void lcd_cmd(unsigned char cmd);
void lcd_data(unsigned char ascii);
void lcd_init();
void lcd_clear();
void LCD_DisplayChar(char LcdData);
void lcd_msg(char *);
void LCD_GoToNextLine(void);
void main()
{
unsigned char read[10];
unsigned char i;
lcd_init();
lcd_clear();
uart_init();
delay_ms(50);
lcd_msg("\n Bluetooth based \n Notice Board ");
delay_ms(2000);
while(1)
{
lcd_clear();
lcd_cmd(0x80);
for(i=0;i<10;i++)
{
read[i]=rx_data();
LCD_DisplayChar(read[i]);
}
}
}
void uart_init() // INITIALIZE SERIAL PORT
{
TMOD = 0x20; // Timer 1 IN MODE 2-AUTO RELOAD TO GENERATE BAUD RATE
TH1 = 0xFD; // LOAD BAUDRATE TO TIMER REGISTER
SCON = 0x50; // SERIAL MODE 1, 8-DATA BIT 1-START BIT, 1-STOP BIT, REN ENABLED
TR1 = 1; // START TIMER
}
unsigned rx_data()
{
while(RI == 0); // WAIT UNTIL DATA IS RECEIVED
RI = 0; // CLEAR FLAG
return SBUF; // RETURN SERIAL DATA
}
void delay_ms(unsigned int time)
{
int i,j;
for(i=0;i<=time;i++)
for(j=0;j<=127;j++);
}
void lcd_cmd(unsigned char cmd)
{
_RS=0; // RS = 0 for Command.
_RW=0; // RW = 0 for write.
LCD_Data_Bus=cmd; // 8bit command to LCD.
_EN=1; // Send a High-to-Low Pusle at Enable Pin.
delay_ms(5);
_EN=0;
delay_ms(5);
}
void lcd_data(unsigned char ascii)
{
_RS=1; // RS = 1 for Data.
_RW=0; // RW = 0 for write.
LCD_Data_Bus=ascii; // 8bit command to LCD.
_EN=1; // Send a High-to-Low Pusle at Enable Pin.
delay_ms(2);
_EN=0;
delay_ms(2);
}
void lcd_init()
{
delay_ms(5);
lcd_cmd(0x38); //Initilize the LCD in 8bit Mode
lcd_cmd(0x0E); // Display ON cursor ON
lcd_cmd(0x01); // Clear the LCD
lcd_cmd(0x80); // Move the Cursor to First line First Position
}
void lcd_clear()
{
lcd_cmd(0x01);
}
void lcd_msg(char *ptr_str)
{
unsigned char i,j;
int Size = strlen(ptr_str);
if(Size > 80)
{
for(i=0;i<Size;i++)
LCD_DisplayChar(ptr_str[i]);
while(1)
{
lcd_cmd(0x0C);
for(i=60;ptr_str[i];i++)
{
lcd_cmd(FourthLine);
for(j=0;j<MaxSupportedChars && ptr_str[i+j];j++)
lcd_data(ptr_str[i+j]);
for(j=j;j<MaxSupportedChars;j++)
lcd_data(BlankSpace);
delay_ms(125);
}
lcd_cmd(0x0E);
}
}
else
{
while((*ptr_str)!= 0)
LCD_DisplayChar(*ptr_str++);
}
}
void LCD_GoToNextLine(void)
{
LcdTrackLineNum++;
LcdTrackCursorPos = 0x00;
switch(LcdTrackLineNum)
{
case 1:
lcd_cmd(SecondLine);
break;
case 2:
lcd_cmd(ThirdLine);
break;
case 3:
lcd_cmd(FourthLine);
break;
}
}
void LCD_DisplayChar(char LcdData)
{
if((LcdTrackCursorPos >= MaxSupportedChars-1 ) || (LcdData=='\n'))
{
/* If the cursor has reached to end of line on page1
OR NewLine command is issued Then Move the cursor to next line */
LCD_GoToNextLine();
}
if(LcdData != '\n') /* Display the character if its not newLine Char */
{
lcd_data(LcdData); /* Display the data and keep track of cursor */
LcdTrackCursorPos++;
}
}