zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    sphinx实时索引和高亮显示
    打开页面就进行下载的一种方法
    mysql开启慢查询日志以及查看(转载自网络)
    Best MVC Practices(最优的MVC布局)
    nginx虚拟机配置(支持php)
    一个简单大方的赞后+1,踩后-1js动画效果
    如何创建ajax对象?
    psd图片到html
    小知识
    sass入门
  • 原文地址:https://www.cnblogs.com/memset/p/2789047.html
Copyright © 2011-2022 走看看