参考链接中给了公式,能算出接触电阻,我也只是很久以前试过一次,
之后未经太多的测试,不保证准确性,仅供参考:
- #define BIT(x) (1<<(x))
- #define IOSET(port,x) (port)|=(x)
- #define IOCLR(port,x) (port)&=~(x)
- #define X0_H IOSET(P1,BIT(0))
- #define X0_L IOCLR(P1,BIT(0))
- #define X0_IN {IOCLR(P1M1,BIT(0));IOSET(P1M0,BIT(0)}
- #define X0_OUT {IOCLR(P1M0,BIT(0));IOSET(P1M1,BIT(0)}
- #define X0_UP {IOCLR(P1M1,BIT(0));IOCLR(P1M0,BIT(0));IOSET(P1,BIT(0));}
- #define X1_H IOSET(P1,BIT(2))
- #define X1_L IOCLR(P1,BIT(2))
- #define X1_IN {IOCLR(P1M1,BIT(2));IOSET(P1M0,BIT(2)}
- #define X1_OUT {IOCLR(P1M0,BIT(2));IOSET(P1M1,BIT(2)}
- #define X1_UP {IOCLR(P1M1,BIT(2));IOCLR(P1M0,BIT(2));IOSET(P1,BIT(2));}
- #define Y0_H IOSET(P1,BIT(1))
- #define Y0_L IOCLR(P1,BIT(1))
- #define Y0_IN {IOCLR(P1M1,BIT(1));IOSET(P1M0,BIT(1)}
- #define Y0_OUT {IOCLR(P1M0,BIT(1));IOSET(P1M1,BIT(1)}
- #define Y0_UP {IOCLR(P1M1,BIT(1));IOCLR(P1M0,BIT(1));IOSET(P1,BIT(1));}
- #define Y1_H IOSET(P1,BIT(3))
- #define Y1_L IOCLR(P1,BIT(3))
- #define Y1_IN {IOCLR(P1M1,BIT(3));IOSET(P1M0,BIT(3)}
- #define Y1_OUT {IOCLR(P1M0,BIT(3));IOSET(P1M1,BIT(3)}
- #define Y1_UP {IOCLR(P1M1,BIT(3));IOCLR(P1M0,BIT(3));IOSET(P1,BIT(3));}
- //读取x的AD
- #define readadx0() adc_read(0)
- //读取y的AD
- #define readady0() adc_read(1)
-
- //读取x脚的电平状态
- #define readiox() (P1&BIT(2))
- //x上拉
- #define X_UP {IOCLR(P1M1,BIT(0)+BIT(2));IOCLR(P1M0,BIT(0)+BIT(2));IOSET(P1,BIT(0)+BIT(2));}
- //X置为输入
- #define X_IN {IOCLR(P1M1,BIT(0)+BIT(2));IOSET(P1M0,BIT(0)+BIT(2));}
- //X置为输出
- #define X_OUT {IOCLR(P1M0,BIT(0)+BIT(2));IOSET(P1M1,BIT(0)+BIT(2));}
-
- #define Y_IN {IOCLR(P1M1,BIT(1)+BIT(3));IOSET(P1M0,BIT(1)+BIT(3));}
-
- #define Y_OUT {IOCLR(P1M0,BIT(1)+BIT(3));IOSET(P1M1,BIT(1)+BIT(3));}
- //x1,y1 置为输出
- #define Z_OUT {IOCLR(P1M0,BIT(2)+BIT(3));IOSET(P1M1,BIT(2)+BIT(3));}
-
- #define Z_IN {IOCLR(P1M1,BIT(2)+BIT(3));IOSET(P1M0,BIT(2)+BIT(3));}
- //--------------------------------------------------
- //相关变量
- //--------------------------------------------------
- #define BUFCNT 5
- U16 xbuf[BUFCNT],ybuf[BUFCNT];
- //--------------------------------------------------
- //取得x座标
- //--------------------------------------------------
- U16 TS_getx(void)
- {
- U16 x;
- //Y0_L;Y1_L;delayms(1);//放电
- //Y_IN;
- X0_H;X1_L;X_OUT;delayus(100);//delayms(1);
- readady0();
- x=readady0();
- //X0_L;delayms(1);
- X_IN;
- return x;
- }
- //--------------------------------------------------
- //取得y座标
- //--------------------------------------------------
- U16 TS_gety(void)
- {
- U16 y;
- Y0_H;Y1_L;Y_OUT;delayus(100);//delayms(1);
- readadx0();
- y=readadx0();
- //Y0_L;delayms(1);
- Y_IN;
- return y;
- }
-
- //--------------------------------------------------
- //取得是否被按下的状态
- //--------------------------------------------------
- U8 TS_gets(void)
- {
- U8 s;
- Y0_L;Y1_L;Y_OUT;
- X0_H;X1_H;X_OUT;delayus(100);//delayms(1);//放电
- X_UP;delayms(1);//X上拉输入
- if(readiox()==0)
- s=1;
- else
- s=0;
- //X0_L;X1_L;delayms(1);
- X_IN;Y_IN;
- return s;
- }
- //--------------------------------------------------
- //取得触摸电阻
- //x1,y1 为输出
- //--------------------------------------------------
- void TS_getz(U16* Vz1,U16* Vz2)
- {
- // U16 z1,z2;
- X1_H;Y1_L;Z_OUT;delayus(100);//delayms(1);
- readadx0();
- *Vz1=readadx0();
- readady0();
- *Vz2=readady0();
- //Y0_L;delayms(1);
- Z_IN;
- }
- //--------------------------------------------------
- //n个数里求平均值(n>=3)
- //--------------------------------------------------
- U16 average(U16 a[],U8 n)
- {
- U16 max,min,ave=0,sum=0;
- U8 i;
- if(n<3)return 0;
- max=a[0];
- min=a[0];
- for(i=0;i<n;i++)
- {
- if(max<a[i])max=a[i];
- if(min>a[i])min=a[i];
- sum+=a[i];
- }
- ave=(sum-min-max)/(n-2);
- return ave;
- }
- //--------------------------------------------------
- //获取坐标及是否按下
- //--------------------------------------------------
- void Touch_GetData(U8 *ud,U16 *x,U16 *y)
- {
- U8 s,i;
- U16 Vz1,Vz2;
- U16 tempy,Rt;
- s=TS_gets();
- if(s)
- {
- for(i=0;i<BUFCNT;i++)
- {
- xbuf[i]=TS_getx();
- tempy=TS_gety();
- ybuf[i]=tempy;
- TS_getz(&Vz1,&Vz2);
- if(Vz2==0)Vz2=1;//除数不能为0
- Rt=(U32)tempy*(Vz1-Vz2)/Vz2;//接触电阻
- if(Rt>1500)s=0;//接触电阻过大
- }
- if(s)s=TS_gets();
- if(s)
- {
- *x=average(xbuf,BUFCNT);
- *y=average(ybuf,BUFCNT);
- }
- }
- *ud=s;
- }
-
- //--------------------------------------------------
- //屏初始化
- //--------------------------------------------------
- void TS_init(void)
- {
- X_IN;//引脚置为输入
- Y_IN;
- }
- //--------------------------------------------------
- //主函数
- //--------------------------------------------------
- void main(void)
- {
- U16 x,y;
-
- U8 w,s,s0;
- init_devices();
-
- while(1)
- {
- for(w=0;w<200;w++)
- {
- Touch_GetData(&s,&x,&y);
- if(s)break;
- if(s0)break;
- delayms(1);
- }
- uart1_sendbyte(0xaa);
- uart1_sendbyte(s);
- uart1_sendbyte(x>>8);
- uart1_sendbyte(x);
- uart1_sendbyte(y>>8);
- uart1_sendbyte(y);
- s0=s;
- }
- }
复制代码
|