|
#include <90s4433.h> //Здесь объявлены глобальные переменные //Изображения цифр на индикаторе, а также десятичной точки и знака "минус" //Маски для включения цифр индикатора const flash unsigned char x_title[]="X="; //Буфер индикатора //Строки, в которые запишется результат преобразования "float -> string" //Параметр цикла //Переменные, участвующие в математических операциях //Функция выводит в порт переменную //Функция отключает все цифры индикатора //Обработчик по переполнению таймера 0 void main(void) //Настройка порта "B": //Настройка порта "C": //Настройка порта "D": //Настройка таймера-счетчика "0" //Настройка таймера-счетчика "0" GIMSK=0x00; //Запретить внешние прерывания: INT0 и INT1 TIMSK=0x02; //Разрешить прерывания от таймера-счетчика "0" UBRRHI=0x00; UBRR=4000000/16/9600-1; ACSR=0x80; //Выключить компаратор digit_number=0; //Вначале отображается нулевая (самая левая) цифра индикатора #asm("sei") //Взвести флажок глобального разрешения прерываний //Вывод в порт строки "X=" //Разность2 //Частное2 //Бесконечный цикл
E-mail:
info@telesys.ru
#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 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};
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;
}
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;
}
{
//Локальные переменные функции "main"
// 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;
// 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;
// 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;
// Clock source: System Clock
TCCR0=0x05; //Частота тактирования таймера равна 4000000/1024 Гц
TCNT0=0xFA; //В секунду происходит около 650 прерываний от таймера-счетчика "0"
TCCR1A=0x00; //Не использовать ШИМ и отключить таймер от "OC1"
TCCR1B=0x00; //Остановить таймер "1"
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;
MCUCR=0x00;
UCSRB=0x08; //Разрешить использование передатчика и запретить работу приемника
screen_bufer[0]=0x2d;
screen_bufer[5]=0x2e;
//(после включения МК он сброшен)
x=3.1415926;
ftoa(x, 3, x_screen);
y=2.7182818;
ftoa(y, 3, y_screen);
for (i=0;i
variable_display(&x_screen[0]);
//Вывод в порт строки "Y="
for (i=0;i
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]);
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]);
z=y/x;
ftoa(z, 3, z_screen);
//Вывод в порт строки "Y/X="
for (i=0;i
variable_display(&z_screen[0]);
while (1){
};
}
Ответы