Вот, простейший пример (арифметика) (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Vinogradov Alexei 15 сентября 2004 г. 15:19
В ответ на: Ответ: Я начинающий !!! отправлено Sasha NT 15 сентября 2004 г. 14:49

#include <90s4433.h>
#include
#include

//Здесь объявлены глобальные переменные
//Номер отображаемой на индикаторе цифры (Самая правая цифра индикатора имеет номер "5"
unsigned char digit_number;

//Изображения цифр на индикаторе, а также десятичной точки и знака "минус"
flash unsigned char pictures_array[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00,0x00,0x00,0x02,0x01};

//Маски для включения цифр индикатора
flash unsigned char digits_array[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

const flash unsigned char x_title[]="X=";
const flash unsigned char y_title[]="Y=";
const flash unsigned char plus_title[]="X+Y=";
const flash unsigned char minus1_title[]="X-Y=";
const flash unsigned char minus2_title[]="Y-X=";
const flash unsigned char mul_title[]="X*Y=";
const flash unsigned char div1_title[]="X/Y=";
const flash unsigned char div2_title[]="Y/X=";

//Буфер индикатора
char screen_bufer[]={0x00,0x00,0x00,0x00,0x00,0x00};

//Строки, в которые запишется результат преобразования "float -> string"
unsigned char x_screen[10], y_screen[10], z_screen[10];

//Параметр цикла
unsigned char i;

//Переменные, участвующие в математических операциях
float x, y, z;

//Функция выводит в порт переменную
void variable_display (unsigned char *start_addr)
{
for (i=0;i<10;i++){
if (*(start_addr+i)==0) {
putchar(13);
putchar(10);
return;
};
putchar(*(start_addr+i));
};
}

//Функция отключает все цифры индикатора
void all_off (void)
{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=1;
PORTC.4=1;
PORTC.5=1;
}

//Функция зажигает только те сегменты индикатора, которые необходимы в данный момент
void get_symbol (unsigned char symbol)
{
if (symbol&0x80) PORTB.0=1; else PORTB.0=0;
if (symbol&0x40) PORTB.1=1; else PORTB.1=0;
if (symbol&0x20) PORTB.2=1; else PORTB.2=0;
if (symbol&0x10) PORTB.3=1; else PORTB.3=0;
if (symbol&0x08) PORTB.4=1; else PORTB.4=0;
if (symbol&0x04) PORTB.5=1; else PORTB.5=0;
if (symbol&0x02) PORTD.6=1; else PORTD.6=0;
if (symbol&0x01) PORTD.7=1; else PORTD.7=0;
}

//Обработчик по переполнению таймера 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//Локальные переменные обработчика
TCNT0=0xfa; //Прерывание каждые 1,54 миллисекунды
all_off(); //Погасить все цифры индикатора
//Вывести на индикатор соответствующий символ
get_symbol(pictures_array[0x0f & screen_bufer[5 - digit_number]]);
//Зажечь требуемую цифру
PORTC=digits_array[digit_number];
//К следующей отображаемой цифре
digit_number++;
//Если было отображено 6 цифр, снова отображать нулевую цифру
if (digit_number==6) digit_number=0;
}

void main(void)
{
//Локальные переменные функции "main"

//Настройка порта "B":
// Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTB=0x00;
DDRB=0x3F;

//Настройка порта "C":
// Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTC=0x3F;
DDRC=0x3F;

//Настройка порта "D":
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In
// State7=1 State6=1 State5=1 State4=0 State3=0 State2=P State1=P State0=P
PORTD=0b00111111;
DDRD=0b11000000;

//Настройка таймера-счетчика "0"
// Clock source: System Clock
TCCR0=0x05; //Частота тактирования таймера равна 4000000/1024 Гц
TCNT0=0xFA; //В секунду происходит около 650 прерываний от таймера-счетчика "0"

//Настройка таймера-счетчика "0"
TCCR1A=0x00; //Не использовать ШИМ и отключить таймер от "OC1"
TCCR1B=0x00; //Остановить таймер "1"
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;

GIMSK=0x00; //Запретить внешние прерывания: INT0 и INT1
MCUCR=0x00;

TIMSK=0x02; //Разрешить прерывания от таймера-счетчика "0"

UBRRHI=0x00;

UBRR=4000000/16/9600-1;
UCSRB=0x08; //Разрешить использование передатчика и запретить работу приемника

ACSR=0x80; //Выключить компаратор

digit_number=0; //Вначале отображается нулевая (самая левая) цифра индикатора
screen_bufer[0]=0x2d;
screen_bufer[5]=0x2e;

#asm("sei") //Взвести флажок глобального разрешения прерываний
//(после включения МК он сброшен)

x=3.1415926;
ftoa(x, 3, x_screen);
y=2.7182818;
ftoa(y, 3, y_screen);

//Вывод в порт строки "X="
for (i=0;i//Вывод в порт переменной "X"
variable_display(&x_screen[0]);

//Вывод в порт строки "Y="
for (i=0;i//Вывод в порт переменной "Y"
variable_display(&y_screen[0]);

//Сумма
z=x+y;
ftoa(z, 3, z_screen);
//Вывод в порт строки "X+Y="
for (i=0;i//Вывод в порт переменной суммы переменных
variable_display(&z_screen[0]);

//Разность1
z=x-y;
ftoa(z, 3, z_screen);
//Вывод в порт строки "X-Y="
for (i=0;i//Вывод в порт разности переменных
variable_display(&z_screen[0]);

//Разность2
z=y-x;
ftoa(z, 3, z_screen);
//Вывод в порт строки "Y-X="
for (i=0;i//Вывод в порт разности переменных
variable_display(&z_screen[0]);

//Произведение
z=x*y;
ftoa(z, 3, z_screen);
//Вывод в порт строки "X*Y="
for (i=0;i//Вывод в порт разности переменных
variable_display(&z_screen[0]);

//Частное1
z=x/y;
ftoa(z, 3, z_screen);
//Вывод в порт строки "X/Y="
for (i=0;i//Вывод в порт разности переменных
variable_display(&z_screen[0]);

//Частное2
z=y/x;
ftoa(z, 3, z_screen);
//Вывод в порт строки "Y/X="
for (i=0;i//Вывод в порт разности переменных
variable_display(&z_screen[0]);

//Бесконечный цикл
while (1){
};
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru