ADS7843/XPT2046觸摸屏芯片8051單片機驅動程序


這兩個芯片稍有不同, 我還沒寫出來, 芯片數據手冊上面寫了的, 請參考~

我的彩屏的大小是240*320~
以下是代碼

//common.h
#ifndef __COMMON_H__
#define __COMMON_H__

#include <reg52.h>
#include <intrins.h>

typedef unsigned int uint;
typedef unsigned char uchar;

#endif// !__COMMON_H__
//TouchPad.c
#define __TOUCHPAD_C__
#include "TouchPad.h"
//我的屏幕接口
//#include "gdi.h"

sbit TP_CLK = P1^4; //時鍾
sbit TP_CS = P1^5;  //片選
sbit TP_IN = P1^6;  //數據輸入
//sbit TP_BUSY = P1^3;  //我沒有使用忙碌標志
sbit TP_OUT = P1^7; //數據輸出
sbit TP_IRQ = P3^2; //通過INT0通知MCU

/*
 * 函數:檢測觸摸屏是否處於中斷中,在中斷中調用檢測
 * 參數:(無)
 * 返回:0-沒有,非0:觸摸屏被按下
 */
uchar tp_isirq(void)
{
    return !(uchar)TP_IRQ;
}

//開啟外部中斷1,通過外部中斷通知MCU
void tp_init(void)
{
    EX0 = 1;
    IT0 = 1;
    EA = 1;
    TP_CS = 1;
    TP_CLK = 1;
    TP_IN = 1;
    TP_CLK = 1;
}
/* 函數:SPI方式寫一個字節
 * 參數:ch:uchar:字節值
 * 返回:(無)
 */
void tp_write(uchar ch)
{
    uchar k;
    TP_CLK = 0;
    for(k=0; k<8; k++){
        ch <<= 1;
        TP_IN = CY;
        TP_CLK = 0;
        _nop_();
        TP_CLK = 1;
        _nop_();
    }
}
/*
 * 函數:SPI方式讀函數
 * 參數:(無)
 * 返回值:12位有效數據
 */
uint tp_read(void)
{
    uchar k;
    uint ret = 0;
    for(k=0; k<12; k++){
        ret <<= 1;
        TP_CLK = 1;
        _nop_();
        TP_CLK = 0;
        _nop_();
        if(TP_OUT)
            ret++;
    }
    return ret;
}

/*
 * 函數:取得X,Y的坐標,但沒有比較采樣
 * 參數:struct tp_point 的結構體指針
 * 返回:(無)
 * 注釋:外部不要調用, 有誤差
 */
void tp_get_pt(struct tp_point* pt)
{
    TP_CS = 0;
    tp_write(0x90);//讀取Y
    TP_CLK = 1;
    _nop_();
    TP_CLK = 0;
    _nop_();
    pt->y = tp_read();
    tp_write(0xd0);//讀取X
    TP_CLK = 1;
    _nop_();
    TP_CLK = 0;
    _nop_();
    pt->x = tp_read();
    TP_CS = 1;
}

/*
 * 函數:取得觸摸屏坐標函數
 * 參數: int型的x,y的指針
 * 返回值:
 *      返回0-采樣失敗
 *      返回非0-有效采樣
*/
int tp_get(int* px, int* py)
{
    struct tp_point pt1;
    struct tp_point pt2;
    int x,y;
    //兩次取值並采樣
    tp_get_pt(&pt1);
    tp_get_pt(&pt2);
    x = pt1.x-pt2.x;
    y = pt1.y-pt2.y;
    //誤差不是很大則有效
    if(x<2 && y<2)
    {
        //這個計算還不清楚,資料上的
        *px = 240-(pt1.x-330)*10/142;
        *py = 320-(pt1.y-380)/11;
        return 1;
    }
    return 0;
}
//TouchPad.h
/*
    文件:TouchPad.h
    描述:觸摸屏相關支持文件
    時間:2012-11-02
    作者:女孩不哭
    Q--Q:191035066
    文本:ts=4, sw=4, sts=4
*/


#ifndef __TOUCHPAD_H__
#define __TOUCHPAD_H__
#include "common.h"
//common.h
/*
typedef unsigned char uchar;
typedef unsigned int uint;
#include <reg52.h>
*/


int tp_get(int* px, int* py);   //獲取當前坐標點, 返回值不為零為有效
void tp_init(void);             //觸摸屏初始化函數
uchar tp_isirq(void);           //判斷觸摸屏是否依然在中斷中

#ifdef __TOUCHPAD_C__
//內部結構,函數
struct tp_point{
    int x;
    int y;
};

void tp_get_pt(struct tp_point* pt);
uint tp_read(void);
void tp_write(uchar ch);

#undef __TOUCHPAD_C__
#endif



#endif // !__TOUCHPAD_H__
//示例使用方法
//main.c
#include "common.h"
#include "TouchPad.h"

//觸摸屏通過外部中斷0方式通知MCU進行采樣
//應該寫在主模塊中
void int0(void) interrupt 0
{
    int x=0,y=0;
    EA = 0;
    while(1){
        if(tp_isirq()){
            if(!tp_get(&x, &y))     
                continue;   
            //x,y是取得的坐標
            //set_pixel是我的屏幕畫點的函數
            //改成自己的使用方法
            //set_pixel(x,y, 0xaaaa);
            //set_pixel(x+1,y, 0xaaaa);
            //set_pixel(x,y+1, 0xaaaa);
            //set_pixel(x+1,y+1, 0xaaaa);
        }else{
            break;
        }
    }
    EA = 1;
}
        


void main(void)
{
    //delay_ms(200);//自己實現
    tp_init();
    while(1)
        ;
}

女孩不哭(QQ:191035066)@2012-11-26 14:40:46 http://www.cnblogs.com/nbsofer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM