Prezentuję poniżej kod źródłowy sonaru (nie uwzględniam tu plików biblioteki Procyon AVRlib).
//#############################
//
// Sonar ultradźwiekowy
//
//#############################
#include <avr/io.h>
#include "deprecated.h"
#include "sonar.h"
#include "znaki.h"
#include <avr/interrupt.h>
#include <util/delay.h>
#include "i2c.h"
#define wait 0xffff
int distance=0;
int idx; //zmienna uzyta w petli w funkcji wynik
unsigned int TicksNo[42] = {10,20,50,85,120,150,170, //3...30cm
220,240,280,315,335,375, //35...60cm
400,440,460,500,530,560, //65...90cm
600,630,660,690,720,760, //95...120cm
790,820,850,885,910,945, //125...150cm
970,1010,1050,1080,1115, //155...175cm
1150,1180,1210,1240,1270, //180...200cm
1300}; //troche ponad 2m
unsigned short DisplayChars0[42] = {0,0,1,1,2,2,3,3, //03...35cm
4,4,5,5,6,6,7,7, //40...75cm
8,8,9,9,0,0,1,1, //80...115cm
2,2,3,3,4,4,5,5, //120...155cm
6,6,7,7,8,8,9,9, //160...195cm
0,10}; //200...troche ponad 200
unsigned char DisplayChars1[42] = {3,5,0,5,0,5,0,5, //03...35cm
0,5,0,5,0,5,0,5, //40...75cm
0,5,0,5,0,5,0,5, //80...115cm
0,5,0,5,0,5,0,5, //120...155cm
0,5,0,5,0,5,0,5, //160...195cm
0,10}; //200...troche ponad 200
unsigned char digits[11] = {
((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)),
((1<<LEDB)|(1<<LEDC)),
((1<<LEDA)|(1<<LEDB)|(1<<LEDD)|(1<<LEDE)|(1<<LEDG)),
((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDG)),
((1<<LEDB)|(1<<LEDC)|(1<<LEDF)|(1<<LEDG)),
((1<<LEDA)|(1<<LEDC)|(1<<LEDD)|(1<<LEDF)|(1<<LEDG)),
((1<<LEDA)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)|(1<<LEDG)),
((1<<LEDA)|(1<<LEDB)|(1<<LEDC)),
((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)|(1<<LEDG)),
((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDF)|(1<<LEDG)),
(1<<LEDG) //kreska pozioma
};
unsigned char DisplayedChar[2];
unsigned char Com[2] = {~(1<<COM1),~(1<<COM2)};
//
//############################################################
//
//-------------------------
//
// procedura wysyłania paczki ultradźwięków
//
//-------------------------