touch.c

来自「触摸屏控制芯片AR7643的驱动程序 drive program of Tou」· C语言 代码 · 共 125 行

C
125
字号

#define SET_BIT(io ,bit)    ( io |=   (1<<bit) ) //example: SET_BIT(PORTA,0);SET_BIT(DDRA,0);   
#define CLR_BIT(io ,bit)    ( io &=  ~(1<<bit) ) //example: CLR_BIT(PORTA,0);CLR_BIT(DDRA,0);   
#define GET_BIT(pin,bit)    ( pin &   (1<<bit) ) //example: GET_BIT(PINA,0);  
#define SET_IN( dir,bit)    ( dir &= ~(1<<bit) ) //example: SET_IN(DDRA,0);  
#define SET_OUT(dir,bit)    ( dir |=  (1<<bit) ) //example: SET_OUT(DDRA,0);  

#define SET_CS    SET_BIT(PEN_PORT,PENCS)   //CS---PC1		(OUT)
#define CLR_CS    CLR_BIT(PEN_PORT,PENCS) 
#define SET_DCLK    SET_BIT(PEN_PORT,PENCLK)   //CLK---PC2 (OUT)
#define CLR_DCLK    	CLR_BIT(PEN_PORT,PENCLK) 
#define SET_DIN    SET_BIT(PEN_PORT,PENDIN)   //DIN---PC3	(OUT)
#define CLR_DIN    CLR_BIT(PEN_PORT,PENDIN)
#define GET_DOUT    GET_BIT(PEN_PIN,PENDOUT) 	 //DOUT---PC4	(IN)
#define GET_BUSY    GET_BIT(PEN_PIN,PENBUSY)  	//BUSY---PC5	(IN)


unsigned int XAD_temp[10]={0};
unsigned int YAD_temp[10]={0};


/***********************************************************************
                    delay
************************************************************************/
void delay(unsigned int i)
{
    while(i--);
}


/***********************************************************************
                    SPI开始
************************************************************************/
void Start(void)
{
    CLR_DCLK;
    SET_CS;
    SET_DIN;
    SET_DCLK;
    CLR_CS;
}

/***********************************************************************
                    SPI写数据
************************************************************************/
void WriteCharTo7643(unsigned char num) 
{
    unsigned char count=0;
    CLR_DCLK;
    for(count=0;count<8;count++)
    {
        if((num&0x80)==0x80)    SET_DIN;
        else CLR_DIN;
        num<<=1;
        CLR_DCLK;     //上升沿有效
        SET_DCLK;                                     
    }
}

/***********************************************************************
                    SPI 读数据,返回12位AD转换结果
************************************************************************/
unsigned int ReadIntFrom7643(void) 
{
	
    unsigned char count=0;
    unsigned int Num=0;
	
    for(count=0;count<12;count++)
    {
        Num<<=1;
        SET_DCLK;                                      //下降沿有效
        CLR_DCLK;                                     
        if(GET_DOUT) Num++;
    }
	
    return(Num);
	
}


/***********************************************************************
                    芯片初始化为中断模式12 位AD 转换
************************************************************************/
void _7643_Init(void)
{
    Start(); //启动SPI
    while(GET_BUSY); //如果BUSY信号不好使可以删除不用
    delay(2);
    WriteCharTo7643(0x80);
    SET_CS;
}


/***********************************************************************
                    采样一次数据
                    取得按下点X坐标、Y坐标对应的AD值
                    存入XAD_temp[],YAD_temp[]
************************************************************************/
void GetOneAD(unsigned char count)  
{
    unsigned int X=0,Y=0;
    unsigned int temp;
    Start(); //启动SPI
    while(GET_BUSY); //如果BUSY信号不好可以删除不用
    delay(2);

    WriteCharTo7643(0x90); //送控制字 10010000 读X坐标 
    //while(GET_BUSY)		;   			  //如果BUSY信号不好可以删除不用
    delay(2);
    SET_DCLK;                                                 
    CLR_DCLK;                                                 
    XAD_temp[count]=ReadIntFrom7643();  //读X轴坐标
		
    WriteCharTo7643(0xD0); //送控制字 11010000 读Y坐标 
    SET_DCLK;                                                 
    CLR_DCLK;                                                 
    YAD_temp[count]=ReadIntFrom7643();
		
    		
    SET_CS;
		
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?