Code //Chip type : ATmega8 //AVR Core Clock frequency: 8.000000 MHz #include <mega8.h> #include <delay.h> #define SH_CP PORTB.2 #define ST_CP PORTB.1 #define DS PORTB.0
unsigned char led_table[10]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b01000001,0b00011111,0b00000001,0b00001001}; unsigned int show_data=0; //Отображаемое число unsigned int dig_data=0; unsigned char dig_number=0; //Номер разряда
void tmr_start() { TCNT1=0; //Обнуляем счетчик //Устанавливаем делитель 64 //Частота МК 8000KHz/256=31.25KHz //31250 тиков в секунду, промежуток времени до переполнения 65536/31250=2.097152s TCCR1B=0x04; }
void tmr_stop(void) { TCCR1B=0x00; //Выключаем счетчик }
//Внешнее прерывание interrupt [EXT_INT0] void ext_int0_isr(void) { tmr_stop(); //Останавливаем счетчик //[Счетчик]/(31250/1000)=промежуток в ms //Сохраняем для отображения в переменой show_data show_data=TCNT1/31.25; tmr_start(); //Включаем счетчик }
//Прерывание переполниния счетчика 1 interrupt [TIM1_OVF] void timer1_ovf_isr(void) { tmr_stop(); //Останавливаем счетчик TCNT1--; //Устанавливаем максимальное значение счетчика }
void shiftbit(unsigned char newbit) { if (newbit!=0) DS=1; SH_CP=1; SH_CP=0; DS=0; ST_CP=1; ST_CP=0; }
//Отображение разрядов числа void dig_show(void) { unsigned char data[2]; unsigned char i; if (dig_number==0) dig_data=show_data; data[0]=dig_data%10; dig_data/=10; data[0]=led_table[data[0]]; data[1]=1<<dig_number; for (i=0;i<4;i++) { shiftbit(data[1]&1); data[1]>>=1; } for (i=0;i<8;i++) { shiftbit(data[0]&1); data[0]>>=1; } dig_number++; if (dig_number>3) dig_number=0; }
void main(void) { DDRB=7; //Выход для семи-сегментника TCCR1A=0x00; //Устанавливаем нормальный режим счетчика, максимальное значение 0xffff //Устанавливаем внешнее прерывание INT0, по поднятию уровня GICR=0x40; MCUCR=0x03; GIFR=0x40; TIMSK=0x04; //Прерывание для счетчика 1 #asm("sei") //Разрешаем прерывание while (1){ dig_show(); //Отображаем разряды delay_ms(10); } }
|