19.ARM裸板实现电阻触摸屏控制实例(二)

目录

1.基础预备

2.打印触摸屏坐标数据代码编写

2.优化(增加定时器)

源代码


1.基础预备

思路:

既然已经能检测按下和松开,且能产生中断,那么 就可以在触摸屏中断中开启自动坐标测量模式,然后开启ADC,如果

ADC初始化完成就会产生一个ADC中断,去读取触摸触摸屏的坐标数据就OK了。

 问题:

1.如何进入自动测量模式?

设置ADCTSC寄存器的 [2:0]如下:

2.如何开启ADC?

3.延时寄存器:延时一会再发送触摸屏中断

计算公式:A  =  D  x (1/X-Tal Clock) or  A =  D x (1/External Clock)

此处外部晶振为:12M

延时时间  =  ADCDLY   * 晶振周期   

如果延时5ms的话,那么   ADCDLY    =  60000;


2.打印触摸屏坐标数据代码编写

1.编写进入进入自动测量的函数:

2.启动ADC:

3.ADC转换完成,产生一个ADC中断

通过函数Adc_OR_Ts_IntHandler判断 中断类型

4.在ADC中断服务函数中,直接打印出ADC的XY坐标的数据


编写完成,上传编译,下载到板子上:

调试,点击触摸屏结果如下,得到线性的数据。



 2.优化(增加定时器)

在上边的试验中,虽然说当按下之后已经能打印出正确的坐标数据,但是存在一个缺陷就是,当你按着触摸屏的某一个点不动或者在触摸屏上滑动的时候,显示的数据是不会刷新的,因为在上边程序中在未按下的状态下进入等待按下中断,中断产生之后就会进入自动测量模式,在自动测量模式中进入ADC中断,在ADC中断中去打印出我们按下点的坐标值,接着切换成等待松开中断,松开之后产生一个松开中断。

现在需要优化的时,当我们如果长时间按下,需要去刷新坐标的数据。

如何做?

开启一个定时器,使用一个特定的周期去检测触摸屏是否按下,如果检测到按下,就开启触摸屏测量,然后刷新数据,同理,当滑动触摸屏的时候,屏幕也处于按下状态。此时打印的数据就会随着触摸点的变化而变化。

流程简图:


修改步骤:

1.增加一个定时器

在前面已经对定时器的进行封装,只需要调用定时器的注册函数,就可以产生一个10ms的定时器中断,并执行相应的定时器中断服务函数,具体查看:点我查看

在触摸屏初始化函数中注册一个触摸屏定时器:

通过函数register_timer("ts",TS_timer_irq); ,相当于开启了定时器0,而且每10ms执行一次TS_timer_irq函数。

待会再写这个函数。

2.定时器使能失能函数

因为只有当按下的时候我们才需要去使能这个定时器开启自动测量模式,连续的对数据进行转换,所以当检测到未按下时就应该关闭定时器。这样就需要有一个函数去控制这个定时器的使能和失能。

考虑到直接关闭定时器可能会影响别的函数使用这个定时器。

那就换一种思路,不要直接区关闭这个定时器,而在定时器的中断服务函数中(TS_timer_irq),设置一个全部静态变量,如果使能了定时器,这个静态变量就只设置为1,否则设置为0,然后再服务函数中通过判断这个标志位来决定是否执行触摸屏坐标的刷新函数。

3.修改触摸屏中断函数

在上面已经能实现区分触摸屏和中断和ADC中断了。当按下触摸屏,首先会产生一个触摸屏中断,在触摸屏中断中会区分是按下中断还是松开中断(在初始化的时候默认设置为等待按下中断)。

进入自动测量模式之后,开启ADC,待会会产生一个ADC中断。在ADC中断中就可以通过读取ADCDAT0和ADCDAT1低10位的数据读取到XY的坐标数据。

4.修改ADC中断服务函数

①进入ADC中断之后,如果触摸屏还是按下,才打印数据,并打开定时器(防止打印数据不准确)

②.如果触摸屏松开的话,关闭定时器,并让触摸屏进入等待按下中断模式

③如果说是进入第一种情况之后,说明触摸屏还是按下的,那么此时需要把触摸屏设置为等待松开中断,当触摸屏被松开之后才可以检测到,且再次进入TS_Handler(触摸屏中断服务函数)把触摸屏中断模式重新改为等待按下中断,等待下次的按下。

5.编写触摸屏定时器中断服务函数

当注册了触摸屏的中断服务函数之后,这个定时器是一直处于开启的状态,也就是说每隔10m就会执行一次TS_timer_irq函数

因此在第2步设置了定时器的开关函数。

1.进入定时器中断服务函数,如果发现ts_timer_enable()读取得到的是1,那么说明此时定时器已经使能了(也代表现在触摸屏处于长按的状态),此时就需要重新开启自动测量模式,并启动ADC,具体测量过程就是和上边是一样的。但是如果在这个中断服务函数中一旦检测到了触摸屏已经松开了,马上关闭定时器,并让触摸屏进入等待按下中断模式,等待下一次的按下。

如果定时器未开启,直接返回。


源代码

1.按下松开检测:https://download.csdn.net/download/qq_36243942/11128894

2.动态刷新检测:https://download.csdn.net/download/qq_36243942/11129284

发布了91 篇原创文章 · 获赞 247 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_36243942/article/details/89350374