|
|
  |
Поделитесь примером динамической индикации на Си, Хочется сделать правильно |
|
|
|
Sep 21 2006, 07:36
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704

|
Цитата(Pyku_He_oTTyda @ Sep 20 2006, 20:27)  Собственно вопрос в названии темы. Алгоритм понятен, но хочется посмотреть, как делают профи. На роль МегаПрофи не претендую, но делал это так (см. прилагаемые файлы) Устройство - 14-циферный светодиодный дисплей. Цифры - с общими анодами. В приложении - схема и программа для устройства. Сделано на AT89C2051, но код может быть перенесен на АВР. Отображение - в таймерном прерывании Timer0_int, которое возникает с частотой приблизительно 14 х 50Гц = 700Гц (дабы не видеть мигания) P.S. 2Гуру: Сильно не пинать - писал это года 4 назад - взял как есть. В настоящее время работают сотни данных устройств во всех концах государства великого :-)) Не ту схему прикрепил. Теперь правильная!
Сообщение отредактировал ALexx - Sep 21 2006, 08:00
Прикрепленные файлы
disp1.rar ( 70.36 килобайт )
Кол-во скачиваний: 984
|
|
|
|
|
Sep 21 2006, 12:49
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
примерно так создаю индикацию. Сразу извеняюсь если, чтото забыл но общий принцип следующий:
// знакогенератор для анодов(какие сигменты зажигать) unsigned char __flash indicator[]={0X7E,0X30,0X6D,0X79,0X33,0X5b,0X5F,0X70,0X7F,0X7B,0X4E}; // выбор номера разряда ( unsigned char __flash catodIn[]={0XF7,0XFB,0XFD,0XFE,0XEF,0XDF}; //буфер индикатора unsigned char buferInd[6]; unsigned char __flash *p_ind;
// функция записи в индикатор void IndicatorSave(unsigned char par1,unsigned char par2,unsigned char par3,unsigned char par4,unsigned char par5,unsigned char par6);
// так записываю в индикатор void IndicatorSave(unsigned char par1,unsigned char par2,unsigned char par3,unsigned char par4,unsigned char par5,unsigned char par6) { buferInd[0]=par6; buferInd[1]=par5; buferInd[2]=par4; buferInd[3]=par3; buferInd[4]=par2; buferInd[5]=par1; //первый символ }
//далее обслуживаю индикатор примерно так INDI_PORT=0; //гасим сигменты чтобы не было мерцания
// далее идет код обслуживания клавиатуры . . . //выбераю новую позициюпозицию знакоместа ind.catod++; if(ind.catod==5) { ind.catod=0; }
//включаю новое знакоместо CATOD_PORT=catodIn[ind.catod];
// включаю сегменты согласно знакоместу INDI_PORT=*(p_ind+buferInd[ind.catod]);
Примерно так
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Sep 21 2006, 12:50
|

Участник

Группа: Новичок
Сообщений: 25
Регистрация: 17-09-06
Из: Kyiv
Пользователь №: 20 469

|
Цитата(Pyku_He_oTTyda @ Sep 21 2006, 13:00)  А устройсто простое (тестер): некий привод для запорного механизма на трубе (для крана), у которого на борту 8 или 10 битный АЦП. Коробочка связана по двум линяям по 485, по одной линии в привод идут СИ, по другой возвращаются данные. Задача вывести на трехэлементный семисегментник значение кода, получаемого от устройства. Создаешь кодовую таблицу от своих сегментов. Типа как: Код const uchar KodePage[] = {0x7E, 0x06, 0xDA, 0x9E, 0xA6, 0xBC, 0xFC, 0x0E, 0xFE, 0xBE, 0xEE, 0xF4, 0x78, 0xD6, 0xF8, 0xE8, 0x10, 0xE6, 0x80, 0x16, 0x70, 0xC4, 0xD4, 0xEA, 0xC0, 0xAA, 0xF0, 0x76, 0x54, 0xB6, 0x6E, 0x00}; Создаешь переменную для буфера, типа: uchar LcdBuff[]={0,0,0}; Можешь вместо 0 инициальные значения написать (на загрузку покажет  ) А затем по таймеру выкидываешь по одному разряду. Только частоту прерывания таймера подбери чтоб не мигала. Вот кусок от драйвера ЖКИ, у тебя почти тоже самое будет: Код #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TimeX++; //Для анализа времени вывода по SPI
switch(TimeX&0xF) { ///---------------Группа операций вывода на LCD case 0:{ //Out LCD Data - main Out wPB.o_LCD = 0;//800us PORTB = *(uchar *) &wPB; break;};// end case 2 case 4:{//Out LCD Data - main Out SPDR = LcdBuff[--LCD_PTR]; if (!LCD_PTR) {LCD_PTR = 24;}; break;};// end case 2 case 14:{//Out LCD - Formirovanie signala LOAD wPB.o_LCD = (LCD_PTR&0x07)?0:1; PORTB = *(uchar *) &wPB; break;};//end case 34 };//end switch PORTB ^=0x02; TCNT0 = 0xD7; //reload counter value }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|