您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

ADC触摸屏编程_ADC中断

时间:2020-08-05 10:54:00  来源:  作者:
ADC触摸屏编程_ADC中断

 

来源:百问网_嵌入式linux wiki_jz2440 新1期视频维基教程 (视频文字版)

作者:韦东山

本文字数:2725,阅读时长:3.5分钟

第018课 ADC和触摸屏 第006节_触摸屏编程_ADC中断

这节课我们加上ADC中断把触点的xy坐标读出来

查看touchscreen.c

写出这个自动测量的函数
void enter_auto_measure_mode(void)
{
//现在是自动测量,我们没有机会分别设置这些开关

设置AUTO_PST =1
XY_PST = 00

    ADCTSC = AUTO_PST | NO_OPR_MODE;

}

现在是自动测量,我们没有机会分别设置这些开关

ADC触摸屏编程_ADC中断

 

进入中断处理函数

void AdcTsIntHandle(int irq)
{
    if (SUBSRCPND & (1<<TC_INT_BIT))  /* 如果是触摸屏中断 */
        Isr_Tc();

    if (SUBSRCPND & (1<<ADC_INT_BIT))  /* ADC中断,则会进入Adc中断处理函数 */

        Isr_Adc();
    SUBSRCPND = (1<<TC_INT_BIT) | (1<<ADC_INT_BIT);
}

进入触摸屏中断处理函数

void Isr_Tc(void)
{
    //printf("ADCUPDN = 0x%x, ADCDAT0 = 0x%x, ADCDAT1 = 0x%x, ADCTSC = 0x%xnr", ADCUPDN, ADCDAT0, ADCDAT1, ADCTSC);

    if (ADCDAT0 & (1<<15))
    {
        //printf("pen upnr");
        enter_wait_pen_down_mode();
    }
    else    
    {
        /* 进入"自动测量"模式 */
        enter_auto_measure_mode();

        /* 启动ADC */

ENABLE_START = 1就可以了
        ADCCON |= (1<<0);
    }
}

启动ADC

ADC触摸屏编程_ADC中断

 

Adc中断处理函数

void Isr_Adc(void)
{
    进入adc中断后,等待触摸笔松开
    int x = ADCDAT0 & 0x3ff;
    int y = ADCDAT1 & 0x3ff;

    printf("x = %08d, y = %08dnr", x, y);

//等待触摸笔松开模式
    enter_wait_pen_up_mode();
}

烧写
实验发现打印一堆乱码

ADC触摸屏编程_ADC中断

 

应该是printf函数出了问题打开my_printf.c文件,找到printf函数应该是处理第二个数据的时候,没有设置初始值

/*reference :   int vprintf(const char *format, va_list ap); */
static int my_vprintf(const char *fmt, va_list ap) 
{
    char lead=' ';
    int  maxwidth=0;

     for(; *fmt != ''; fmt++)
     {
            if (*fmt != '%') {
                outc(*fmt);
                continue;
            }
    //碰到 % 就重新处理, 初始值应该重新设置初始值上去
        lead=' ';
        maxwidth=0;

        //format : %08d, %8d,%d,%u,%x,%f,%c,%s 
            fmt++;
        if(*fmt == '0'){
            lead = '0';
            fmt++;  
        }

        while(*fmt >= '0' && *fmt <= '9'){
            maxwidth *=10;
            maxwidth += (*fmt - '0');
            fmt++;
        }

            switch (*fmt) {
        case 'd': out_num(va_arg(ap, int),          10,lead,maxwidth); break;
        case 'o': out_num(va_arg(ap, unsigned int),  8,lead,maxwidth); break;               
        case 'u': out_num(va_arg(ap, unsigned int), 10,lead,maxwidth); break;
        case 'x': out_num(va_arg(ap, unsigned int), 16,lead,maxwidth); break;
            case 'c': outc(va_arg(ap, int   )); break;      
            case 's': outs(va_arg(ap, char *)); break;              

            default:  
                outc(*fmt);
                break;
            }
    }
    return 0;
}

重新烧写执行,发现数据变化幅度很大,但至少Adc已经有输出

ADC触摸屏编程_ADC中断

 

我们需要解决输出值不线性的问题

到底是触摸屏质量问题,还是Adc转化精度问题,觉得应该是触摸屏电压不稳定之前不知道DELAY寄存器是用来干嘛的

ADC触摸屏编程_ADC中断

 

等待中断模式时,当触摸笔按下时我们会产生中断,但是可以通过 DELAY来延时产生中断

在前面有一张图

ADC触摸屏编程_ADC中断

 

按下触摸笔,延迟A才可以产生中断,你才可以测量X Y坐标A = D(晶振的周期)D就是 DELAY就是那个寄存器的值晶振周期时12M我们需要设置一下

void adc_ts_reg_init(void)
{
    /* [15] : ECFLG,  1 = End of A/D conversion
     * [14] : PRSCEN, 1 = A/D converter prescaler enable
     * [13:6]: PRSCVL, adc clk = PCLK / (PRSCVL + 1)
     * [5:3] : SEL_MUX, 000 = AIN 0
     * [2]   : STDBM
     * [0]   : 1 = A/D conversion starts and this bit is cleared after the startup.
     */
    ADCCON = (1<<14) | (49<<6) | (0<<3);

    /*  按下触摸屏, 延时一会再发出TC中断
     * 10ms为120000
     *  延时时间 = ADCDLY * 晶振周期 = ADCDLY * 1 / 12000000 = 5ms
     */
    ADCDLY = 60000; 
}

再次烧写,发现数据并不规律我们需要再次改进程序

我们按下触摸屏会产生触摸屏中断,启动自动测量,启动Adc,Adc成功后会进入Adc中断,在函数中打印数据

也许测量过程很长我们就需要判断

void Isr_Adc(void)
{
    int x = ADCDAT0;
    int y = ADCDAT1;
//松开的话打印也是错误的值,所以如果仍然按下才打印
    if (!(x & (1<<15))) /* 如果仍然按下才打印 */
    {
        x &= 0x3ff;
        y &= 0x3ff;
        //打印10进制
        printf("x = %08d, y = %08dnr", x, y);
    }

    enter_wait_pen_up_mode();
}

烧写执行
发现X Y轴输出有问题

ADC触摸屏编程_ADC中断

 

厂家把X Y轴搞反了

电路图中TSYP TSXP接反TSYM TSXM接反

ADC触摸屏编程_ADC中断

 

我们后面使用触摸屏时会使用软件处理这点,不会导致任何问题 

有一个缺点我们按下触摸屏会输出一个数据,再按下触摸屏又输出一个数据我长按并没有输出数据,我滑动也没有输出数据我们需要使用定时器改进这个问题

各种方向的旋转都可以由软件转换

ADC触摸屏编程_ADC中断

 

我们需要把触摸屏的坐标TS XY坐标转换成LCD的XY坐标需要用应用程序做我们常使用Tslib库来做,这些旋转倒置都没有问题



Tags:ADC触摸屏编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
第018课 ADC和触摸屏 第006节_触摸屏编程_ADC中断...【详细内容】
2020-08-05  Tags: ADC触摸屏编程  点击:(382)  评论:(0)  加入收藏
▌简易百科推荐
1. 前言了解响应式编程,首先我们需要了解函数式操作和Stream的操作,下面我们简单的复习一下喽。1.1 常用函数式编程函数式接口中我们先来回顾一下Java中的函数式接口。常见的...【详细内容】
2022-07-15  二哥学Java    Tags:编程   点击:(1)  评论:(0)  加入收藏
在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastify 构建一个 Full-stack 应用程序。在本文中,我们将学习如何使用 Next.js、 Prisma、 Postgres 和 Fastif...【详细内容】
2022-07-12  qaseven    Tags:全栈   点击:(9)  评论:(0)  加入收藏
好的软件开发网站有哪些?做软件开发哪些网站能提供帮助呢?这些很多做软件开发的小伙伴都会问到的问题。007出海全球社交流量导航网站,整合了多方出海跨境网站资源,为你介绍出海...【详细内容】
2022-07-08  Chuhai007    Tags:软件开发   点击:(10)  评论:(0)  加入收藏
我们用monkey做压力测试后,会保存一个monkey日志,那如果想快速的分析日志中有哪些异常,我们可以用批处理工具进行快速的筛查,我们一起来看看吧。先编写个小脚本,然后修改为bat后...【详细内容】
2022-07-08  溪流涌动    Tags:monkey   点击:(13)  评论:(0)  加入收藏
白盒测试落地实践分为两个大方向,一个是静态分析,一个是动态分析,当然啦,也可以叫做静态测试和动态测试。那我们如何高质量保效率的做好白盒测试呢?Parasoft已经为您准备好了成熟...【详细内容】
2022-07-08  Parasoft中国    Tags:白盒测试   点击:(11)  评论:(0)  加入收藏
Altium Designer 自带脚本功能的开发项目,可以调用官方AD API接口对原理图或者PCB进行自动操作,本文主要分享开发的流程,和一些基本的概念信息,本文介绍的脚本工具例子可以用在P...【详细内容】
2022-07-07  电子工程师伟哥    Tags:Altium Designer   点击:(21)  评论:(0)  加入收藏
一、目录介绍 前置知识点 NIO Netty 的核心组件 Channel Callback Future 和 Promise 事件和 ChannelHandler Hello World二、前置知识点1、NIO首先我们需要回顾一...【详细内容】
2022-07-06  架构师jickly    Tags:聊天系统   点击:(16)  评论:(0)  加入收藏
1.事件流事件流是对事件执行过程的描述,了解事件的执行过程有助于加深对事件的理解,提升开发实践中对事件运用的灵活度。2.捕获和冒泡捕获阶段是【从父到子】的传导过程,冒泡阶...【详细内容】
2022-07-06  金乾坤    Tags:API   点击:(13)  评论:(0)  加入收藏
刷盘策略CommitLog的asyncPutMessage方法中可以看到在写入消息之后,调用了submitFlushRequest方法执行刷盘策略:public class CommitLog { public CompletableFuture<PutMe...【详细内容】
2022-07-06  Java码农之路    Tags:RocketMQ   点击:(16)  评论:(0)  加入收藏
最近读了本好书-《深度学习推荐系统》,读完不觉全身通畅,于是就有了写这篇文章的想法,把自己的理解和总结分享给大家。 本文将按照从算法到工程的顺序,先介绍一下推荐系统整体...【详细内容】
2022-07-05  InfoQ    Tags:推荐系统   点击:(22)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条