📄 ts.c
字号:
#include "config.h"
int32 TX;
int32 TY;
int32 isDown;
OS_EVENT *TouchMbox;
void TSIrqISR(void)
{
int i;
uint32 Pt[6];
rINTSUBMSK |= (BIT_SUB_ADC|BIT_SUB_TC); //禁止ADC中断
if(rADCDAT0 & 0x8000) //处于抬起状态
{//抬起
isDown = 0;
rADCTSC &= 0xff; //抬起中断,YM使能,YP无效,XM使能,XP无效,上拉无效,自动切换X、Y,等待中断模式
TX = -1;
TY = -1; //抬起触笔时,TX,TY要值成不大于0的数
}
else //按下
{
isDown = 1;
// 按下中断,YM无效,YP使能,XM无效,XP无效,上拉电阻无效,正常模式,X模式
rADCTSC=(0<<8)|(0<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(0<<2)|(1);
for(i=0;i<LOOP;i++); //delay to set up the next channel
for(i=0;i<5;i++) //转换5次
{
rADCCON|=0x1; // 开始AD转换,YP使能,YM、XP、XM无效,模拟通道XP输入
while(rADCCON & 0x1); // 等待转换开始,转换开始时,开始位自动清零
while(!(0x8000&rADCCON)); // 等待AD转换结束
Pt[i]=(0x3ff&rADCDAT0); // 读取AD转换结果
}
Pt[5]=(Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5;//多次采样取平均值
TX = Pt[5];
//按下中断,YM无效,YP无效,XM无效,XP使能,上拉电阻无效,正常模式,Y模式
rADCTSC=(0<<8)|(0<<7)|(1<<6)|(1<<5)|(0<<4)|(1<<3)|(0<<2)|(2);
for(i=0;i<LOOP;i++);
for(i=0;i<5;i++) //转换5次
{
rADCCON|=0x1; //开始转换
while(rADCCON & 0x1); //等待转换开始
while(!(0x8000&rADCCON)); //等待转换结束
Pt[i]=(0x3ff&rADCDAT1); //读取AD转换结束
}
Pt[5]=(Pt[0]+Pt[1]+Pt[2]+Pt[3]+Pt[4])/5;// 多次采样取平均值
TY = Pt[5];
// 抬起中断,YM使能,YP无效,XM使能,XP无效,上拉使能,正常模式,等待中断模式
rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
}
//cprintf("%d,%d\n",TX,TY);
OSMboxPost(TouchMbox, 0); //向处理触摸进程发消息
rSUBSRCPND |= BIT_SUB_TC; //清除子中断
rINTSUBMSK &= ~(BIT_SUB_TC); //不屏蔽子中断
ClearPending(BIT_ADC); //清除中断
}
void TsInit(void)
{
/*
设置唤醒延迟 50000
设置中断控制器 1.预分频使能=6;2.选择模拟通道XP 3.禁止Standby;4.禁止read_start;5.不开始转换
设置触摸屏控制器 1.检测按下 2.YM输出使能,YP输出禁止 3.XM输出禁止、XP输出禁止 4.使能上拉 5.正常转换模式 6.等待中断模式
中断向量赋值
开ADC中断、开TC子中断
*/
OS_EVENT *TouchMbox=OSMboxCreate(NULL); //初始化消息邮箱为空
rADCDLY = (50000);
rADCCON = (1<<14)|(27<<6)|(7<<3)|(0<<2)|(0<<1)|(0);
rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
VICVectAddr[31] = (uint32)TSIrqISR;
rINTMSK &= ~(BIT_ADC);
rINTSUBMSK &= ~(BIT_SUB_TC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -