📄 tcmp.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 + -