Отговори на тема  [ 21 мнения ]  Отиди на страница 1, 2  Следваща
Реализация на многоезично меню с PIC чрез HITECH PICC 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 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
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Това на LCD ли ще го извеждаш или ще го пращаш към PC?Ако ще го пращаш към LCD - работиш с аски символи и нямаш проблеми за английските- за кирилицата в зависимост дали LCD поддържа.На компилатора в директорията примери има подобен пример за работа с LCD - разгледай го.


Пон Май 28, 2007 11:29 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 27, 2006 12:37 pm
Мнения: 647
Местоположение: с. Згалево
Мнение 
Проблема изобщо не е в ЛЦД-то а в стринговете - и в това как да накарам дадена функция примерно, да вика стринг от различен масив - според това на кой език е избрано да се работи. Все ми е в главата че трябва да имам указател към масив от стрингове и този указател да го насочвам към определения масив. На всякъде в програмата ползвам този указател и ако той сочи към масива на български - излизат български стрингове - ако сочи към масива с английски - английските. Практическата реализация на това обаче ми убягва - щото не става по начина по който го правя за PC. Та затова питам - как става с тоя компилатор - щото явно проблема е в компилатора - има някаква особенност - ама явно не я знам.


Пон Май 28, 2007 12:02 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 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
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Дек 14, 2004 1:31 pm
Мнения: 3849
Мнение 
Ако предава флага като параметьр на многодимензионален масив, може да си спести if-а :)


Пон Май 28, 2007 2:09 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 27, 2006 12:37 pm
Мнения: 647
Местоположение: с. Згалево
Мнение 
Това горното е ясно. Няма проблем ако става въпрос за обикновенни масиви. Проблема идва от това - че стринговете са ми в многомерен масив от типа str[10][20] - примерно 10 стринга от по 20 символа. Искам да си направя 2 такива масива - единия символите за български - другия за английски. После с указател който мога да насочвам към единия лили другия масив да чета от едните или другите символи. Проблема е че незнам как да дефинирам указател към масив от типа str[x][y]. Интересното е обаче че с компилатори за PC става и съм го правил. Там обаче символите и на двете таблици се зареждат в RAM паметта, а тук искам символните масиви да са в ROMа. Явно от там някъде идва проблема. Аз си имам работещо решение - правя само един масив в който двата езика са последователно наредени и после според езика преизчислявам индекса - обаче никак не ми харесва това решение.


Пон Май 28, 2007 2:20 pm
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Пон Яну 09, 2006 11:32 am
Мнения: 276
Местоположение: Kozloduy
Мнение 
Ми не виждам какъв е проблема за тримерен масив :?: :?: :?:
str[x][y][z]


Пон Май 28, 2007 2:38 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Фев 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
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 27, 2006 12:37 pm
Мнения: 647
Местоположение: с. Згалево
Мнение 
Ами то в момента е така. Всички езици са подредени един след друг в един и същ масив. Имам функция която се вика всеки път когато се ползва индекс. Та аз си я викам с досегашните индекси сякаш масива е само за един език, а ако трябва да се ползва друг език - тя сама увеличава индекса с колкото е изместването до търсения език и връща реиндексирания индекс. Гадното е обаче че тая функция се вика често и излишно заема 1 ниво от стека и още куп други безмислени работи стават.
А и решението никак не подхожда на език като C. Няма начин да не става с указател - ама какво да се прави - за сега ще карам така. В случая не ми трябва бързодействие - ама ако трябваше какво щях да правя???


Пон Май 28, 2007 3:03 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Нямам вече инсталирам Hi-tech но по спомен как се работеше с това дърво :) .....
Код:
char **const  items;
const char * const it_en[3]={ "Str1",
"Str2",
"Str3"};
const char * const it_bul[3]={"Стр1",
"Стр2",
"Стр3"};


Но беше май малко бъгава работата там при работа с указател към указател.
Но така е когато от контролер се изисква функционалност като за процесор. И господ да слезе и да напише C компилатор за тази работа пак ще е гнила и бъглива история.


Пон Май 28, 2007 3:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ако има проблем търси го в компилатора. Аз на микрочипския C18 си го правя точно по класическия начин (**) и досега не съм имал проблем.
Макар, че Никола е прав, да правиш двумерни масиви от указатели на 16ка си е гърч по цялата линия - програмист, компилатор, желязо. То ще изяде памет...

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Май 28, 2007 4:13 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Май 17, 2006 4:22 pm
Мнения: 34
Местоположение: софия
Мнение 
juzisound написа:
Това горното е ясно. Няма проблем ако става въпрос за обикновенни масиви. Проблема идва от това - че стринговете са ми в многомерен масив от типа str[10][20] - примерно 10 стринга от по 20 символа. Искам да си направя 2 такива масива - единия символите за български - другия за английски. После с указател който мога да насочвам към единия лили другия масив да чета от едните или другите символи. Проблема е че незнам как да дефинирам указател към масив от типа str[x][y]. Интересното е обаче че с компилатори за PC става и съм го правил. Там обаче символите и на двете таблици се зареждат в RAM паметта, а тук искам символните масиви да са в ROMа. Явно от там някъде идва проблема. Аз си имам работещо решение - правя само един масив в който двата езика са последователно наредени и после според езика преизчислявам индекса - обаче никак не ми харесва това решение.


Указател към многомерен масив се дефинира така:

int array[40][30][20][10];

int (*array_ptrs)[30][20][10] = array;

Първата размерност не се указва (защото се дефинира указател).
Всъщност, в С няма многомерни масиви, а масиви от масиви (...от масиви и т.н.)


Пон Май 28, 2007 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
juzisound написа:
... Проблема идва от това - че стринговете са ми в многомерен масив от типа str[10][20] - примерно 10 стринга от по 20 символа. ...


това str[10[20] не е масив от стрингове а от символи !

ако все пак държиш да ги ползваш по тоя начин - колегата по-горе ти е обяснил как ...

мисля че забележките към C компилаторите в доста подобни случаи са неудачни !


Пон Май 28, 2007 5:39 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Май 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
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 21 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни