📄 lpc_lib_touch.c
字号:
/*
**********************************************************************************************
*
* Embest Info&Tech Co., Ltd. All rights reserved.
* www.embedinfo.com
*
*file: lpc_lib_LCD.c
*author: z.x.q. embest
*establish: 2006.xx.xx
*modify: xx
*notes: xx
**********************************************************************************************
*/
/*
**********************************************************************************************
* include files
**********************************************************************************************
*/
//#include "..\..\com\lpc_lib_keyboard\lpc_lib_keyboard.h"
#include "..\..\com\lpc_lib_touch\lpc_lib_touch.h"
/*
**********************************************************************************************
* extern function/variable declare
**********************************************************************************************
*/
extern irq_eint0(void);
void irq_eint0_svr(void);
/*
**********************************************************************************************
* global variable define
**********************************************************************************************
*/
INT8U X,Y; //X:读到的X轴坐标值;Y:读到的Y轴坐标值
INT8U touch_data[2]; //读到的触摸点的坐标touch_data[2]={X,Y}
/*
********************************************************************
* name : touch_init
* func : 触摸屏的初始化,设置7843的各个端口,除了SPI口
* para : none
* ret : none
* modify:
* comment:
********************************************************************
*/
void touch_init()
{
INT32U i;
//设7843的BUSY,CS,IO1
i=PINSEL1;
i&=(~_7843_BUSY_CS_IO1_MASK);
i |= _7843_BUSY_CS_IO1;
PINSEL1 = i;
//cs->p0.27,io1->p0.18 为输出口,
IODIR0|=0x08040000;
//busy->p0.28为输入口
IODIR0&=0xefffffff;
/* //试试这个
INT32U i;
IODIR0&=0xFFFEFFFF; //before set P0.16pin to eint0,must set the pin sate
PINSEL1&=0xFFFFFFFC;
i=PINSEL1; //select eint0 pin
i &=0xFFFFFFFC; //后两位清零
i |=0x00000001; //最后一位置1
PINSEL1=i;
*/
//这0.16为输入口
IODIR0&=0xFFFEFFFF; //去掉这句试试
//P0.16为GPIO口
i=PINSEL1;
i&=(~P0_16_GPIO_MASK);
i |=P0_16_GPIO;
PINSEL1 = i;
//P0.16为EINT0口
i=PINSEL1;
i&=(~P0_16_EINT0_MASK);
i |=P0_16_EINT0;
PINSEL1 = i;
io1_set(1);
cs_set(0);
}
/*
********************************************************************
* name : touch_init
* func : 触摸屏的初始化,设置7843的各个端口,除了SPI口
* para : none
* ret : none
* modify:
* comment:
********************************************************************
*/
void io1_set(INT8U on_off)
{
INT8U i;
if(on_off)
{
//P0.18
//set IO1_7843=1
i=IOSET0;
i|=(0x01<<18);
IOSET0=i;
}
else
{
//P0.18
//set IO1_7843=0
i=IOCLR0;
i|=(0x01<<18);
IOCLR0=i;
}
}
/*
********************************************************************
* name : touch_init
* func : 触摸屏的初始化,设置7843的各个端口,除了SPI口
* para : none
* ret : none
* modify:
* comment:
********************************************************************
*/
void cs_set(INT8U on_off)
{
INT8U i;
if(on_off)
{
//P0.27
//set cs_7843=1
i=IOSET0;
i|=(0x01<<27);
IOSET0=i;
}
else
{
//P0.27
//set cs_7843=0
i=IOCLR0;
i|=(0x01<<27);
IOCLR0=i;
}
}
/*
**********************************************************************************************
* name: init_ext
* func: initialize EINT0
* para: none
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void init_ext(void)
{
//调试时可设置EXTMODE =0;电平触发;EXTPOLAR=0;低电平有效
// EXTMODE =1; //选择EINT0为边沿触发模式
// EXTPOLAR=1; //设置EINT0的中断极性为上升沿触发
//打开EINT0中断(设置中断向量控制器,即使用向量IRQ)
VICIntSelect=0x00000000; //将所有中断分配为IRQ中断
VICVectCntl0=0x2E; //设置EINT0为向量IRQ中断,并使能,且优先级最高
VICVectAddr0=(INT32U)irq_eint0;//设置EINT0的向量地址
EXTINT =1; //中断重新使能前,清除eint0的标志位
VICIntEnable=1<<14; //使能EINT0中断请求
}
/*
**********************************************************************************************
* name: init_ext
* func: initialize EINT0
* para: none
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
void irq_eint0_svr(void)
{
//关中断,清中断标志
VICIntEnable=1<<14; //关中断
EXTINT =1; //中断重新使能前,清除eint0的标志位
// VICIntEnClr=1<<14; //使能eint0中断请求
touch_data[X,Y]=touch_read();
while((EXTINT&0x01)!=0) //wait for einterrupt=1 等待外部中断恢复高电平
{
EXTINT=0x01; //clear EXTINT 中断标志位
}
VICVectAddr=0; //向量中断结束
}
/*
**********************************************************************************************
* name: init_ext
* func: initialize EINT0
* para: none
* ret: none
* modify:
* comment:
**********************************************************************************************
*/
INT8U touch_read()
{
INT8U X=0,Y=0,data[2]={X,Y};
time_dly(10000); //中断后延时以消除抖动,使得采样数据更准确
//spi_init(0, 1, 1);//启动SPI
//while(P0_28__GPIO_028); //如果BUSY信号不好使可以删除不用
time_dly(2);
X=spi_read_7843(0,0x90);//送控制字 10010000 即用差分方式读X坐标 详细请见有关资料
//读X轴坐标
//A2:A0用于选择数据输入通道,101选择X坐标测量,001选择Y坐标测量。
// while(BUSY); //如果BUSY信号不好使可以删除不用
time_dly(2);
Y=spi_read_7843(0,0xD0);//送控制字 11010000 即用差分方式读Y坐标 详细请见有关资料
//读Y轴坐标
spi_init(0, 1, 1); //释放SPI
return data[X,Y];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -