|
динамическая индикация, вывод децимиальной точки |
|
|
|
Jan 24 2011, 13:00
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901

|
Добрый день Необходим совет. на 4-х разрядный 7-сегментый индикатор выводиться произвольное число 0-9999, необходимо во втором разряде включать децимиальную точку т.е. 0,0-999,9. как я понимаю необходимо создать ещё один массив цифр только с точкой, но как сделать что бы этот массив использовалься только для второго разряда или для любого другого? код для CVAVR Код Chip type : ATtiny2313 Clock frequency : 8,000000 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/
#include <tiny2313.h> #include <delay.h>
#define digit1 PORTD.5 // разряд 4 #define digit2 PORTD.4 // разряд 3 #define digit3 PORTD.1 // разряд 2 #define digit4 PORTD.0 // разряд 1
flash char digits []= { //создаём массив с цифрами 0x3F, //0 0x06, //1 0x5B, //2 0x4F, //3 0x66, //4 0x6D, //5 0x7D, //6 0x07, //7 0x7F, //8 0x6F, //9 0x40, //знак минуса 0x00 //пустота }; char digit_out[4], cur_dig; //переменные для работы с LED
unsigned int indication; //переменная для хранения чисел unsigned int x; void recoding(void) { //функция для перекодировки из hex в dec if (indication<10000) //начинаем преобразование если число < 1000 так как 4-х разрядный LED { digit_out[0]=indication%10; //Делим на 10, остаток записываем в масив 1-разряд indication=indication/10; //Оставляем 3 разряда digit_out[1]=(indication%10); //Делим на 10, остаток записываем в масив 2-разряд indication=(indication/10); //Оставляем 2 разряда digit_out[2]=indication%10; //Делим на 10, остаток записываем в масив 3-разряд indication=(indication/10); //Оставляем 1 разряда digit_out[3]=indication%10; //Делим на 10, остаток записываем в масив 4-разряд } }
//таймер 0 interrupt [TIM0_OVF] void timer0_ovf_isr(void) { PORTB=0x00; //чтобы предотвратить эффект “тени” на соседних индикаторах switch (cur_dig){ case 0:{digit1=0; digit2=0; digit3=0; digit4=1; break;}; //подаём питание на разряд 1, гасим остальные разряды case 1:{digit4=0; digit2=0; digit1=0; digit3=1; break;}; //подаём питание на разряд 2, ггасим остальные разряды case 2:{digit3=0; digit1=0; digit4=0; digit2=1; break;}; //подаём питание на разряд 3, гасим остальные разряды case 3:{digit2=0; digit3=0; digit4=0; digit1=1; break;}; //подаём питание на разряд 3, гасим остальные разряды } PORTB=digits[digit_out[cur_dig]]; //выводим с каждым срабатыванием таймера число с массива в порт В, но не для всех разрядов сразу
cur_dig++; //с каждым срабатыванием таймера, увеличиваем переменную cur_dig на 1 if(cur_dig==4) cur_dig=0; //если cur_dig = 4 обнуляем
} void main(void) { // Declare your local variables here
// Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
// Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00;
// Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0xFF;
// Port D initialization // Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out // State6=T State5=0 State4=0 State3=P State2=P State1=0 State0=0 PORTD=0x0C; DDRD=0x33;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 8000,000 kHz // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x01; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02;
// Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;
// Global enable interrupts #asm("sei") while (1) { x++; delay_ms(100); if(x>9999) x=0; indication=x; recoding(); }; }
|
|
|
|
|
 |
Ответов
|
Jan 25 2011, 14:24
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(RicLab @ Jan 25 2011, 18:19)  что то тема начала уходить в область схемотехники, а не программирования. Дык потому, что программистские проблемы вроде уже решены Цитата(RicLab @ Jan 24 2011, 21:00)  проверил работает. Но остались схемотехнические недоработки Цитата(RicLab @ Jan 24 2011, 21:00)  но появилась слабая засветка соседних разрядов.
|
|
|
|
Сообщений в этой теме
RicLab динамическая индикация Jan 24 2011, 13:00 ukpyr В буфере индикации можно хранить не цифры а символ... Jan 24 2011, 13:28 RicLab поясните?
в массиве они и так находяться в 8 сегме... Jan 24 2011, 14:25 rezident Цитата(RicLab @ Jan 24 2011, 19:23) в мас... Jan 24 2011, 14:26 RicLab читайте начало темы. Jan 24 2011, 14:30 rezident Я прочитал. С самого начала. Вам был дан совет опе... Jan 24 2011, 14:40 RicLab извиняюсь я не совсем понял как это воплотить в ко... Jan 24 2011, 14:49 toweroff Цитата(RicLab @ Jan 24 2011, 17:49) извин... Jan 24 2011, 15:03 rezident Нет времени и желания, чтобы кормить вас бесплатно... Jan 24 2011, 15:09 RicLab т.е. например если нужно вывести второй разряд с т... Jan 24 2011, 15:16 Сергей Борщ QUOTE (RicLab @ Jan 24 2011, 17:16) т.е. ... Jan 24 2011, 15:40 RicLab Спасибо за подсказку
проверил работает.
Кодvoi... Jan 24 2011, 16:00 _Pasha Цитата(RicLab @ Jan 24 2011, 19:00) но по... Jan 24 2011, 20:07 RicLab с проблемой разобрался, причина в неправильной нас... Jan 25 2011, 03:33 Сергей Борщ QUOTE (RicLab @ Jan 25 2011, 05:33) слишк... Jan 25 2011, 07:30 RicLab это германиевые что-ли?
вот схема
может стоит ... Jan 25 2011, 10:29 Сергей Борщ QUOTE (RicLab @ Jan 25 2011, 12:29) вот с... Jan 25 2011, 11:38 rezident Цитата(RicLab @ Jan 25 2011, 15:29) может... Jan 25 2011, 13:07 RicLab возможно, прикинул по грубым расчётам нужно около ... Jan 25 2011, 12:21 RicLab что то тема начала уходить в область схемотехники,... Jan 25 2011, 13:19 Сергей Борщ QUOTE (RicLab @ Jan 25 2011, 15:19) что т... Jan 25 2011, 14:21 МП41 В процедуре смены разряда я сначала гашу все сегме... Jan 25 2011, 14:17 RicLab ЦитатаФорум как бы профессиональный. Негоже криво ... Jan 25 2011, 16:27 rezident Цитата(RicLab @ Jan 25 2011, 21:27) 50-60... Jan 25 2011, 17:12 ukpyr Цитата100Гц это необходимый минимум.почему ? 60-70... Jan 25 2011, 17:33 rezident Цитата(ukpyr @ Jan 25 2011, 22:33) почему... Jan 25 2011, 17:55 RicLab Цитатапочему ? 60-70Гц нормально
порог инерционнос... Jan 25 2011, 23:01 МП41 Цитата(RicLab @ Jan 26 2011, 01:01) порог... Jan 25 2011, 23:04 Сергей Борщ QUOTE (RicLab @ Jan 26 2011, 01:01) в ЭЛТ... Jan 26 2011, 08:36 RicLab ЦитатаМеньше будет мелькать при съёмке камерой
так... Jan 26 2011, 00:04
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|