Sari la conținut
ELFORUM - Forumul electronistilor

"C" ptr PIC de la Microchip


sofian

Postări Recomandate

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 spre comentariu
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • sofian

    5

  • Elef

    4

  • Liviu M

    2

Top autori în acest subiect

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 spre comentariu

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 spre comentariu

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 spre comentariu

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 spre comentariu

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 spre comentariu

"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 spre comentariu

"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 spre comentariu

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 spre comentariu
Vizitator 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 spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări