Код: Выделить всё
#include "IOSTM8S103F3.h"
volatile unsigned short z=0, x=0, y=111,L_1,L_2,L_3;
volatile int m=0, t;
volatile char i=1,j=0,n=0,k=1;
void DELENIE()
{
L_3=y/1000;//3300/1000=3
L_2=(y-(L_3*1000))/100; //3300-3*1000=300
L_1=(y-(L_3*1000))-(L_2*100); //(3300-(3*1000))-(3*100)
}
char ZNAK[8] =
{ //0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
1,0, 1,0, 1,0, 0,1 //7
};
char DIGIT[11][2][8] =
{
{ // 0
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 0,1, 1,0}, //7 (0)
{0,1, 1,0, 0,1, 0,1} //t (1)
},
{ // 1
//1 2 3 4 5 6 7 8
//12 11 10 09
{1,0, 0,1, 0,1, 1,0}, //7 (0)
{1,0, 1,0, 1,0, 1,0} //t (1)
},
{ // 2
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 1,0, 1,0}, //7 (0)
{1,0, 0,1, 0,1, 0,1} //t (1)
},
{ // 3
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 0,1, 1,0}, //7 (0)
{1,0, 0,1, 1,0, 0,1} //t (1)
},
{ // 4
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{1,0, 0,1, 0,1, 1,0}, //7 (0)
{0,1, 0,1, 1,0, 1,0} //t (1)
},
{ // 5
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 1,0, 0,1, 1,0}, //7 (0)
{0,1, 0,1, 1,0, 0,1} //t (1)
},
{ // 6
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 1,0, 0,1, 1,0}, //7 (1)
{0,1, 0,1, 0,1, 0,1} //t (0)
},
{ // 7
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 0,1, 1,0}, //7 (0)
{1,0, 1,0, 1,0, 1,0} //t (1)
},
{ // 8
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 0,1, 1,0}, //7 (0)
{0,1, 0,1, 0,1, 0,1} //t (1)
},
{ // 9
//0 1 2 3 4 5 6 7
//1 2 3 4 5 6 7 8
//12 11 10 09
{0,1, 0,1, 0,1, 1,0}, //7 (0)
{0,1, 0,1, 1,0, 0,1} //t (1)
},
{ // PUSTO
{1,0, 1,0, 1,0, 1,0}, //13 (0)
{1,0, 1,0, 1,0, 1,0} //14 (1)
},
};
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_interrupt(void)
{
TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
k++;
t++;
if (k == 9)
{
k=1;
}
j=k-1;
}
void com_D12()
{
PC_DDR_bit.DDR3 = 0; // Вход com D9
PC_CR1_bit.C13 = 0; // Подтягивающий резистор отключен
PC_ODR_bit.ODR6 = 1; // Высокий уровень на выходе
PC_CR1_bit.C16 = 1; // push-pull
PC_DDR_bit.DDR6 = 1; // Выход com D12
}
void com_D12_()
{
PC_ODR_bit.ODR6 = 0; // Низкий уровень на выходе com D12
}
void com_D11()
{
PC_DDR_bit.DDR6 = 0; // Вход com D12
PC_CR1_bit.C16 = 0; // Подтягивающий резистор отключен
PC_ODR_bit.ODR5 = 1; // Высокий уровень на выходе
PC_CR1_bit.C15 = 1; // push-pull
PC_DDR_bit.DDR5 = 1; // Выход com D11
}
void com_D11_()
{
PC_ODR_bit.ODR5 = 0; // Низкий уровень на выходе com D11
}
void com_D10()
{
PC_DDR_bit.DDR5 = 0; // Вход com D11
PC_CR1_bit.C15 = 0; // Подтягивающий резистор отключен
PC_ODR_bit.ODR4 = 1; // Высокий уровень на выходе
PC_CR1_bit.C14 = 1; // push-pull
PC_DDR_bit.DDR4 = 1; // Выход com D10
}
void com_D10_()
{
PC_ODR_bit.ODR4 = 0; // Низкий уровень на выходе com D10
}
void com_D9()
{
PC_DDR_bit.DDR4 = 0; // Вход com D10
PC_CR1_bit.C14 = 0; // Подтягивающий резистор отключен
PC_ODR_bit.ODR3 = 1; // Высокий уровень на выходе
PC_CR1_bit.C13 = 1; // push-pull
PC_DDR_bit.DDR3 = 1; // Выход com D9
}
void com_D9_()
{
PC_ODR_bit.ODR3 = 0; // Низкий уровень на выходе com D9
}
void COM()
{
switch(k)
{
case 1:
com_D12();
break;
case 2:
com_D12_();
break;
case 3:
com_D11();
break;
case 4:
com_D11_();
break;
case 5:
com_D10();
break;
case 6:
com_D10_();
break;
case 7:
com_D9();
break;
case 8:
com_D9_();
break;
}
}
void SEG()
{
// DIGIT_1
i=!i;
if (n == 1)
{
if ((j == 7) ^ (j == 6))
{
PD_ODR_bit.ODR2 = ZNAK[j]; // Фаренгейт
}
}
else
{
PD_ODR_bit.ODR2 = DIGIT[L_1][i][j]; // seg D14
}
i=!i;
PC_ODR_bit.ODR7 = DIGIT[L_1][i][j]; // seg D13
// DIGIT_2
i=!i;
if (n ==2)
{
if ((j == 7) ^ (j == 6))
{
PD_ODR_bit.ODR6 = ZNAK[j]; // Вилка
}
}
else
{
PD_ODR_bit.ODR6 = DIGIT[L_2][i][j]; // seg D5
}
i=!i;
PA_ODR_bit.ODR1 = DIGIT[L_2][i][j]; // seg D6
// DIGIT_3
i=!i;
if (n == 3)
{
if ((j == 7) ^ (j == 6))
{
PA_ODR_bit.ODR3 = ZNAK[j]; // Цельсий
}
}
else
{
PA_ODR_bit.ODR3 = DIGIT[L_3][i][j]; // seg D8
}
i=!i;
PA_ODR_bit.ODR2 = DIGIT[L_3][i][j]; // seg D7
}
int main (void)
{
CLK_CKDIVR=0; // установка делителя частоты процессора равного 1
ADC_CSR_bit.AWD=0; //запрет ожидания сигнала от аналогового сторожевого таймера
ADC_CSR_bit.EOCIE=0; //прерывание по окончанию преобразования запрещено
ADC_CSR_bit.AWDIE=0; //прерывание от сторожевого таймера запрещено
ADC_CSR_bit.CH=0x04; //канал AIN4
ADC_CR1_bit.SPSEL=0x04; //выбор делителя частоты. Макс. АЦП F=4МГц при VDD=3.3, при VDD=4В F=6МГц
ADC_CR1_bit.CONT=0; //одиночное преобразование
ADC_CR2_bit.EXTTRIG=0; //преобразование по внешнему событию запрещено
ADC_CR2_bit.ALIGN=0; // выравнивание результата преобразования "по правому краю"
ADC_CR3_bit.DBUF=0; //Буфер данных отключен. Результат преобразования в ADC_DRH и ADC_DRL
ADC_CR3_bit.OVR=0; //очистка флага перед запуском АЦП
ADC_CR1_bit.ADON=1; //подключение АЦП к источнику питания
PD_DDR_bit.DDR3 = 0; // Вход.Детектор напряжения. Скорей всего инициализировать PD3 не нужно
PD_CR1_bit.C13 = 1; // Подтягивающий резистор отключен
PD_CR2_bit.C23 = 0; // Прерывая запрещены
PD_DDR_bit.DDR4 = 0; // Вход.
PD_CR1_bit.C14 = 1; // Подтягивающий резистор подключен
PD_CR2_bit.C24 = 0; // Прерывая запрещены
PD_DDR_bit.DDR5 = 0; // Вход.
PD_CR1_bit.C15 = 1; // Подтягивающий резистор подключен
PD_CR2_bit.C25 = 0; // Прерывая запрещены
PC_DDR_bit.DDR3 = 0; // Вход com D9
PC_CR1_bit.C13 = 0; // Подтягивающий резистор отключен
PC_CR2_bit.C23 = 0; // Прерывая запрещены
PC_DDR_bit.DDR4 = 0; // Вход com D10
PC_CR1_bit.C14 = 0; // Подтягивающий резистор отключен
PC_CR2_bit.C24 = 0; // Прерывая запрещены
PC_DDR_bit.DDR5 = 0; // Вход com D11
PC_CR1_bit.C15 = 0; // Подтягивающий резистор отключен
PC_CR2_bit.C25 = 0; // Прерывая запрещены
PC_DDR_bit.DDR6 = 0; // Вход com D12
PC_CR1_bit.C16 = 0; // Подтягивающий резистор отключен
PC_CR2_bit.C26 = 0; // Прерывая запрещены
PC_DDR_bit.DDR7 = 1; // Выход SEG D13
PC_CR1_bit.C17 = 1; // push-pull
PC_CR2_bit.C27 = 0; // Cкорость переключения 2МГц
PD_DDR_bit.DDR2 = 1; // Выход SEG D14
PD_CR1_bit.C12 = 1;
PD_CR2_bit.C22 = 0;
PD_DDR_bit.DDR6 = 1; // Выход SEG D5
PD_CR1_bit.C16 = 1;
PD_CR2_bit.C26 = 0;
PA_DDR_bit.DDR1 = 1; // Выход SEG D6
PA_CR1_bit.C11 = 1;
PA_CR2_bit.C21 = 0;
PA_DDR_bit.DDR2 = 1; // Выход SEG D7
PA_CR1_bit.C12 = 1;
PA_CR2_bit.C22 = 0;
PA_DDR_bit.DDR3 = 1; // Выход SEG D8
PA_CR1_bit.C13 = 1;
PA_CR2_bit.C23 = 0;
PB_DDR_bit.DDR5 = 1; // Настройка 5-го бита порта B на вывод.
PB_ODR_bit.ODR5 = 1; // Гашение светодиода.
PB_CR1_bit.C15 = 1; // Переключение порта в режим push-pull.
PB_CR2_bit.C25 = 0; // Cкорость переключения до 2 МГц
//Частота переполнений = 16000000Гц / 32 / 500 = 1000 Гц(1 мс)
TIM1_PSCRH = 0x00;//записываем 2 старших байта числа 31(32-1) в hex формате в регистр предделителя
TIM1_PSCRL = 0x1F;//записываем 2 младших байта числа 31(32-1)в hex формате в регистр предделителя
TIM1_ARRH = 0x01; //записываем 2 старших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_ARRL = 0xF4; //записываем 2 младших байта числа 500 в hex формате в регистр автоперезагруски
TIM1_CR1_bit.DIR = 0; // Cчет вверх
TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
TIM1_EGR_bit.UG = 1; //Вызываем Update Event для загрузки предделителя
TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
TIM1_CR1_bit.CEN = 1; //Запускаем таймер
i=1000; //временная задержка
do {i--;}
while (i>1);
ADC_CR1_bit.ADON=1; //повторная запись единицы дает команду на старт преобразования
asm("rim");
DELENIE();
while(1)
{
SEG();
COM();
if ((ADC_CSR_bit.EOC==1)&(t==1000))
{
t=0;
x = ((unsigned short)(ADC_DRH << 8 )) | ADC_DRL; //записывае данные из регистров ADC_DRL и ADC_DRH в переменную
PB_ODR_bit.ODR5 = !PB_ODR_bit.ODR5; // Индикатор входа в тело оператора
if (x>y)
{
y=x*3300000/1023;
DELENIE();
}
ADC_CR1_bit.ADON=1; // запускаем преобразование
}
}
}