我们前面的触摸屏代码中,当我们短按一次会有一个数据输出,但是当我们长按或者滑动时并没有数据输出,我们用定时器使触摸屏支持长按,在按下时我们启动定时器,定时器间隔一段时间中断一次,然后在中断函数里面再去测量触点的XY坐标。
我们前面的定时器代码是直接在定时器中断函数里面点灯,我们应该用一个数组去做处理,当定时器中断发生时分别进入不同的函数做不同的处理。
1. timer.c
#include "s3c2440_soc.h"
#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();
}
}
}
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);
}
2. led.c
#include "s3c2440_soc.h"
void delay(volatile int d)
{
while (d--);
}
/* 每10ms该函数被调用一次
* 每500ms操作一下LED实现计数
*/
void led_timer_irq(void)
{
/* 点灯计数 */
static int timer_num = 0;
static int cnt = 0;
int tmp;
timer_num++;
if (timer_num < 50)
return;
timer_num = 0;
cnt++;
tmp = ~cnt;
tmp &= 7;
GPFDAT &= ~(7<<4);
GPFDAT |= (tmp<<4);
}
int led_init(void)
{
/* 设置GPFCON让GPF4/5/6配置为输出引脚 */
GPFCON &= ~((3<<8) | (3<<10) | (3<<12));
GPFCON |= ((1<<8) | (1<<10) | (1<<12));
register_timer("led", led_timer_irq);
}
int led_test(void)
{
int val = 0; /* val: 0b000, 0b111 */
int tmp;
/* 设置GPFCON让GPF4/5/6配置为输出引脚 */
GPFCON &= ~((3<<8) | (3<<10) | (3<<12));
GPFCON |= ((1<<8) | (1<<10) | (1<<12));
/* 循环点亮 */
while (1)
{
tmp = ~val;
tmp &= 7;
GPFDAT &= ~(7<<4);
GPFDAT |= (tmp<<4);
delay(100000);
val++;
if (val == 8)
val =0;
}
return 0;
}
上一篇:S3C2440裸机------触摸屏_使用定时器支持长按
下一篇:S3C2440裸机------触摸屏_利用ADC读取触摸屏坐标
推荐阅读最新更新时间:2024-11-07 17:12
设计资源 培训 开发板 精华推荐
- NCP5007EVB:NCP5007 紧凑型白光 LED 驱动器评估板
- LTC1706-19,具有可编程输出的高效率 SO-8、N 沟道开关稳压器
- ADP165UJ-EVALZ,ADP165 WLCSP LDO 线性稳压器评估板
- #第七届立创电赛#电流电压表
- LT1376IN8-5 1.5A、500kHz 降压型开关稳压器的典型应用电路
- NCV890104MWGEVB:汽车开关稳压器扩频评估板
- 使用 ROHM Semiconductor 的 BD48L60G-TL 的参考设计
- LTC2264-12 的典型应用 - 12 位、40Msps 低功耗双通道 ADC
- NCV2001SQ2T2G 0.9V单电源运放正电容乘法器典型应用电路
- 使用 Analog Devices 的 LTC1558CS-3.3 的参考设计