глобальные переменные
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
глобальные переменные
Как сделать глобальную переменную в CCS pic чтоби она была выдна изовсех функций.
Да кстате как передать строку в функцию или масив из чисел в функцию.
Да кстате как передать строку в функцию или масив из чисел в функцию.
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Перемение глобальные
Объявить её вне функций.чтоби она была выдна изовсех функций
Через указатель.как передать строку в функцию
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: Перемение глобальные
Делал вот так
врезультате херня в регистре 4 значное 16ое число но никак не строка символов
Код: Выделить всё
void enterkey (char* pas)
{
...
if input[i]=pas[i]
...
}
void main()
{
...
char pas[5]=" ";
enterkey (pas);
...
}
Re: Перемение глобальные
Хоть я и знаю что не правильно, но еще так можно void Function (char data[])
Потом Function("Всякая фигня"). Но крайне не рекомендуется.
Потом Function("Всякая фигня"). Но крайне не рекомендуется.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Перемение глобальные
char *pas=" ";
или
char pas[5]={0x20,0x20,0x20,0x20,0x20};
в первом случае выделится 6 байт - последний - завершающий 0.
или
char pas[5]={0x20,0x20,0x20,0x20,0x20};
в первом случае выделится 6 байт - последний - завершающий 0.
- Реклама
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: Перемение глобальные
void Function (char data[])
При етом всеодно херня получается.
перед вызовом етой функции прописоваю наподобе етой, строку char pas[5]={0x20,0x20,0x20,0x20,0x20};
получается набор символов (отображает матлаб) но после передачи етой строки в функцию (точнее процедура так как результатов она не вертает) получается херня и введеная строка несовпадает из строкой которую передаю в функцию.
При етом всеодно херня получается.
перед вызовом етой функции прописоваю наподобе етой, строку char pas[5]={0x20,0x20,0x20,0x20,0x20};
получается набор символов (отображает матлаб) но после передачи етой строки в функцию (точнее процедура так как результатов она не вертает) получается херня и введеная строка несовпадает из строкой которую передаю в функцию.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Перемение глобальные
Херню в студию !
Хочу деталей.
Хочу деталей.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Перемение глобальные
и это правильно! херней пусть маются в студии, а детали мы пустим в делоurry писал(а):Херню в студию !
Хочу деталей.
битва с дураками проиграна, победители торжествуют. слава победителям!
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: Перемение глобальные
Не вопрос:
void enterkey (char password[]) -- вот ето не работает чо делать?
Код: Выделить всё
#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A
//#INCLUDE <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring)
{
int8 c=1;
if (ring==1)
{
output_high (PIN_B1);
delay_us (10);
output_low (PIN_B1);
}
else
do
{
c=c+1;
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
}
while (c==5);
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<=7;++i)
{
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
}
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int8 i)
{
char word[1];
word[1]=read_eeprom(i);
return (word);
}
void setpassword (void)
{
}
void enterkey (char password[])
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
{
for (i=1;i<=5;++i)
{
key[i]=keybord();
delay_us(5);
}
for (i=0;i<=5;++i)
{
if (key[i]==password[i])
{}
else
p=1;
}
if (p=0)
open ();
}
}
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<=5;++i)
{
password[i]=rpEEPROM(i);
}
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
{
enterkey (password);
}
}
}
}
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Перемение глобальные
ну что в глаза бросается ?
переполнение массива здесь
for (i=1;i<=5;++i)
{
key=keybord();
все-таки 6 символов читаете вместо 5 (
key[5] - это 6 символ, а объявили 5 символьный массив)
при чтении из еепром происходит что-то странное
char rpEEPROM(int8 i)
{
char word[1];
word[1]=read_eeprom(i);
return (word);
}
хотя бы так
char rpEEPROM(int8 i)
{
return read_eeprom(i);
}
и чтобы не путаться с массивами, дайте другое имя
void enterkey (char *cArray)
{
for (i=0;i<=5;++i)
{
if (key==cArray)
рекомендую объявлять функции, а не переносить их вверх от main
Да, и никаких абсолютных значений в тексте.
переполнение массива здесь
for (i=1;i<=5;++i)
{
key=keybord();
все-таки 6 символов читаете вместо 5 (
key[5] - это 6 символ, а объявили 5 символьный массив)
при чтении из еепром происходит что-то странное
char rpEEPROM(int8 i)
{
char word[1];
word[1]=read_eeprom(i);
return (word);
}
хотя бы так
char rpEEPROM(int8 i)
{
return read_eeprom(i);
}
и чтобы не путаться с массивами, дайте другое имя
void enterkey (char *cArray)
{
for (i=0;i<=5;++i)
{
if (key==cArray)
рекомендую объявлять функции, а не переносить их вверх от main
Да, и никаких абсолютных значений в тексте.
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Перемение глобальные
а вот это, очевидно, работает:Transistor писал(а):void enterkey (char password[]) -- вот ето не работает чо делать?
Код: Выделить всё
void ring (int* ring)
{
int8 c=1;
if (ring==1)
{.......читать букварь по Си - срочно!!!!
битва с дураками проиграна, победители торжествуют. слава победителям!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Перемение глобальные
Так Вы поймите (хотябы логику включите), что в ф-ию передаётся не весь массив, а только его указатель ! Естественно, при входе в ф-ию, там ничего не будет. Точнее будет, по Вашему - "херня".Transistor писал(а):но после передачи етой строки в функцию (точнее процедура так как результатов она не вертает) получается херня и введеная строка несовпадает из строкой которую передаю в функцию.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Перемение глобальные
Да кстати. Человек использует указатели там, где не нужно и не использует там, где нужно.Мастер Ломастер писал(а):а вот это, очевидно, работает:
?????
Re: Перемение глобальные
И еще... По-человечески форматируте код, пожалуйста. А то читать дюже неудобно, не видно границ логических блоков.
Я такую мешанину в седьмом классе на Паскале писал.
Я такую мешанину в седьмом классе на Паскале писал.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Перемение глобальные
#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A
//#INCLUDE <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring)
{
int8 c=1;
if (ring==1) Такая проверка необязательна. В С любое ненулевое условие считается истинным. if (ring) ...
{
output_high (PIN_B1); Лучше явно работать с портами, и по возможности не использовать компиляторо- и библиотекозависимых макросов.
delay_us (10);
output_low (PIN_B1);
}
else
do
{
c=c+1; Можно писать с++
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
}
while (c==5); Странное условие. do {} while(); работает не так, как Паскалевский repeat ... until. Условие в while() - условие выполнения, а не прекращения работы. Т.е., если необходимо выполнять, пока значение с не станет равным 5, следует писать while (c!=5)
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<=7;++i) Опять же, я вижу влияние Паскаля на неокрепший разум. Когда хотят повторить семь раз, обычно пишут так: for (i=0; i<7; i++) Вообще, в С вся нумерация начинается с нуля, как в железе
{
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
}
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int8 i)
{
Ну, про этот шедевр уже до меня говорили
char word[1];
word[1]=read_eeprom(i);
return (word);
}
void setpassword (void)
{
}
void enterkey (char password[])
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
{
for (i=1;i<=5;++i)
{
key=keybord();
delay_us(5);
}
for (i=0;i<=5;++i)
Таки переполнение. Нумерация в С начинается с нуля...
{
if (key==password)
{}
Почему бы сразу не написать if (key!=password) ?
else
p=1;
}
if (p=0) if (p==0) ... Просто ошибка
open ();
}
}
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<=5;++i) И опять переполнение. Это не Паскаль.
{
password=rpEEPROM(i);
}
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок Кстати, там для звонка каие-то ж больно маленькие интервалы... В микросекундах...
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
{
enterkey (password);
}
}
}
}
#INCLUDE <16F84A.h>
//#device PIC16F84A
//#INCLUDE <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring)
{
int8 c=1;
if (ring==1) Такая проверка необязательна. В С любое ненулевое условие считается истинным. if (ring) ...
{
output_high (PIN_B1); Лучше явно работать с портами, и по возможности не использовать компиляторо- и библиотекозависимых макросов.
delay_us (10);
output_low (PIN_B1);
}
else
do
{
c=c+1; Можно писать с++
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
}
while (c==5); Странное условие. do {} while(); работает не так, как Паскалевский repeat ... until. Условие в while() - условие выполнения, а не прекращения работы. Т.е., если необходимо выполнять, пока значение с не станет равным 5, следует писать while (c!=5)
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<=7;++i) Опять же, я вижу влияние Паскаля на неокрепший разум. Когда хотят повторить семь раз, обычно пишут так: for (i=0; i<7; i++) Вообще, в С вся нумерация начинается с нуля, как в железе
{
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
}
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int8 i)
{
Ну, про этот шедевр уже до меня говорили
char word[1];
word[1]=read_eeprom(i);
return (word);
}
void setpassword (void)
{
}
void enterkey (char password[])
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
{
for (i=1;i<=5;++i)
{
key=keybord();
delay_us(5);
}
for (i=0;i<=5;++i)
Таки переполнение. Нумерация в С начинается с нуля...
{
if (key==password)
{}
Почему бы сразу не написать if (key!=password) ?
else
p=1;
}
if (p=0) if (p==0) ... Просто ошибка
open ();
}
}
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<=5;++i) И опять переполнение. Это не Паскаль.
{
password=rpEEPROM(i);
}
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок Кстати, там для звонка каие-то ж больно маленькие интервалы... В микросекундах...
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
{
enterkey (password);
}
}
}
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: глобальные переменные
Все ошибки которые вы описали поправил сделал лучшую читаемость но с указателями (*) и ссылками (&) так и нерозибрався работает. Кстати по чтению пароля с постоянной памяти, переменная i используемой непередаэться правильно только "0" передается хотя возвращается обратно нормально в вызывающую функцию. Относительно пауз вигладжу позже поставил так чтобы пауза была по меньше для отладки.
Так я учил Паскал немного мусора оттуда происходит.Возможно если бы первым языком был бы С проблем было бы поменьше, я так думаю.
П.С. А как сделать чтоби код розворачивалса при нажатии например "+" эсть такое в некоторих форумах если текст большой?
Так я учил Паскал немного мусора оттуда происходит.Возможно если бы первым языком был бы С проблем было бы поменьше, я так думаю.
Код: Выделить всё
#if defined(__PCM__)
#INCLUDE <16F84A.h>
//#device PIC16F84A
#fuses HS,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
#endif
void ring (int* ring);
void open (void);
unsigned int keybord (void);
char rpEEPROM(int8* i);
void setpassword (void);
void enterkey (char* password);
void main()
{
char password[5]={0x64,0x64,0x64,0x64,0x64};
int8 i;
SET_TRIS_A ( 0x1C ); //RA2,RA3,RA4-In
SET_TRIS_B ( 0xF1 ); //RA0,RA1-Out
output_low (PIN_A0); //RB1,RB2,RB3-Out
output_low (PIN_A1); //RB0,RB4,RB5,RB6,RB7-In
output_low (PIN_B1);
output_low (PIN_B2);
output_low (PIN_B3);
output_low (PIN_B7);
for (i=0;i<4;++i)
{
password[i]=rpEEPROM(i);
}
if (!input(PIN_B5))
setpassword ();//запис коду
else
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
enterkey (&password);
}
}
}
void ring (int* ring)
{
int8 c=1;
if (ring)
{
output_high (PIN_B1);
delay_us (10);
output_low (PIN_B1);
}
else
do
{
++c;
output_high (PIN_B1);
delay_us (1);
output_low (PIN_B1);
}
while (c!=5);
}
void open(void)
{
output_high (PIN_B2);
output_high (PIN_B3);
ring (2);
delay_us (10);
output_low (PIN_B2);
output_low (PIN_B3);
}
unsigned int keybord (void)
{
int8 key=0,i;
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
output_high (PIN_A0);//S1
output_high (PIN_A1);//CLK
output_low (PIN_A1);//CLK
output_low (PIN_A0);//S1
if(input(PIN_A2))
bit_set (key,0);
for (i=1;i<7;++i)
{
output_high (PIN_A1);
output_low (PIN_A1);
if(!input(PIN_A2))
bit_set (key,i);
}
output_high (PIN_B7);
output_low (PIN_B7);
return (key);
}
char rpEEPROM(int *i)
{
return read_eeprom(&i);
}
void setpassword (void)
{
//////////////////////
}
void enterkey (char* password)
{
char key[5];
int8 i,p=0;
key[0]=keybord();//клавіатура
if (key[0]!=0)
{
for (i=0;i<4;++i)
{
key[i]=keybord();
delay_us(5);
}
for (i=0;i<4;++i)
{
if (key[i]!=password[*i])
p=1;
}
if (p==0)
open ();
}
}
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: глобальные переменные
Пожалуста помагите
-
Transistor
- Прорезались зубы
- Сообщения: 209
- Зарегистрирован: Пт авг 27, 2010 18:05:09
Re: глобальные переменные
Как чем немогу передать в функцию масив из символов.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: глобальные переменные
Вам ответов, которые здесь были, мало ?Transistor писал(а):немогу передать в функцию масив из символов.
PS: И пишите нормально, по Русски, со знаками препинания и без ошибок. Противно читать Ваши посты.


