大神,請跳過上面問題,請問下面的程序有問題嗎,我想讓液晶屛顯示坐標,為什么液晶屛什么東西都不顯示呢?
#include <reg52.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="X:";
uchar code table1[]="Y:";
sbit lcden=P3^4; //液晶使能端
sbit lcdrs=P3^5; //液晶數據命令選擇端
sbit lcdrw=P3^6; //液晶數據的讀與寫控制
uchar num=0;
uchar flag=0; //標志位,啟動定時器2
uint Ta,Tb,Tc,Td;
uint x=0,y=0;
void delay(uint z)
{
uint m,n;
for(m=z;m>0;m--)
for(n=110;n>0;n--);
}
void Init_ex_int() //外部中斷初始化函數
{
EA=1;
EX0=1;
EX1=1;
IT0=1; //下降沿觸發
IT1=1;
}
//計數器0
void InitTimer0() //初始化函數
{
TMOD=0x05; //設置定時器0工作模式1
TH0=0x0FF; //計數器裝初值
TL0=0x0FF;
EA=1; //開總中斷
ET0=1; //開計數器0中斷
TR0=1; //啟動定時器0
}
//計數器1
void InitTimer1() //初始化函數
{
TMOD=0x50; //設置定時器1工作模式1
TH1=0x0FF; //計數器裝初值
TL1=0x0FF;
EA=1; //開總中斷
ET1=1; //開定時器1中斷
TR1=1; //啟動定時器1
}
//定時器
void InitTimer2() //初始化函數,打開定時器2
{
TMOD=0x01; //設置定時器2工作模式1
TH2=0; //定時器裝初值
TL2=0;
EA=1; //開總中斷
ET2=1; //開定時器2中斷
TR2=1; //啟動定時器2
}
void write_com(uchar com) //寫命令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uint date) //寫數據
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void printc(uint cc) //將阿拉伯數字在液晶上準確顯示
{
write_data(cc/100+'0'); //百位
write_data(cc/10%10+'0'); //十位
// prints(".");
write_data(cc%10+'0'); //個位
}
void Initlcd()
{
lcden=0;
write_com(0x38); //設置16X2顯示,5X7點陣,8位數據接口
write_com(0x0c); //設置開顯示,不顯示光標
write_com(0x06); //寫一個字符后地址指針加1
write_com(0x01); //顯示清零,數據指針清零
}
void date(uint Ta,uint Tb,uint Tc,uint Td) //定位算法
{
double m1,n1,m2,n2,b1,b2,c1,c2,c3,c4,d1,d2; //計算中的中間變量
uint x1,x2,y1,y2;
c1=0.34*(Ta-Tb); //時間差到距離差 單位為毫米
c2=0.34*(Ta-Tc);
c3=0.34*(Tc-Td);
c4=0.34*(Tb-Td);
m1=(4*c2)/(c1*3);
n1=(c1*c2-c2*c2+300*300)/600; //計算中的中間變量
b1=m1*m1+1-(4*200*200)/(c1*c1);
b2=n1*n1+200*200-(c1*c1)/4;
x1=(int)((sqrt((m1*m1*n1*n1-b1*b2))-m1*n1)/b1); //第一組想(x,y)
y1=(int)(m1*x1+n1);
m2=4*c4/(3*c3);
n2=(c3*300*300+c3*c4*c4-c4*c3*c3)/(600*c3);
d1=m2*m2+1-(4*200*200)/(c3*c3);
d2=n2*n2-600*n2+300*300+200*200-(c3*c3)/4;
x2=(int)((sqrt((m2*m2*(n2-300)*(n2-300)-d1*d2))-m2*(n2-300))/d1); //第二組(x,y)
y2=(int)(m2*x2+n2);
x=(int)((x1+x2)/2); //最終的(x,y)(取算數平均值)
y=(int)((y1+y2)/2);
}
void main()
{
Init_ex_int();
InitTimer0();
InitTimer1();
Initlcd();
TH2=0; //定時器2裝初值
TL2=0;
while(1)
{
if(flag==1) //第一次外部中斷發生后打開T2
{
InitTimer2();
}
if(flag==4) //第四個外部中斷發生后關掉所有中斷
{
EA=0; //關總中斷
ET2=0; //關定時器2中斷
}
date( Ta,Tb,Tc,Td);
// date( 300,250,300,250);
write_com(0x80); //在1602的第一行上顯示X
for(num=0;num<2;num++)
{
write_data(table[num]);
delay(5);
}
//write_data(48);
printc(x); //顯示X的值
delay(5);
write_com(0x80+0x40); //在1602的第二行上顯示Y
for(num=0;num<2;num++)
{
write_data(table1[num]);
delay(5);
}
printc(y); //顯示Y的值
delay(5);
}
}
void ex_int0() interrupt 0 //外部中斷0的中斷服務程序
{
EX0=0; //關閉外部中斷0
flag++;
Ta=TH2*256+TL2; //讀取定時器2中的值
}
void ex_int1() interrupt 0 //外部中斷1的中斷服務程序
{
EX1=0;
flag++;
Tb=TH2*256+TL2; //讀取定時器2中的值
}
void timer0() interrupt 1 //定時/計數器0中斷服務程序
{
ET0=0; //關定時器0中斷
flag++;
Tc=TH2*256+TL2; //讀取定時器2中的值
}
void timer1() interrupt 1 //定時/計數器1中斷服務程序
{
ET1=0; //關定時器1中斷
flag++;
Td=TH2*256+TL2;
}
|