📄 ads7843.c
字号:
//*********************************************************************************************************************
//【 版 权 】Copyright (c) 2007-2008 http://gliethttp.cublog.cn
//
//【 文 件 版 本 】v1.x
//
//【 文 件 名 称 】ads7843.c
//
//【 创 建 日 期 】2007-12-27
//
//【 功 能 描 述 】
//*********************************************************************************************************************
#include <ads7843.h>
#include <XDBGU.h>
#include <stdio.h>
//--------------------------------------------------------------
_xTouch xxTouch = { true,false,false,{0xffff,0xffff} };
_xTouch *xTouch = &xxTouch;
//--------------------------------------------------------------
void __irq ads7843_interrupt_proc(void);
void set2irq(void);
void ads7843_ini(void)
{
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,((unsigned int)1<<AT91C_ID_PIOB));
AT91F_PIO_CfgInput(AT91C_BASE_PIOB, Touch_DOUT | Touch_PIRQ);
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, Touch_DCLK | Touch_CS | Touch_DIN );
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC,
AT91C_ID_PIOB,
1,
//AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
//AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,//双边沿
//AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,//
(void(*)(void))ads7843_interrupt_proc);
set2irq();
}
void set2irq(void)
{
{volatile dummy;dummy = AT91C_BASE_PIOB->PIO_ISR;}
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOB,Touch_PIRQ);
{volatile dummy;dummy = AT91C_BASE_PIOB->PIO_ISR;}
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_PIOB);
}
void set2input(void)
{
//AT91C_BASE_AIC->AIC_ICCR = ( 1 << AT91C_ID_IRQ1 );
//AT91F_AIC_DisableIt(AT91C_BASE_AIC, AT91C_ID_IRQ1);
AT91F_PIO_InterruptDisable(AT91C_BASE_PIOB,Touch_PIRQ);
AT91F_AIC_DisableIt(AT91C_BASE_AIC, AT91C_ID_PIOB);
//{volatile dummy;dummy = AT91C_BASE_PIOB->PIO_ISR;}
}
//--------------------------------------------------------------
void Touch_write(uint8 data)//触屏传输速率最大125Kbits
{uint8 i;
for(i = 0;i < 8;i++)
{
clr_dclk(); //低电平改变数据数据
if(data & 0x80)set_din();
else clr_din();
data <<= 1;
set_dclk();
}
clr_dclk();
}
//--------------------------------------------------------------
uint16 Touch_read(void)//触屏传输速率最大125Kbits
{uint8 i;
uint16 result = 0;
for(i = 0;i < 12;i++)
{
result <<= 1;
set_dclk(); //仅有下降沿读取数据
clr_dclk();
if(Get_ADS7843_data())result++;
}
return result;
}
//---------------------------------------------------------------
uint16 Get_X(void)
{
Touch_write(0x90);
return Touch_read();
}
uint16 Get_Y(void)
{
Touch_write(0xD0);
return Touch_read();
}
//---------------------------------------------------------------
void __irq ads7843_interrupt_proc(void)
{
{volatile dummy;dummy = AT91C_BASE_PIOB->PIO_ISR;}
AT91C_BASE_AIC->AIC_EOICR = 0;
if(Get_TouIRQ() == 0)
{
set2input();
xTouch->down = true;
xTouch->up = false;
xTouch->IRQ_Mod = false;
}
}
//---------------------------------------------------------------
#if XTOUCH_DEBGU
static char data[50];
#endif
void ads7843_proc(void)
{
if(xTouch->down == true)
{
if( Get_TouIRQ() )
{//触屏抬起
{uint32 count;for(count = 0;count < 0xfff;count++);}
if( Get_TouIRQ() )
{
xTouch->down = false;
xTouch->up = true;
#if XTOUCH_DEBGU
xxxdprintf("\r\nTouch抬起\r\n");
#endif
}
}else
{uint16 x,y;//OS_CPU_SR cpu_sr;
clr_chcs();
x = Get_X();
y = Get_Y();
//OS_ENTER_CRITICAL();
xTouch->value.x = x;
xTouch->value.y = y;
//OS_EXIT_CRITICAL();
set_chcs();
#if XTOUCH_DEBGU
sprintf(data,"x=%d,y=%d\r\n",
xTouch->value.x,xTouch->value.y);
xxxdprintf(data);
#endif
}
}
if(xTouch->up == true)
{
if(xTouch->IRQ_Mod == false)
{
xTouch->IRQ_Mod = true;
set2irq();
/*
Set_IRQMod();
AT91C_BASE_AIC->AIC_ICCR =
( 1 << AT91C_ID_IRQ1 );
AT91F_AIC_EnableIt(AT91C_BASE_AIC,
AT91C_ID_IRQ1);
*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -