#include<18f452.h>
#fuses HS,NOWDT,NOLVP,NOPROTECT
#use delay(clock=12000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#define rs PIN_C0
#define rw PIN_C1
#define en PIN_C2
void signal()
{
output_low(PIN_B0);
delay_us(2);
output_high(PIN_B0);
delay_us(5);
output_low(PIN_B0);
}
void lcd_command(int16 command)
{
output_d(command);
delay_ms(50);
output_low(rs);
output_low(rw);
output_high(en);
delay_cycles(1);
output_low(en);
}
void lcd_data(int16 data)
{
output_d(data);
delay_ms(50);
output_high(rs);
output_low(rw);
output_high(en);
delay_cycles(1);
output_low(en);
}
void hex2dec(float value)
{
int16 x,f1,f2,d1,d2,d3,int_val;
float float_val;
float_val=value+0.2;
int_val=(int16)value+1;
lcd_command(0x80);
lcd_data('v');
lcd_data('=');
/*****************************************
Integer value calculation
*****************************************/
x=int_val/10; //102
//d4=value%10; //3
d3=int_val%10; //2
d2=x%10; //0
d1=x/10; //1
lcd_command(0x82);
lcd_data(d1+48);
lcd_data(d2+48);
lcd_data(d3+48);
lcd_command(0x85);
lcd_data('.');
/*****************************************
Float value calculation
*****************************************/
f1=(int16)(float_val*10)%10;
f2=(int16)(float_val*100)%10;
lcd_command(0x86);
lcd_data(f1+48);
lcd_data(f2+48);
lcd_command(0x88);
lcd_data('c');
lcd_data('m');
//lcd_data(d3+48);
//lcd_data(d4+48);
}
int16 range()
{
int16 count=0;
int1 state;
set_tris_b(0x00); //make PIB_B0 output
signal(); //Trigger Ultrasonic*/
set_tris_b(0xff); //make PIN_B0 input
while(state==0)
{
delay_cycles(2);
state=input_state(PIN_B0);
}
while(state==1)
{
count++;
delay_cycles(2);
state=input_state(PIN_B0);
delay_cycles(2);
}
//if(count>10)
{
printf("count=%ld\r\n",count);
return(count);
}
}
void main()
{
float distance, value;
lcd_command(0x38);
lcd_command(0x0c);
lcd_command(0x01);
lcd_command(0x06);
while(1)
{
value=range();
distance=(value/19.2);
if(distance>2.5)
hex2dec(distance);
}
}