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

📄 tcmp.h

📁 我用AVR读取触摸屏
💻 H
字号:
#include <iom32.h>
//清0和置1
#define set_0 0x01 
#define set_1 0x02
#define set_2 0x04 
#define set_3 0x08 
#define set_4 0x10 
#define set_5 0x20
#define set_6 0x40 
#define set_7 0x80 
#define clr_0 0xfe 
#define clr_1 0xfd 
#define clr_2 0xfb
#define clr_3 0xf7
#define clr_4 0xef 
#define clr_5 0xdf 
#define clr_6 0xbf 
#define clr_7 0x7f 
#define set_8 0X100 
#define clr_8 0XFEFF
#define set_9 0X200
#define clr_9 0XFDFF
#define set_10 0X400 
#define clr_10 0XFBFF
#define set_11 0X800
#define clr_11 0XF7FF

#define set_12 0X1000 
#define clr_12 0XEFFF
#define set_13 0X2000
#define clr_13 0XDFFF
#define set_14 0X4000 
#define clr_14 0XBFFF
#define set_15 0X8000 
#define clr_15 0X7FFF
#define clr_REFS1 ADMUX &= clr_7
#define set_REFS0 ADMUX |= set_6		//外部基准
#define clr_ADLAR ADMUX &= clr_5		//AD右对齐
#define set_ADEN  ADCSRA |= set_7		//ADC 使能
#define clr_ADATE ADCSRA &= clr_5		//关闭ADC 自动触发使能  
#define clr_ADIE  ADCSRA &= clr_3	  // ADC 中断使能  
//转换状态
#define cad_cmtzzt 0				//AD转换停止状态 
#define cad_cddjgsjdzt 1	        //等待间隔时间到状态
#define cad_cmzhzt 2				//AD转换数据状态 
#define cad_cydcadclzt 3            //已读出AD处理状态
//参数
#define cad_adycsj 5			    //转换溢出时间 
#define cad_jcpmjg 10			    //检测屏幕间隔
#define cad_yzads 10                //一组AD数  
#define cad_cyjg  2                 //2次采样间隔
//
#define set_ADSC ADCSRA |= set_6	//ADC 开始转换 
#define clr_ADSC ADCSRA &= clr_6   
#define qs_yzhjs (ADCSRA&set_6)		//AD已转换完毕 
#define qs_yaxxh (PINA&set_4)			//检测按下信号
#define ui_x_adwxh ui_x_ad &= clr_12;			//无触摸信号标志 
#define ui_x_adyxh ui_x_ad |= set_12;			//有触摸信号标志
//无信号时把AD,X坐标转换结果的第12位清零 

class Tcmp
{
  public:
    unsigned int ui_x_ad;
    unsigned int ui_y_ad;  	//公有变量,X,Y坐标
	unsigned int bb;
    void hsadcl(unsigned char uc_t2msyd);          	//公有函数ad处理
  private:
    void hsscadtzxh(void);      	//私有函数输出AD停止时的IO状态
    void hsscaddyz(void);       	//私有函数输出AD第一组的IO状态
    void hsscaddez(void);       	//私有函数输出AD第二组的IO状态
    void hsydcadcl(void);       	//私有函数已读出AD处理
    void hsjx(unsigned int *dz,unsigned char gs); //私有函数数据升序
  private:
    static unsigned char uc_zhzt;	   		//私有变量转换状态
    static unsigned char uc_cswz;	     	//私有变量存数位置
    static unsigned char uc_adzhsjyc;  		//私有变量转换时间溢出
    static unsigned int ui_adzhjg[20];		//私有变量ad转换结果
    static unsigned int uc_jcpmjg;	      	//私有变量检测屏幕间隔 
	unsigned int gg;
};
unsigned char Tcmp::uc_zhzt = 0;			//转换状态
unsigned char Tcmp::uc_cswz = 0;			//存数位置
unsigned char Tcmp::uc_adzhsjyc = cad_adycsj;		//转换时间溢出
unsigned int Tcmp::ui_adzhjg[20]= {0};;	                //ad转换结果
unsigned int Tcmp::uc_jcpmjg = cad_jcpmjg;		//检测屏幕间隔 
unsigned int ui_x_ad = 0;
unsigned int ui_y_ad = 0;
void Tcmp::hsadcl(unsigned char uc_t2msyd)         //公有函数ad处理
{
	static unsigned int adsjh;
	static unsigned int adsjl;
	clr_REFS1;
	set_REFS0;	        	//外部基准
	clr_ADLAR;		        //AD右对齐
    set_ADEN;	        	//ADC 使能
    clr_ADATE;        		//关闭ADC 自动触发使能  
    clr_ADIE;        		// ADC 中断使能
    switch(uc_zhzt)	        //转换状态
    {
		case cad_cmtzzt:	        //AD转换停止状态
		{
			hsscadtzxh();                       //输出AD停止时的IO状态
        	if(uc_jcpmjg == 0)	  			    //检测屏幕间隔
        	{
				if(qs_yaxxh == 0)			    //检测按下信号
				{
					uc_zhzt = cad_cddjgsjdzt;   //等待间隔时间到状态
				}
				else
				{
					ui_x_adwxh;			//无触摸信号标志
				}
				uc_adzhsjyc = cad_adycsj;	//转换溢出时间
				uc_jcpmjg = cad_jcpmjg;		//检测屏幕间隔
			}
			else
			{
				if(uc_t2msyd != 0)
				{
					--uc_jcpmjg;	  	//检测屏幕间隔
				}
			}
			uc_cswz = 0;				//存数位置
		}
		break;	   
		case cad_cddjgsjdzt:				//等待间隔时间到状态
		{
			if(uc_jcpmjg == 0)	  			//检测屏幕间隔
			{						   	
				uc_zhzt = cad_cmzhzt;			//转换数据状态
				uc_adzhsjyc = cad_adycsj;	//转换溢出时间
				uc_jcpmjg = cad_jcpmjg;		//检测屏幕间隔
				set_ADSC;                   //启动AD转换  
			}
			else
			{
				if(uc_t2msyd != 0)
				{
					--uc_jcpmjg;	  	//检测屏幕间隔
				}
				if(uc_cswz<cad_yzads)            //一组AD数
				{
                    hsscaddyz();                //输出AD第一组的IO状态    
				}
				else
				{
					hsscaddez();                //输出AD第二组的IO状态
				}
			} 
		}
		break; 
		case cad_cmzhzt:					//AD转换数据状态
		{
			if(uc_adzhsjyc == 0)		//转换时间溢出
			{
				uc_zhzt = cad_cmtzzt;		//AD转换停止
				uc_jcpmjg = cad_jcpmjg;	//检测屏幕间隔	
			}
			else
			{
				if(uc_t2msyd != 0)
				{
					--uc_adzhsjyc;		//转换时间溢出
				}
				if(qs_yzhjs == 0)		//AD已转换完毕
				{            
				    adsjl = ADCL;
					adsjl &= 0xff;
					adsjh = ADCH; 
					adsjh = adsjh<<8;
					adsjh &= 0xff00;
					ui_adzhjg[uc_cswz] = adsjh|adsjl;	//存数位置
					if((uc_cswz == (cad_yzads-1))||(uc_cswz ==(cad_yzads+cad_yzads-1)))//一组AD数已读出
					{
					    uc_zhzt = cad_cydcadclzt;         //已读出AD处理
					    uc_adzhsjyc = cad_adycsj;	    //转换溢出时间
				        uc_jcpmjg = cad_jcpmjg;		    //检测屏幕间隔	
					}
					else
					{
						++uc_cswz;		                //存数位置   
						uc_zhzt = cad_cddjgsjdzt;   //等待间隔时间到状态
						uc_adzhsjyc = cad_adycsj;	    //转换溢出时间
						uc_jcpmjg = cad_cyjg;              //2次采样间隔
					}
				}
			}
				
		}
		break;
		case cad_cydcadclzt:                      //已读出AD处理状态
		{ 
		    hsscadtzxh();                       //输出AD停止时的IO状态
			if(uc_jcpmjg == 0)	  			    //检测屏幕间隔
			{
				if(qs_yaxxh == 0)			    //检测按下信号
				{
					if(uc_cswz == (cad_yzads-1))    //读出的是第一组数据
					{    
					    ++uc_cswz;
					    uc_zhzt = cad_cddjgsjdzt;	        //等待间隔时间到状态  
					    uc_adzhsjyc = cad_adycsj;	        //转换溢出时间
				        uc_jcpmjg = cad_jcpmjg;		        //检测屏幕间隔
					}
					else
					{ 
					    uc_zhzt = cad_cmtzzt;				//AD转换停止状态
					    hsydcadcl();                        //已读出AD处理 
					    uc_zhzt = cad_cmtzzt;			//AD转换停止  
			            uc_adzhsjyc = cad_adycsj;	    //转换溢出时间
			            uc_jcpmjg = cad_jcpmjg;		    //检测屏幕间隔
					}
				}
				else
				{
					ui_x_ad &= clr_12;			//无触摸信号  
					uc_zhzt = cad_cmtzzt;			//AD转换停止  
			        uc_adzhsjyc = cad_adycsj;	//转换溢出时间
			        uc_jcpmjg = cad_jcpmjg;		//检测屏幕间隔
				}
			}
			else
			{
				if(uc_t2msyd != 0)
				{
					--uc_jcpmjg;	  	//检测屏幕间隔
				}
			}
		}
		break;
		default:
			uc_zhzt = cad_cmtzzt;			//AD转换停止  
			uc_adzhsjyc = cad_adycsj;	    //转换溢出时间
			uc_jcpmjg = cad_jcpmjg;		    //检测屏幕间隔
		break;
	}

}
void Tcmp::hsscadtzxh(void)      //私有函数输出AD停止时的IO状态
{
    DDRA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<7);//4.5.6.i
    DDRA |= (0)|(1<<3)|(1<<7);          //3,7,o
    PORTA |= (0)|(1<<3);                //3+  
    PORTA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<5)|(1<6); //7-
}
void Tcmp::hsscaddyz(void)       //私有函数输出AD第一组的IO状态
{
    DDRA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<5)|(1<<7);     //3,4,6,I
    DDRA |= (0)|(1<<5)|(1<<7);                          //5,7,O 
    PORTA |= (0)|(1<<7);                                //7+
    PORTA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<7);           //,3-,4-,5-,6-, 
    ADMUX &= 0xe6;
    ADMUX |= 06;                //选择AD6
}
void Tcmp::hsscaddez(void)       //私有函数输出AD第二组的IO状态
{
    DDRA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<4)|(1<<6);     //3,5,7,I
    DDRA |= (0)|(1<<4)|(1<<6);                          //4,6,O 
    PORTA |= (0)|(1<<6);                                //6+
    PORTA &= (0)|(1<<0)|(1<<1)|(1<<2)|(1<<6);           //3—,4-,5-,7-, 
    ADMUX &= 0xe7;
    ADMUX |= 07;                //选择AD7
}
void Tcmp::hsydcadcl(void)       //私有函数已读出AD处理
{
    hsjx(&ui_adzhjg[0],10);   
    hsjx(&ui_adzhjg[10],10);
    ui_x_ad = (ui_adzhjg[3]+ui_adzhjg[4]+ui_adzhjg[5])/3;
    ui_y_ad = (ui_adzhjg[13]+ui_adzhjg[14]+ui_adzhjg[15])/3;
    ui_x_adyxh;			//有触摸信号标志
}
void Tcmp::hsjx(unsigned int *dz,unsigned char gs) //私有函数数据升序
{
    unsigned int ui_lss;       //临时数据
     unsigned char uc_ywjh = 0;     //有无交换数据标志  
     unsigned int *bcdz; 
     unsigned char bcgs;
     bcdz = dz; 
     bcgs = gs-1;
     while(uc_ywjh == 0)     //有无交换数据标志
     { 
        dz = bcdz;
        gs = bcgs; 
        uc_ywjh = 1;     //有无交换数据标志  
        while(gs != 0)
        { 
            --gs;
            if(*dz > *(dz+1))
            { 
                ui_lss = *(dz+1);
                *(dz+1) = *dz; 
                *dz = ui_lss; 
                uc_ywjh = 0;     //有无交换数据标志  
            }  
            ++dz;
        }     
	}
}

⌨️ 快捷键说明

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