| Автор |
Съобщение |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
 Реализация на многоезично меню с PIC чрез HITECH PICC
Въпроса ми е следния: За първи път ми се налага да направя двуезично меню в PIC процесор - PIC16F688 за да бъдем точни. Пиша на HI-TECH PICC 9.50PL2. Правил съм го много пъти за PC ама интересно що PIC компилатора неще. Та идеята е следната. Всички използвани стрингове да са разположени в масив, като има един масив за български и един масив за английски примерно.
Според флага за език - програмата изписва стрингове от съответния масив. За PC го правя така:
char **items;
char *it_en[3]={ "Str1",
"Str2",
"Str3"};
char *it_bul[3]={"Стр1",
"Стр2",
"Стр3"};
items = language?it_bul:it_en;
Тоя код работи безпроблемно под DOS и Windows, ама на тоя компилатор нещо му се опира и не мога да разбера какво. Та въпроса е как го правите това. Дали е някоя настройка на компилатора или начина е друг?
Само да добавя, че стринговете трябва да са в програмната памет. Досега за ПИК съм го правил така:
const char str[3][5]={"Стр1",
"Стр2",
"Стр3"};
Дотук добре, ама ако имам още един подобен масив за друг език - не мога да пренасочвам програмата да чете от който си искам. Предполагам че ще трябва някак с указател да е - ама не мога да се светна точно как.
|
| Пон Май 28, 2007 10:40 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Това на LCD ли ще го извеждаш или ще го пращаш към PC?Ако ще го пращаш към LCD - работиш с аски символи и нямаш проблеми за английските- за кирилицата в зависимост дали LCD поддържа.На компилатора в директорията примери има подобен пример за работа с LCD - разгледай го.
|
| Пон Май 28, 2007 11:29 am |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Проблема изобщо не е в ЛЦД-то а в стринговете - и в това как да накарам дадена функция примерно, да вика стринг от различен масив - според това на кой език е избрано да се работи. Все ми е в главата че трябва да имам указател към масив от стрингове и този указател да го насочвам към определения масив. На всякъде в програмата ползвам този указател и ако той сочи към масива на български - излизат български стрингове - ако сочи към масива с английски - английските. Практическата реализация на това обаче ми убягва - щото не става по начина по който го правя за PC. Та затова питам - как става с тоя компилатор - щото явно проблема е в компилатора - има някаква особенност - ама явно не я знам.
|
| Пон Май 28, 2007 12:02 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Нещо като това ли ?
#include <pic18.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#define XTAL_FREQ 24MHZ
__CONFIG(1, HS & FCMDIS & IESODIS );
__CONFIG(2, PWRTDIS & BORDIS & WDTDIS & WDTPS32K);
__CONFIG(3, MCLREN);
__CONFIG(4, STVREN & LVPDIS & DEBUGDIS );
__CONFIG(5, UNPROTECT);
__CONFIG(6, UNPROTECT);
__CONFIG(7, UNPROTECT);
const unsigned char data1[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
const unsigned char data2[10]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
unsigned char d,c;
void main()
{
c=2;
d=3;
if (c>3)
{
PORTB=data1[d];
}
else
{
PORTB=data2[d];
}
}
В зависимост от даден параметър c си избираш кой елемент d от един от двата масива data1-data2 да викнеш.
|
| Пон Май 28, 2007 1:51 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Ако предава флага като параметьр на многодимензионален масив, може да си спести if-а 
|
| Пон Май 28, 2007 2:09 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Това горното е ясно. Няма проблем ако става въпрос за обикновенни масиви. Проблема идва от това - че стринговете са ми в многомерен масив от типа str[10][20] - примерно 10 стринга от по 20 символа. Искам да си направя 2 такива масива - единия символите за български - другия за английски. После с указател който мога да насочвам към единия лили другия масив да чета от едните или другите символи. Проблема е че незнам как да дефинирам указател към масив от типа str[x][y]. Интересното е обаче че с компилатори за PC става и съм го правил. Там обаче символите и на двете таблици се зареждат в RAM паметта, а тук искам символните масиви да са в ROMа. Явно от там някъде идва проблема. Аз си имам работещо решение - правя само един масив в който двата езика са последователно наредени и после според езика преизчислявам индекса - обаче никак не ми харесва това решение.
|
| Пон Май 28, 2007 2:20 pm |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Ми не виждам какъв е проблема за тримерен масив
str[x][y][z]
|
| Пон Май 28, 2007 2:38 pm |
|
 |
|
zax
Ранг: Популярен
Регистриран на: Съб Фев 19, 2005 2:22 pm Мнения: 323
|
ще ти дам малка идея ....
направи го с двумерен масив
примерно 20 стринга по 20 символа
сменяш само индексирането
BG са на първите 10 стринга
EN са на вторите 10 стринга
при което когато ползваш EN
правиш едно събиране на индекса с 10
примерно точно преди да викаш таблицата
if ( EN == true )
INDEX+=10;
_________________ бързина, това е да бръкнеш 100 пъти в контакта за 1секунда и да не те хване тока .....
|
| Пон Май 28, 2007 2:44 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Ами то в момента е така. Всички езици са подредени един след друг в един и същ масив. Имам функция която се вика всеки път когато се ползва индекс. Та аз си я викам с досегашните индекси сякаш масива е само за един език, а ако трябва да се ползва друг език - тя сама увеличава индекса с колкото е изместването до търсения език и връща реиндексирания индекс. Гадното е обаче че тая функция се вика често и излишно заема 1 ниво от стека и още куп други безмислени работи стават.
А и решението никак не подхожда на език като C. Няма начин да не става с указател - ама какво да се прави - за сега ще карам така. В случая не ми трябва бързодействие - ама ако трябваше какво щях да правя???
|
| Пон Май 28, 2007 3:03 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Нямам вече инсталирам Hi-tech но по спомен как се работеше с това дърво  .....
Но беше май малко бъгава работата там при работа с указател към указател.
Но така е когато от контролер се изисква функционалност като за процесор. И господ да слезе и да напише C компилатор за тази работа пак ще е гнила и бъглива история.
|
| Пон Май 28, 2007 3:08 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ако има проблем търси го в компилатора. Аз на микрочипския C18 си го правя точно по класическия начин (**) и досега не съм имал проблем.
Макар, че Никола е прав, да правиш двумерни масиви от указатели на 16ка си е гърч по цялата линия - програмист, компилатор, желязо. То ще изяде памет...
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Май 28, 2007 4:13 pm |
|
 |
|
шопов
Ранг: Минаващ
Регистриран на: Сря Май 17, 2006 4:22 pm Мнения: 34 Местоположение: софия
|
Указател към многомерен масив се дефинира така:
int array[40][30][20][10];
int (*array_ptrs)[30][20][10] = array;
Първата размерност не се указва (защото се дефинира указател).
Всъщност, в С няма многомерни масиви, а масиви от масиви (...от масиви и т.н.)
|
| Пон Май 28, 2007 5:29 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
това str[10[20] не е масив от стрингове а от символи !
ако все пак държиш да ги ползваш по тоя начин - колегата по-горе ти е обяснил как ...
мисля че забележките към C компилаторите в доста подобни случаи са неудачни !
|
| Пон Май 28, 2007 5:39 pm |
|
 |
|
juzisound
Ранг: Почетен член
Регистриран на: Съб Май 27, 2006 12:37 pm Мнения: 647 Местоположение: с. Згалево
|
Ясно е че str[20][10] е масив от символи. Правя го така, щото иначе неще. Предложеното от Никола тръгна - тоест компилира се, ама след това пък функциите за изписване на стринг на LCD то спряха. Предполагам че сега там нещо не е наред. Продължавам да опитвам де. Някой беше писъл: "Няма начин да няма начин"!
Ето я функцията дето спря.
void LCD_Puts(const char *s, char blink)
{
while(*s){
if( (*s) >= 0xC0) LCD_WriteChar( cirilyc_table[(*s)-0xC0] );
else LCD_WriteChar(*s);
s++;
}
}
void LCD_Puts(const char const * s, char blink) - Пробвах и така - пак не става.
|
| Пон Май 28, 2007 5:50 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
виждам че се мъчиш - ето ти жокер
char (*items)[20];
char it_en[10][20]={ "Str1",
"Str2",
"Str3"};
char it_bul[10][20]={"Стр1",
"Стр2",
"Стр3"};
items = language? it_bul: it_en;
това "[20]" в декларацията на поинтера "items" не е за красота ... а за да знае компилатора как да го използва ... в тоя случай
&items[0] и &items[1] са през 20*sizeof(char) байта ...
|
| Пон Май 28, 2007 6:17 pm |
|
|