|
|
View previous topic :: View next topic |
Author |
Message |
_olaf_
Joined: 24 Feb 2005 Posts: 32
|
How to access string in struct? |
Posted: Sat Oct 01, 2016 2:55 pm |
|
|
Hi,
I want to set up a LCD menu for my new project. I read a lot of examples but at the end I couldn't implement something that worked.
I found an example which looked like it would fulfill my needs, but I only get nonsense on my LCD. The LCD output itself works fine.
I found following Code
Code: |
#define Menu_Entries 10
enum ids{_BEGIN,_,_MAIN1,_SUBMENU_1A,_SUBMENU_1B,_MAIN2,_SUBMENU_2A,_SUBMENU_2B,_MAIN3,_SUBMENU_3A,_SUBMENU_3B};
const struct LCD_Menu
{
int8 MenuID;
int8 SubMenu;
char MenuName[16];//17
};
const struct LCD_Menu Menu[Menu_Entries] =
{
{_,_BEGIN,""},
{_MAIN1,_BEGIN,"Mainmenu 1"},
{_SUBMENU_1A,_MAIN1,"Sub_Menu 1a"},
{_SUBMENU_1B,_MAIN1,"Sub_Menu 1b"},
{_MAIN2,_BEGIN,"Mainmenu 2"},
{_SUBMENU_2A,_MAIN2,"Sub_Menu 2a"},
{_SUBMENU_2B,_MAIN2,"Sub_Menu 2b"},
{_MAIN3,_BEGIN,"Mainmenu 2"},
{_SUBMENU_3A,_MAIN3,"Sub_Menu 3a"},
{_SUBMENU_3B,_MAIN3,"Sub_Menu 3b"}
};struct LCD_Menu MenuPointer[3];
|
I don't know if I have understood the code, but I don't think so.
In the following line Code: | const struct LCD_Menu ... | the types of the entries in the following
Code: | const struct LCD_Menu Menu[Menu_Entries] =
{ |
are declared. Is this right?
In my main I wanted to write the MenuName to the LCD.
Code: | printf(LCD_char,"%s",MenuPointer[1].MenuName); |
But all I get on the LCD are cryptic characters. The printf(...) does work. I have some other parts in the program where I can write to the LCD without any problem.
How can I write the string from the const struct LCD_Menu to my LCD? I doesn't make a difference if I use
printf(LCD_string,"%s",...) or printf(LCD_char,"%c",...)
BR
Edit: Changed subject |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Oct 01, 2016 4:35 pm |
|
|
In the following line, you are creating empty RAM-based structures.
They have to be initialized with data.
Quote: | struct LCD_Menu MenuPointer[3]; |
To initialize the RAM-based structures in the MenuPointer array, you
can copy the const data into it. Add the code shown below:
Quote: |
void main()
{
int8 i;
for(i = 0; i < 3; i++)
{
MenuPointer[i] = Menu[i];
}
printf(LCDchar, "%s", MenuPointer[1].MenuName);
while(TRUE);
} |
If it still doesn't work, it could be a compiler version issue as I point out
near the end of this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=55193
Always post your compiler version. |
|
|
_olaf_
Joined: 24 Feb 2005 Posts: 32
|
|
Posted: Sun Oct 02, 2016 1:54 am |
|
|
Sorry I forgot. Compiler Version is 5.064
Thank you very much PCM_Programmer.
So I have to copy the data I want to use into the MenuPointer.
e.g. if I want to get the 6 values of the struct array I have to copy
Code: |
MenuPointer[5] = Menu[5]; |
I tried this from your link
Code: |
for(i = 0; i < ALL_MENU; i++)
{
MenuPointer[k] = MenuTest[i];
printf("> %s \r", MenuPointer[0].MenuName);
}
|
This doesn't work propper, but I think it is because I copied the data into the MenuPointer in the beginning of main and then used it later in the program.
Code: |
void main()
{
//do some initializaton
...
...
for(i = 0; i < ALL_MENU; i++)
{
MenuPointer[k] = MenuTest[i];
}
...
...
//do somthing else
...
...
printf("> %s \r", MenuPointer[0].MenuName);
|
Copying the data into the MenuPointer just in front of the printf(...) does work.
Best Regards |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19553
|
|
Posted: Sun Oct 02, 2016 7:27 am |
|
|
As a comment, think about it. If it works putting the data in 'close' to where you use it, but not when you fill it earlier, it implies _something_ you are doing between these points, is changing the data...... |
|
|
_olaf_
Joined: 24 Feb 2005 Posts: 32
|
|
Posted: Mon Oct 03, 2016 6:21 am |
|
|
Now it works. I had a little code snippet in front of the code.
Thanks for your help. |
|
|
avatarengineer
Joined: 13 May 2013 Posts: 51 Location: Arizona
|
constant strings for LCD |
Posted: Mon Oct 03, 2016 11:19 am |
|
|
I found the most robust means to create menus, templates for LCDs
was to list strings as constants such as in a #define then load a selected page into an array using such as:
Code: |
strcpy(page.line[0].field,Line91);
strcpy(page.line[1].field,Line92);
strcpy(page.line[2].field,Line93);
strcpy(page.line[3].field,Line94); |
A slicker approach:
I now load the strings directly as programmed into Flash
at fixed addresses then just read what I need.
Much less code. Simple read_program_eeprom
using memory locations as pages of lines to read into data structure.
ok? |
|
|
avatarengineer
Joined: 13 May 2013 Posts: 51 Location: Arizona
|
Menus in ROM |
Posted: Mon Oct 03, 2016 11:29 am |
|
|
Forgot to add this:
Code: | #DEFINE EndofMemory 0x4000 // Outside End of ROM address
#DEFINE MemoryBlock 0x0040 // allocated space per log 64 byte limit
#DEFINE LCD_Line1 "blah blah ..."
#DEFINE LCD_Line2 "more blah blah ..."
#DEFINE COMMENT1MEM EndofMemory-(1*MemoryBlock) // LOCATE STRING INFO
#DEFINE COMMENT2MEM EndofMemory-(2*MemoryBlock) // LOCATE STRING INFO
#ROM COMMENT1MEM={LCD_Line1}
#ROM COMMENT2MEM={LCD_Line2} |
The compiler does all the work,...
then just read out as needed.
Enjoy
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|