реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Снова вопросы новичка, Работа с массивом
Anjey_N
сообщение Feb 7 2007, 11:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Всем привет!
Вопрос такой:
Есть массив ind, состоящий с 8 элементов (типа char). Значения элементов могут изменятся в процессе выполнения программы. И эти значения необходимо выводить в порт на семисегментный индикатои с ОА.
Например в массиве есть элемент с порядковым номером 1, значение которого равно 9. Т.е. на индикатор нужно вывести 0х90. Как это сделать при динамической индикации?

unsigned char n=1;
// прерывание
{
PORTB=?
PORTD=~n;
n=n<<1;
if (n==0) n=1;
}
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 7 2007, 11:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Anjey_N @ Feb 7 2007, 15:15) *
Всем привет!...

Код
...
/* массив дисплея */
UCHAR Display_Array[DISPLAY_ARRAY_SIZE];
...
/* Прерывание от счетчика для обновления дисплея. Вызывается каждые 20 мс (50 Гц) */
__interrupt void display_isr(void) {
static UCHAR index = 0;
...
PORTB = Display_Array[index++];
if(DISPLAY_ARRAY_SIZE <= index)
      index = 0;
...
}


--------------------
Go to the top of the page
 
+Quote Post
$ilent
сообщение Feb 7 2007, 12:14
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296



Я делал вот так для свичера:

Код
visible_ink (i);  // показать канал

unsigned char s1[] = {0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};

void visible_ink (unsigned char i)
{
     PORTD = s1[i];

}
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 7 2007, 13:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Я делал проект с динамической индикацией. Проект расположен http://nix-06.nm.ru/
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Feb 8 2007, 12:44
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(SasaVitebsk @ Feb 7 2007, 14:58) *
Я делал проект с динамической индикацией. Проект расположен http://nix-06.nm.ru/


Скачал, разбираюсь. Спасибо
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Feb 12 2007, 11:22
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Хочу расширить свой вопрос.
В проекте используется DS1307.
Фрагменты кода:

typedef union
{
struct __TIMER__
{
unsigned char seconds;
unsigned char minutes;
unsigned char hours;
unsigned char day;
unsigned char date;
unsigned char mounth;
unsigned char year;
unsigned char control;
};
unsigned char tm[LENGHT_TIME_DATA];
}TIMER;

extern TIMER time;
Данные из RTC переписываются по команде:

// Читаем регистры DS1307
for(i = 0;i < LENGHT_TIME_DATA - 1;i++)
{
// Выставляем подтверждение ЕА
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while(!TESTBIT(TWCR,TWINT));
time.tm[i] = TWDR;
Показания хочу выводить в виде
часы,-,минуты,-,секунды или день недели, ,дата,месяц,год

Сформированы масивы
unsigned char array[2][number_max];
// Быстрое преобразование десятичной цифры в семисегментный образ
__flash const char indicator[12]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90,0xBF,0xF7};
// Быстрое преобразование адреса разряда в дешифрированное значение
__flash const char adr[number_max] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

я не придумал ничего лучше, как переписать данные:
array [0][0]=time.tm[0]&0x0F;
array [0][1]=time.tm[0]&0x70;
array [0][2]=defis;
array [0][3]=time.tm[1]&0x0F; и так далее

Вывод провожу вот так
// Обработка прерывания по таймеру ТС0
#pragma vector=TIMER0_OVF_vect
__interrupt void STROB (void)
{
unsigned char static cnt;
TCNT0=0x80; // Предварительная загрузка таймера
display=screen_off; // Выключить индикатор
if (!flag_data_time)
{ // показываем [часы - минуты - секунды]
if (!((cnt==2)||(cnt==4)))
{
display=indicator[array[0][cnt]];
strob=adr[cnt];
}
else
{
display=indicator[array[0][10]]; // показываем --
strob=adr[cnt];
}
}
else
{ // показываем [день недели _ число. месяц. год]
if (!(cnt==6)||(cnt==4)||(cnt==2))
{
display=indicator[array[1][cnt]];
strob=adr[cnt];
}
else
{
if (cnt==6)
{
display=indicator[array[1][11]]; // добавляем пробел после дня недели
здесь предупреждение
strob=adr[cnt];
}
else
{
display=indicator[array[0][cnt]]&0x7F; // добавляем число и месяц с точкой
strob=adr[cnt];
}
}
}
cnt++;
if (cnt==8) cnt=0;
}
Компилятор выдаёт предупреждение Warning[Pe175]: subscript out of range Что это? И можно ли сделать попроще?
Извините, что нагружаю большим кодом! help.gif
Go to the top of the page
 
+Quote Post
_Bill
сообщение Feb 12 2007, 11:44
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Anjey_N @ Feb 12 2007, 11:22) *
Хочу расширить свой вопрос.
Компилятор выдаёт предупреждение Warning[Pe175]: subscript out of range Что это? И можно ли сделать попроще?

Вы пытаетесь обратиться к элементу массива по индексу, который получается больше чем имеется элементов в массиве. Скажем, если у Вас в массиве 11 элементов, то значение индекса не должно быть больше 10 (0...10).
С кодом разбираться не стал. Думаю, что делать Вы быстрее сами определите.
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Feb 12 2007, 12:15
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



спасибо
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.03216 секунд с 7
ELECTRONIX ©2004-2016