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

📄 ads7843.c

📁 ads7843+5个串口+1个定时器+at91rm9200测试源程序
💻 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 + -