Вот полный код программы
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/* -A-
F B
-G-
E C
-D-
*/
#define DIGIT 5
unsigned char cArr[DIGIT];
unsigned int step[DIGIT]={10000,1000,100,10,1};
#define N0 (0x3F) //0
#define N1 (0x06) //1
#define N2 (0x5B) //2
#define N3 (0x4F) //3
#define N4 (0x66) //4
#define N5 (0x6D) //5
#define N6 (0x7D) //6
#define N7 (0x07) //7
#define N8 (0x7F) //8
#define N9 (0x6F) //9
unsigned char indikator[10]={N0, N1, N2, N3, N4, N5, N6, N7, N8, N9};
void fnLongToStr(unsigned long tmp)
{
unsigned char i,atemp;
unsigned long val,temp;
val=tmp;
for (i=0; i<DIGIT; i++)
{
temp=(unsigned long)step[i];
atemp=0;
while(val >= temp)
{
atemp++;
val-=temp;
}
cArr[i]=atemp;
}
}
//------------------------------
void fnImageDigit(void)
{
unsigned char i;
for (i=0; i<DIGIT; i++)
{
cArr[i]=indikator[cArr[i]];
}
}
//-----------------------------
void fnOutByte(unsigned char cByte)
{
unsigned char mask =0x80;
do{
if(mask & cByte)
{
PORTD|=_BV(PD5);
}
else
{
PORTD&=~_BV(PD5);
}
PORTD|=_BV(PD6); //Импульс на SH_CP (запись)
PORTD&=~_BV(PD6);
mask>>=1;
}while(mask);
}
//-----------------------------
void fnShowDigit(unsigned long tmp)
{
unsigned char i;
fnLongToStr(tmp);
fnImageDigit();
for (i=0; i<DIGIT; i++)
{
fnOutByte(cArr[i]);
}
}
//-----------------------------
int main(void)
{
unsigned long int s=0;
PORTD=0x00; //Первоначально устанавливаем на всех выходах 0
DDRD=0xff; //установить PD0-PD2 как выходы
while (1) //Бесконечный цикл
{
fnShowDigit(s++);
PORTD|=_BV(PD7); //Импульс на ST_CP (защелка - вывод на индикатор записанных данных)
PORTD&=~_BV(PD7);
if (s>99999)
s=0;
_delay_ms(1500); //пауза 300 мс
}
}
размер файла hex = 1,43кб
а вот при компиляции
> "make.exe" all
-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
AVR Memory Usage
----------------
Device: atmega8
Program: 492 bytes (6.0% Full)
(.text + .data + .bootloader)
Data: 25 bytes (2.4% Full)
(.data + .bss + .noinit)
Compiling: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.lst -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o main.o
Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref -lm
Creating load file for Flash: main.hex
avr-objcopy -O ihex -R .eeprom main.elf main.hex
Creating load file for EEPROM: main.eep
avr-objcopy -j .eeprom --set-section-flags .eeprom=alloc,load \
--change-section-lma .eeprom=0 -O ihex main.elf main.eep
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
Creating Extended Listing: main.lss
avr-objdump -h -S main.elf > main.lss
Creating Symbol Table: main.sym
avr-nm -n main.elf > main.sym
Size after:
AVR Memory Usage
----------------
Device: atmega8
Program: 514 bytes (6.3% Full)
(.text + .data + .bootloader)
Data: 25 bytes (2.4% Full)
(.data + .bss + .noinit)
-------- end --------
> Process Exit Code: 0
> Time Taken: 00:00