وجدت هذا البرنامج واكيد حينفع لعمل افوميتر بدمجه مع الفولتميتر ولاحقا ساضيف الاومميتر ليكتمل البرنامج
الكود
كود:
// Capacitance 10pF to 65,000 ?F
char Calibre ;
// Prototypes of the functions
void Accueil();
unsigned int GetRC() ;
void WordToLCD(unsigned int W) ;
void ChangeCalibre();
void faultyCalib() ;
void AfficheCalibre() ;
//-----------------------------------------------------------------------
void main()
{
unsigned int Capa ;
// Initialization
CMCON = 7 ; // no comparators
Lcd_Config(&portb,4,5,6,3,2,1,0); // pin for LCD
Lcd_Cmd(Lcd_CURSOR_OFF); // no cursor
trisb.f7 = 1 ;
Calibre = 'u' ;
trisa.f4 = 0 ; // decharger Cx
trisa.f2 = 1 ; //push button
trisa.f0 = 0 ;
porta.f0 = 1 ;
porta.f4 = 0 ; // decharger Cx
Accueil();
// Loop measurement
while(1)
{
if(!porta.f2)
ChangeCalibre();
else
{
Lcd_Out(2,2,"Measurement in progress..");
Capa = GetRC();
Lcd_Cmd(Lcd_Clear);
Lcd_Out_Cp("Cx = ");
if(Capa)
{
if(Calibre == 'u')
Capa /= 10 ;
WordToLcd(Capa);
Lcd_Chr_Cp(' ');
Lcd_Chr_Cp(Calibre);
Lcd_Chr_Cp('F');
AfficheCalibre();
delay_ms(2000);
}
}
}
}
//------------------------------------------------------------------------
void Accueil()
{
Lcd_Out_Cp("*** Capacitance ***");
AfficheCalibre();
Delay_ms(3000);
Lcd_Cmd(Lcd_Clear);
}
//------------------------------------------------------------------------
unsigned int GetRC()
{
unsigned int RC ;
RC = 0 ;
porta.f0 = 1 ;
trisa.f0 = Calibre == 'p' ? 1 : 0 ;
trisa.f4 = 1 ; // RA4 input
if(Calibre == 'u')
while(1)
{
delay_us(218) ;
if(porta.f4)
break ;
RC++ ;
if(!RC)
break ;
}
else
while(1)
{
if(porta.f4)
break ;
RC++ ;
if(!RC)
break ;
}
trisa.f0 = 1 ;
porta.f4 = 0 ; //RA4 output to 0
trisa.f4 = 0 ; //discharges the capacitor
if (!RC)
faultyCalib();
return RC ;
}
//------------------------------------------------------------------------
void faultyCalib()
{
Lcd_Cmd(Lcd_Clear);
Lcd_Out_Cp("faulty calibre..") ;
AfficheCalibre();
delay_ms(2000) ;
}
//------------------------------------------------------------------------
void WordToLCD(unsigned int W)
{
char delta,str[6] ;
delta = 0 ;
WordToStr(W,str) ;
while(str[delta] == ' ')
delta++ ;
Lcd_Out_Cp(str+delta);
}
//-------------------------------------------------------------------------
void ChangeCalibre()
{
// new class
switch(Calibre)
{
case 'p' : {
Calibre = 'n' ;
break ;
}
case 'n' : {
Calibre = 'u' ;
break ;
}
default : Calibre = 'p' ;
}
// View
Lcd_Cmd(Lcd_Clear);
AfficheCalibre();
delay_ms(2000);
}
//--------------------------------------------------------------------------
void AfficheCalibre()
{
Lcd_Out(2,2,"(Calibre 6500");
if(Calibre != 'u')
Lcd_Chr_Cp('0');
Lcd_Chr_Cp(' ');
Lcd_Chr_Cp(Calibre);
Lcd_Chr_Cp('F');
Lcd_Chr_Cp(')');
}
//--------------------------------------------------------------------------