#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd P0
sbit IN1=P2^1;
sbit IN0=P2^0;
sbit key1=P3^1;
sbit key2=P3^0;
sbit trig=P1^0;
sbit echo=P3^2;
sbit en=P2^7;
sbit rw=P2^5;
sbit rs=P2^6;
sbit busybit=P0^7;
//sbit P24=P2^4;
//sbit P26=P2^6;
//sbit P27=P2^7;
bit test_flag;
uchar num,num1,gao_num=1,di_num=6;
uchar tab[]="0123456789";
void wr_com(uchar com,busyflag);
unsigned char timer1;
void juli();
void delay1(uchar i)
{ uchar x,y;
for(x=i;x>0;x--)
for(y=125;y>0;y--);
}
void delay(uint temp) //延時
{
while(temp--);
//1620-14.99ms
//520-5ms
//5-450ns
}
void lcd_init(void) //1602初始化
{
delay(1650);//time
wr_com(0x38,0);
delay(550);//time
wr_com(0x38,0);
delay(550);
wr_com(0x38,0);
wr_com(0x38,1);
wr_com(0x08,1);
wr_com(0x01,1);
wr_com(0x06,1);
wr_com(0x0c,1);
}
void init(void) //外部中斷 和 定時器初始化
{
// P24=0;
// P26=1;
// P0=0x00;
// P26=0;
// P27=1;
// P0=0xff;
// P27=0;
TMOD=0x01;
TH0=0;
TL0=0;
TR0=0;//
IT0=1;
EX0=1;
EA=1;
lcd_init();
}
void testbusy(void)//read com
{
busybit=1;
en=0;
rs=0;
rw=1;
delay(5);
en=1;
delay(5);
while (busybit);
en=0;
}
void wr_dat(uchar dat,busyflag) //寫操作
{
if(busyflag)
testbusy();
en=0;
rs=1;
rw=0;
lcd=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void wr_com(uchar com,busyflag) //寫指令
{
if(busyflag)
testbusy();
en=0;
rs=0;
rw=0;
lcd=com;
delay(5);
en=1;
delay(5);
en=0;
}
uint test_distance(void) //距離
{
uint value;
TH0=0;
TL0=0;
trig=0;
_nop_();
trig=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
trig=0;
while(!echo);
TR0=1;
while(echo);
TR0=0;
value=TH0*256+TL0;
return value;
}
void int0_srv() interrupt 0 //外部定時器終端
{
test_flag=1;
}
void key() //按鍵
{
if(key1==0)
{
delay(5);
if(key1==0)
{
num++;
if(num==4)
num=3;
while(!key1);
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{if(num!=0)
num--;
else
num=0;
while(!key2);
}
}
}
void dispose()
{
switch(num)
{
case 0:gao_num=1;
di_num=6;
break;
case 1:gao_num=2;
di_num=5;
break;
case 2:gao_num=3;
di_num=4;
break;
case 3:gao_num=4;
di_num=3;
break;
case 4:gao_num=5;
di_num=2;
break;
case 5:gao_num=6;
di_num=1;
break;
case 6:gao_num=0;
di_num=0;
break;
// case 7:gao_num=0;
// di_num=0;
// break;
}
}
void qudong()
{
uchar i;
IN0=0;
if(di_num!=0)
{
for(i=0;i<di_num;i++)
{
IN1=0;
delay1(10);
}
}
for(i=0;i<gao_num;i++)
{
IN1=1;
delay1(10);
}
}
void main() //主函數 //距離顯示
{ uint value;
uint a,b,c,d,e;
init();
while(1){
if(test_flag)
{
test_flag=0;
EA=0;
value=test_distance();
a=value/100;
b=a/2;
c=b*340;
e=c/10;
a=e/1000;
b=(e%1000)/100;
c=((e%1000)%100)/10;
d=e%10;
delay(10);
EA=1;}
key();
dispose();
qudong();
wr_com(0x80,1);
delay(5);
wr_dat(tab[a],1);
delay(5);
wr_dat('.',1);
delay(5);
wr_dat(tab[b],1);
delay(5);
wr_dat(tab[c],1);
delay(5);
wr_dat(tab[d],1);
delay(5);
wr_dat('m',1);
delay(5);
}
}
|