s3c2440裸机-电阻触摸屏-4.2-isr设计_支持长按和滑动

发布者:安静的夜晚最新更新时间:2024-07-03 来源: elecfans关键字:电阻触摸屏  长按  滑动 手机看文章 扫描二维码
随时随地手机看文章

1.改进定时器

五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。

#define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc;
timer_desc timer_array[TIMER_NUM]; int register_timer(char *name, timer_func fp) {   int i;   for (i = 0; i < TIMER_NUM; i++)   {     if (!timer_array[i].fp)     {       timer_array[i].name = name;       timer_array[i].fp = fp;       return 0;     }   }   return -1; } void unregister_timer(char *name) {   int i;   for (i = 0; i < TIMER_NUM; i++)   {     if (!strcmp(timer_array[i].name, name))     {       timer_array[i].name = NULL;       timer_array[i].fp = NULL;       return 0;     }   }   return -1; } void timer_irq(void) {   int i;   for (i = 0; i < TIMER_NUM; i++)   {     if (timer_array[i].fp)     {       timer_array[i].fp();     }   } }

举个列子:

我们想要用timer来进行进行流水灯实验,那么假如点灯函数为:

Isr_timer_led(){}

那么则只需要在led init的时候进行调用register_timer(“led”, Isr_timer_led), 那么当时间到后触发定时器中断,便会执行timer_irq.进入Isr_timer_led。

2.初始化定时器

五. irq之定时器中断的PWM定时器有详细介绍。这里只贴出code部分:

void timer_init(void) {   /* 设置TIMER0的时钟 */ /* Timer clk = PCLK / {prescaler value+1} / {divider value} = 50000000/(49+1)/16 = 62500   */ TCFG0 = 49; /* Prescaler 0 = 49, 用于timer0,1 */   TCFG1 &= ~0xf;   TCFG1 |= 3; /* MUX0 : 1/16 */ /* 设置TIMER0的初值 */  TCNTB0 = 625; /* 10Ms中断一次 */ /* 加载初值, 启动timer0 */   TCON |= (1<<1); /* Update from TCNTB0 & TCMPB0 */ /* 设置为自动加载并启动 */   TCON &= ~(1<<1);   TCON |= (1<<0) | (1<<3); /* bit0: start, bit3: auto reload */ /* 设置中断 */   register_irq(10, timer_irq); }

3.支持长按和滑动

我们之前是2s timer触发一次中断,那如果是要支持触摸屏,我们必须让定时器10ms就触发一次中断。因此需要修改timer_init中的寄存器参数。

按下触摸屏会产生TSC中断,然后启动ADC进而产生adc中断的时候,在Isr_Adc函数中进行定时器的设置,检测长按和滑动操作。

3.1定义touchscreen_timer_irq

static volatile int g_ts_timer_enable = 0; static void ts_timer_enable(void) {   g_ts_timer_enable = 1; } static void ts_timer_disable(void) {   g_ts_timer_enable = 0; } static int get_status_of_ts_timer(void) {   return g_ts_timer_enable; } /* 每10ms该函数被调用一次 */ void touchscreen_timer_irq(void) {   if (get_status_of_ts_timer() == 0)     return;   if (ADCDAT0 & (1<<15)) /* 如果松开 */   {     ts_timer_disable();     enter_wait_pen_down_mode();     return;   }   /* 如果触摸屏仍被按下, 进入'自动测量模式', 启动ADC */ else /* 按下状态 */   {     /* 进入'自动测量'模式 */     enter_auto_measure_mode();     /* 启动ADC */     ADCCON |= (1<<0);   } }

3.2 register_timer('tsc_timer_irq', touchscreen_timer_irq )

void touchscreen_init(void) {   /* 设置触摸屏接口:寄存器 */   adc_ts_reg_init();   /* 设置中断 */   adc_ts_int_init();   /* 注册定时器处理函数 */ register_timer('touchscreen', touchscreen_timer_irq);   /* 让触摸屏控制器进入'等待中断模式' */   enter_wait_pen_down_mode(); } void Isr_Adc(void) {   int x = ADCDAT0;   int y = ADCDAT1;   if (!(x & (1<<15))) /* 如果仍然按下才打印 */   {     x &= 0x3ff;     y &= 0x3ff;     printf('x = %08d, y = %08dnr', x, y);     /* 启动定时器以再次读取数据 */     ts_timer_enable();   }   else   {     ts_timer_disable();     enter_wait_pen_down_mode();   }   enter_wait_pen_up_mode(); }

我们来分析一下这个程序的过程:

①在touchscreen_init的时候我们先注册了一个timer,然后修改了定时器的产生中断的时间间隔为10ms中断一次,所以touchscreen_timer_irq会每间隔10ms调用一次。没有按下,则touchscreen_timer_irq虽然也有走,但是就直接return.

②然后如果按下触摸屏,产生tsc中断,启动adc,产生adc中断。

如果产生了adc中断,但是读取状态发现已经松开了,则进入”等待按下状态“,并且让touchscreen_timer_irq失效。那么要是状态是被按下,则开启ts_timer_enable。

③当使能touchscreen_timer_irq这个定时器中断服务程序后,并且10ms到了touchscreen_timer_irq函数执行生效。

如果松开了,则进入”等待按下状态“,并且让touchscreen_timer_irq失效,表示没有长按或者滑动。

如果任然按下,输出长按或者滑动后的坐标结果。


关键字:电阻触摸屏  长按  滑动 引用地址:s3c2440裸机-电阻触摸屏-4.2-isr设计_支持长按和滑动

上一篇:s3c2440裸机-电阻触摸屏-5-触摸屏校准原理-五点校准法
下一篇:s3c2440裸机-电阻触摸屏-4-isr设计_获取触摸屏坐标

推荐阅读最新更新时间:2026-03-14 16:11

s3c2440裸机-电阻触摸屏-4.2-isr设计_支持长按滑动
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; int regi
[单片机]
s3c2440裸机-电阻触摸屏编程(4.isr设计_4.2支持长按滑动)
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; in
[单片机]
s3c2440裸机-电阻触摸屏编程(2.触摸屏TS控制器)
触摸屏接口模式 Normal Conversion Mode: 正常转换模式,一般情况下可以配置ADCCON和ADCDAT0来读取数据。 Separate X/Y position conversion Mode: x,y坐标分离转换格式,x坐标会写入ADCDAT0, y坐标会写入ADCDAT1,所以会产生2次中断开分开完成x,y的坐标转换。 Auto(Sequential) X/Y Position Conversion Mode 自动转换模式,当触摸屏按下后,会一次性对x,y方向的坐标进行转换,x坐标会写入ADCDAT0, x坐标会写入ADCDAT1。会产生一次中断进行x,y坐标的自动转换。 Waiting
[单片机]
<font color='red'>s3c2440</font><font color='red'>裸机</font>-<font color='red'>电阻</font><font color='red'>触摸屏</font>编程(2.<font color='red'>触摸屏</font>TS控制器)
S3C2440裸机------触摸屏_电阻触摸屏硬件原理
1.电阻触摸屏原理 2.电阻触摸屏等效电路 2.1触摸屏空闲状态 平时触摸屏没有被按下时,等效电路如图14.5所示。S4、S5闭合,S1、S2、S3断开,即YM接地、XP上拉、XP作为模拟输入(对CPU而言)、YP作为模拟输入、XM高阻。 平时触摸屏没有被按下时,由于上拉电阻的关系,Y_ADC为高电平,当x轴和y轴收挤压而接触导通后,Y_ADC的电压由于连通道y轴接地而变为低电平,此低电平可作为中断触发信号来通知CPU发生“Pen Down”事件。 2.2采样X_ADC电压 采样X_ADC电压,得到x坐标,等效电路如图14.6所示。 S1、S3闭合,S2、S4、S5断开,即XP 接上电源、XM接地、YP作
[单片机]
<font color='red'>S3C2440</font><font color='red'>裸机</font>------<font color='red'>触摸屏</font>_<font color='red'>电阻</font><font color='red'>触摸屏</font>硬件原理
S3C2440裸机------触摸屏_使用定时器支持长按
我们前面写的代码中,长按或者滑动时不能读取坐标,接下来我们使用定时器对代码进行改进,可以在长按或者滑动时把坐标值读出来。 #include ../s3c2440_soc.h #define ADC_INT_BIT (10) #define TC_INT_BIT (9) #define INT_ADC_TC (31) /* ADCTSC's bits */ #define WAIT_PEN_DOWN (0 8) #define WAIT_PEN_UP (1 8) #define YM_ENABLE (1 7) #define YM_DISABLE (0 7) #define YP
[单片机]
S3C2440之IIC裸机驱动
花了两天的时间终于把这个搞定了,其实I2C的原理还是比较简单的,只是几个细节性的东西还是需要特别的注意,主要是需要注意一下几点: 1.rIICCON &= ~0x10; 清中断必须要在rIICDS = slvAddr; 和rIICSTAT = 0xf0; // 主设备,启动 之后 2.延时对于写外部的低速设备来说非常重要,比如while(flag)之后一定要加延时,还有在写数据时发现只能写入基数地址的数据,这也是由于延时导致的 3.开始调试的时候系统总是死在read的函数中,后来发现在数据手册的note中说当读取最后一个数据的时候一定不能返回ACK信号,而我却在程序中使用while(flag)来等待ACK引发中断,这不死才怪呢。。
[单片机]
s3c2440裸机-UART编程1-UART硬件介绍及传输原理
1.uart硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter(异步收发器)。 uart主要用于: 1.打印调试 2.数据传输 串口通过三根线即可,发送、接收、地线。 pc的TxD - arm的RxD (UART write) arm的TxD - pc的RxD (UART read) 2.uart的参数和格式 波特率:表示每秒传输多少bit,bits per second(bps).一般波特率都会有9600,19200,115200等选项。 格式: 起始位: 先发出一个逻辑”0”的信号,表示传输数据的开始。 数据位:可以是5~8位逻辑”0”或”1”。
[单片机]
s3c2440裸机-NorFlash1-原理
1.flash种类与特性: flash一般分为nand flash和nor flash,各自特性如下表: - Nor NAND XIP(片上执行) yes no 性能(擦除) 非常慢(5s,块太大) 快(3ms) 性能(写) 慢 快 性能(读) 快 快 可靠性 高 一般(容易出现位反转) 可擦除次数 10000 ~ 100000 100000 ~ 1000000 接口 与ram类似,可直接访问任意地址 I/O接口(无地址线,必须串行访问,命令、地址、数据共用8位IO) 易用性 容易 复杂 主要用途 常用于保存代码和关键数据 用于保存数据 价格 高 低 容量 小 大 常用文件系统类型 jffs yaffs
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved