Jump to content
ELFORUM - Forumul electronistilor

"C" ptr PIC de la Microchip


Recommended Posts

Am inceput sa cochetez cu C de la microchip si as avea nevoie de putin ajutor

 

deci vreau sa fac un meniu si nu stiu cum sa pasez un pointer catre un sir text

deci cum transfer la functia TextMenu textul din TabTextMenu_1 sau TabTextMenu_2

 

//-----------------------------------------------------------//const char TabTextMenu_1[]={	"CONFIGURATION "	"SET CLOCK     "	"EXIT          "};const char TabTextMenu_2[]={	"ENABLE "	"DISABLE"};//-----------------------------------------------------------//void TextMenu(unsigned char NrMenu){	unsigned char Char,idx,Cnt01;	idx = (NrMenu * 14);	Cnt01 = 14;	while (Cnt01) {		Char = TabTextMenu_1[idx++];//		AfsCharText(Char);		Cnt01--;	}}//-----------------------------------------------------------//void main (){	TRISC	= 0xFFFF;	TRISB	= 0x0000;	PORTC	= 0xFFFF;	PORTB	= 0xFFFF;//-----------------------------------------------------------//	TextMenu(0);	while(1) {		TextMenu(1);	}}//-----------------------------------------------------------//
Link to comment
  • Replies 11
  • Created
  • Last Reply

Top Posters In This Topic

rom char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK     ","EXIT          "};rom char TabTextMenu_1[][15]={"ENABLE ","DISABLE"};void TextMenu(unsigned char NrMenu, unsigned char SelMenu){  if(SelMenu==0){    while(TabTextMenu_1[NrMenu])      AfsCharText(*TabTextMenu_1[NrMenu]++);  }  else{    while(TabTextMenu_2[NrMenu])      AfsCharText(*TabTextMenu_2[NrMenu]++);  }}

Sunt 2 array-uri de stringuri, modifcatorul rom spune ca sa fie plasate in flash nu in ram(e mai logic avand in vedere ca nu se modifica).

Fiind declarate global pot fi apelate in cadrul functiei TextMenu fara a fi nevoie sa fie pasate ca parametru.

Link to comment

elef mersi mult ptr raspunsdar eu vreau un singur string din care eu sa iau din 14 in 14 caractere si sa il afisez, asa nu ocup mai multa memorie in flashasa pot face mai multe texte si doar pasez pointerul si lungimea la text,eu am facut asa idx = (NrMenu * 14); dar vreau sa inlocuiesc 14 cu lungimea textului care il afisez

Link to comment

Atunci sirul trebuie sa arate in felul asta:

rom char TabTextMenu_1[42]={"CONFIGURATION SET CLOCK     EXIT          "};

Functia ar putea sa fie ceva in genul:

void TextMenu(unsigned char NrMenu, rom char *Menu){  unsigned char startpos,endpos,count;    startpos=NrMenu*14;  endpos=NrMenu*15;  for(count=startpos;count<endpos;count++)    AfsCharText(Menu[count]);}

Nu prea inteleg cum vine chestia cu lungimea textului.

Ceva de genul?

void TextMenu(unsigned char StartPos, unsigned char Lenght, rom char *Menu){   unsigned char count;  for(count=StartPos;count<StartPos+Lenght;count++)    AfsCharText(Menu[count]);}

 

Cel mai bine ar fi sa faci string-uri individuale pentru fiecare meniu.

Link to comment

functia va arata asa

//-----------------------------------------------------------//const char TabTextMenu_1[]={   "CONFIGURATION "   "SET CLOCK     "   "EXIT          "};const char TabTextMenu_2[]={   "ENABLE "   "DISABLE"};void TextMenu(unsigned char NrMenu,unsigned char LnMenu, rom char *Menu){  unsigned char idx;    idx = (NrMenu * LnMenu);   while (LnMenu) { //     Char = TabTextMenu_1[idx++];    AfsCharText(Menu[idx++]);      LnMenu--;   }}// aici nu stiuTextMenu(1,14,Menu); // 1 este "SET CLOCK", 14 este Lungimea, Menu ar trebui sa fie pointer catre string

dar cum apelez functia cu texte diferite ?

Link to comment

In C constructiile de genul asta n-au cum sa functioneze.

//-----------------------------------------------------------//const char TabTextMenu_1[]={   "CONFIGURATION "   "SET CLOCK     "   "EXIT          "};
In C nu exista notiunea de "string" sau "sir de caractere" sau... Un string se defineste ca un array de caractere. Adica fiecare intrare in TabTextMenu_1 trebuie definita ca un sir de caractere :
char configurare[] = "CONFIGURATION";
Cum TabTextMenu_1 e la randul lui un array de 3 elemente, la sfarsit obtii exact ce ti-a scris Elef mai sus:
rom char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK     ","EXIT          "};
O matrice dubla cu 3 x lungimea_maxima caractere.

// aici nu stiuTextMenu(1,14,Menu); // 1 este "SET CLOCK", 14 este Lungimea, Menu ar trebui sa fie pointer catre string
dar cum apelez functia cu texte diferite ?
Cu indecsi. Ceva de genul:
TextMenu(TabTextMenu_1[1], 14,Menu)
Da' incearca sa intelegi ce face codul pus de Elef, ca mie mi se pare OK.@Elef: cred c-ar fi bine daca ai comenta putin codul.
Link to comment

"C" este ptr PIC32 si constructiile de genul functioneaza asa nu cu rom char

//-----------------------------------------------------------//const char TabTextMenu_1[]={   "CONFIGURATION "   "SET CLOCK     "   "EXIT          "};este bun si asa const char TabTextMenu_1[42]={"CONFIGURATION SET CLOCK     EXIT          "};

eu vreau sa stiu cum apelez functia ca am citit tot netul si nu stiu cum se face ori "C" asta stie de altceva

Link to comment

"C" este ptr PIC32 si constructiile de genul functioneaza asa nu cu rom char

A sooo, pai e simplu, definesti matricea cum ii place lui:
const char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK     ","EXIT          "};

eu vreau sa stiu cum apelez functia ca am citit tot netul si nu stiu cum se face ori "C" asta stie de altceva

Acum trebuie sa functioneze varianta cu indecsi. Adica daca vrei sa afisezi "CONFIGURATION" apelezi TabTextMenu_1[0], pentru "SET CLOCK " TabTextMenu_1[1] si pentru "EXIT" TabTextMenu_1[2].Fiecare litera in parte se poate accesa folosind ambii indecsi. De exemplu, ca sa afisezi "CONFIGURATION" litera cu litera poti folosi bucla:
i=0;while(TabTextMenu_1[0][i]) {   AfiseazaCaracter(TabTextMenu_1[0][i]);   i++;}
Il las pe Elef sa-ti arate varianta eleganta cu pointeri. :jytuiyuPS Sper ca n-am scris prea multe prostii.
Link to comment

rom e un specificator care in MCC18 spune ca respectiva variabila nu e salvata in RAM ci in FLASH.Se pare ca la C32 nu mai e valabila.

In C exista o legatura foarte stransa intre tablouri si pointeri.

Daca avem declaratia char str[]="string" str va pointa catre primul element din stringul respectiv adica s

Asa ca in cazul nostru daca avem stringul :

const char TabTextMenu_1[42]="CONFIGURATION SET CLOCK     EXIT          ";
si functia delarata in felul urmator:

void TextMenu(unsigned char NrMenu, char *Menu){  unsigned char startpos,endpos,count;   startpos=NrMenu*14;  endpos=NrMenu*15;  for(count=startpos;count<endpos;count++)    AfsCharText(Menu[count]);}
Daca in program am nevoie de SET CLOCK atunci functia o voi apela in felul urmator:

void TextMenu(1,TabTextMenu_1)
Link to comment
Guest stack

Sofian, din ce am vazut ca ai postat pana acum , am inteles ca te descuri in assembler. Incearca sa faci legatura intre intre INDF/FSR folositi in asm si pointer utilizat in C.Dupa ce pricepi asta, poti sa te apuci sa citesti despre programarea in C. fie el si C32. Fara sa se simta cineva jignit, sfaturile de mai sus au legatura mai mult cu limbajul basic decat cu C.Parerea mea. Stima,stack (overflow)

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines