⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tp.c

📁 电阻触摸屏驱动测试
💻 C
字号:

//描述:扫描读入触摸屏上的输入点坐标
//创建日期:2007.8.7
//创建人:cqy
#include "44b.h"
#include "44blib.h"
#include<stdio.h>
#include<string.h>
#define TOUCH_MSR_Y   0x9c//读Y轴坐标命令
#define TOUCH_MSR_X   0xdc//读X轴坐标命令
typedef struct {
	int  Pressed;
	int  x;
	int  y;
}TOUCHSTATE;

TOUCHSTATE _State;
void Beep(unsigned int time)
{	
	unsigned int save_C,save_PC,save_DC;
	save_C=rPCONC;
	save_PC=rPUPC;
	save_DC=rPDATC;
	rPDATC|=0x1;
	Delay(time);
	rPDATC&=~(0x1);
	rPCONC=save_C;
	rPUPC=save_PC;
	rPDATC=save_DC;
}
int ReadTouch(unsigned char command)//TouchStruct *TouchState) 
{ 
	
	unsigned char temp,i,ack,j,k;

	ack=0; //EXINT2(PG2)<-PENIRQ,PC3->CS,PF8->DCLK,PF7<-DOUT,PF6<-BUSY,PF5->DIN 
	rPDATF&=0x0ff;//clr dclk;PF8=0
	rPDATC&=0xfff7;//clr cs;PC3=0;;
 	temp=0x80; 
	for(i=0;i<8;i++) 
	{ 
		if(command&temp)//mov din,c 
			rPDATF|=0x20;//setb din;PF5=0 
		else 
			rPDATF&=0x1df;//clr din;PF5=1 
			rPDATF|=0x100;//setb dclk;PF8=1 
			Delay(3); 
		rPDATF&=0x0ff;//clr dclk 
		Delay(3); 
		temp=temp>>1;
	} 
	while((temp=(rPDATF&0x40))==0);//判断BUSY位;PF6 
	rPDATF&=0x1df;//clr din 
	rPDATF|=0x100;//setb dclk 
	Delay(3); 
	rPDATF&=0xff;//clr dclk 
	Delay(3); 
	for(i=0;i<7;i++) 
	{ 
		rPDATF|=0x100;//setb dclk 
		if(temp=rPDATF&0x80)//当OUT==1时
		 	ack+=1; 
		ack=ack<<1; 
		Delay(3); 
		rPDATF&=0xff;//clr dclk 
		Delay(3);
	} 
	rPDATF|=0x100;//setb dclk 
	if(temp=rPDATF&0x80) 
		ack+=1; 
	Delay(3); 
	rPDATF&=0xff;//clr dclk 
	rPDATC|=0x8;//setb cs 
	
	return ack;
} 
void Test_Touch(void)
{
	 unsigned int save_C,save_F,save_G,save_PC,save_PF,save_PG;
	 save_C=rPCONC;
	 save_F=rPCONF;
	 save_G=rPCONG;
	 save_PC=rPUPC;
	 save_PF=rPUPF;
	 save_PG=rPUPG;
	 _State.Pressed=0;
	 _State.x=0;
	 _State.y=0;
	 //init.I/O
	 //F8     F7   F6    F5  F4 F3 F2 F1 F0
	 //DCLK  DOUT  BUSY  DIN
	 //001   000   000   001 00 00 00 00 00
	 rPCONF=0x80400;// DCLK SET OUT;DOUT SET IN;BUSY SET IN;DIN SET OUT
	 rPUPF=0x1e0;
	 //rPCONC|=0x41;//SET CS OUT AND BELL OUT
	 rPCONC=0x0f05ff41;
	 rPUPC=0x8;//PC3
	 //rPDATC=0xfffe;
	 rPCONG=0x00;//SET PENIRQ INPUT
	 rPUPG=0x04;//PENIRQ pull up disable
	 ReadTouch(0xdc);
	 
	while(1)
	{ 
		if(((rPDATG&0x4)==0)&&(_State.Pressed==0)) //PENIRQ电平为低 
		{ 	
			_State.Pressed=1;//说明已经按下 
			_State.x=ReadTouch(TOUCH_MSR_X); 
			_State.y=ReadTouch(TOUCH_MSR_Y); 
			printf("\nTouch at the point ( %4d, %4d )",_State.x,_State.y);
			Beep(1000);
		} 
		else  if(((rPDATG&0x4)!=0)&&(_State.Pressed==1))
 				_State.Pressed=0; 
		Delay(100);
	}
	rPCONC=save_C;
	rPCONF=save_F;
	rPCONG=save_G;
	rPUPC=save_PC;
	rPUPF=save_PF;
	rPUPG=save_PG;
}
int main(void)
{
	printf("Please touch the Touchscreen:");
	Test_Touch( );
	return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -