Ниже приведена прошивка и все остальное . Пожалуйста помогите бедному студенту.
Код: Выделить всё
#include <mega128.h>
#include <delay.h>
// Declare your global variables here
#define A 1
#define B 2
#define C 4
#define D 8
#define E 16
#define F 32
#define G 64
static flash unsigned char digits[] = {
(A+B+C+D+E+F), // 0
(B+C), // 1
(A+B+D+E+G), // 2
(A+B+C+D+G), // 3
(B+C+F+G), // 4
(A+C+D+F+G), // 5
(A+C+D+E+F+G), // 6
(A+B+C), // 7
(A+B+C+D+E+F+G), // 8
(A+B+C+D+F+G), // 9
(A+B+C+E+F+G), // A - 10
(C+D+E+F+G), // b - 11
(A+D+E+F), // C - 12
(B+C+D+E+G), // d - 13
(A+D+E+F+G), // E - 14
(A+E+F+G) // F - 15
};
#define BIN2DEC 0
#define DEC2BIN 1
unsigned char digit_out[8], // буфер экрана
cur_dig, // тек.высвечиваемый символ (позиция)
rejim;
unsigned long int chislo;
unsigned char key_code[4][4] = { { 1, 2, 3, 99},
{ 4, 5, 6, 99},
{ 7, 8, 9, 99},
{11,10,12, 99} };
//----------
// Timer 0 overflow interrupt service routine
// 125.000 Гц / 255 = 490,2 Гц
// 490,2 Гц / 8 = 61 Гц
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
PORTE = 0xFF; // потушить все (индикатор ОК)
PORTD = digits[digit_out[cur_dig]]; // символ на экран
PORTE = ~(1<<cur_dig); // засветить нужный разряд
cur_dig++;
if (cur_dig > 7) cur_dig = 0;
}
//----------
//----------
unsigned char read_key(void) {
unsigned char col, row, tmp;
// столбцы на выход с лог ур."0", строки на вход с подтягивающ.рез.
DDRF=0x0F;
PORTF=0xF0;
// считывавем строки
tmp = (~PINF >> 4);
if (tmp == 1) row = 0;
else if (tmp == 2) row = 1;
else if (tmp == 4) row = 2;
else if (tmp == 8) row = 3;
else {
// все на вход с подтягивающ.рез.
PORTF=0xFF;
DDRF=0x00;
return 0; // если нажаты одновременно две кнопки или не было нажатий
}
// строки на выход с лог ур."0", столбцы на вход с подтягивающ.рез.
DDRF=0xF0;
PORTF=0x0F;
// считываем столбцы
tmp = (~PINF & 0x0F);
if (tmp == 1) col = 0;
else if (tmp == 2) col = 1;
else if (tmp == 4) col = 2;
else if (tmp == 8) col = 3;
else {
// все на вход с подтягивающ.рез.
PORTF=0xFF;
DDRF=0x00;
return 0; // если нажаты одновременно две кнопки или не было нажатий
}
// все на вход с подтягивающ.рез.
DDRF=0x00;
PORTF=0xFF;
return key_code[row][col];
}
//----------
//----------
void decode (void) {
unsigned long int tmp;
tmp = chislo;
// двадцатибитное значение
if (chislo <= 0xFFFFF) {
digit_out[7] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[6] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[5] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[4] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[3] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[2] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[1] = (unsigned char)(tmp % 10); tmp = tmp / 10;
digit_out[0] = (unsigned char)(tmp % 10);
PORTC &= 0xF0; // обнулить первые четыре бита
PORTA = (unsigned char)(chislo & 0x000000FF);
PORTB = (unsigned char)((chislo >> 8) & 0x000000FF);
PORTC |= (unsigned char)((chislo >> 16) & 0x000000FF);
}
else PORTC.6 = 1; // зажечь светодиод "переполнение"
}
//----------
// ==== MAIN ========
void main(void) {
unsigned char key;
// Input/Output Ports initialization
// Port A 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
PORTA=0x00;
DDRA=0xFF;
// 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 C 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
PORTC=0x00;
DDRC=0xFF;
// Port D 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
PORTD=0x00;
DDRD=0xFF;
// Port E initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
PORTE=0xFF;
DDRE=0xFF;
// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTF=0xFF;
DDRF=0x00;
// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=P State3=P State2=P State1=P State0=P
PORTG=0x1F;
DDRG=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x02;
TCNT0=0x00;
OCR0=0x00;
// External Interrupt(s) initialization
// INT0 - INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ETIMSK=0x00;
// USART0 initialization
// USART0 disabled
UCSR0B=0x00;
// USART1 initialization
// USART1 disabled
UCSR1B=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
// Global enable interrupts
#asm("sei")
rejim = DEC2BIN;
PORTC.4 = 0; PORTC.5 = 1;
while (1) {
key = read_key();
if (rejim == BIN2DEC) {
// кнопка "1"
if (key == 1) chislo = (chislo << 1) + 1;
// кнопка "0"
if (key == 10) chislo = chislo << 1;
}
if (rejim == DEC2BIN) {
// кнопки от "1" до "9"
if ((key >= 1) && (key <=9)) chislo = (chislo * 10) + key;
// кнопка "0"
if (key == 10) chislo = chislo * 10;
}
if ((key >= 1) && (key <=10)) decode(); // конвертировать и заполнить экран
if (key == 11) {
chislo = 0; // очистка переменной
PORTC.6 = 0; // погасить светодиод "переполнение"
if (rejim == BIN2DEC) { rejim = DEC2BIN; PORTC.4 = 0; PORTC.5 = 1; }
else { rejim = BIN2DEC; PORTC.4 = 1; PORTC.5 = 0; }
decode(); // конвертировать и заполнить экран
}
if (key == 12) {
chislo = 0; // очистка переменной
PORTC.6 = 0; // погасить светодиод "переполнение"
decode(); // конвертировать и заполнить экран
}
delay_ms(200);
}