我们前面的触摸屏代码中,当我们短按一次会有一个数据输出,但是当我们长按或者滑动时并没有数据输出,我们用定时器使触摸屏支持长按,在按下时我们启动定时器,定时器间隔一段时间中断一次,然后在中断函数里面再去测量触点的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读取触摸屏坐标
推荐阅读
史海拾趣
Diodes Incorporated公司成立于1970年,其初衷是致力于半导体技术的研发和生产。在创立初期,公司面临着来自行业巨头的激烈竞争,但凭借对技术的深入理解和市场需求的敏锐洞察,Diodes Incorporated逐渐在市场中找到了自己的定位。公司专注于生产高品质、特定应用的半导体产品,逐渐在消费电子、计算机、通信等领域建立了良好的声誉。
质量是企业的生命线。维峰电子始终将质量管理作为公司发展的重中之重。公司建立了完善的质量管理体系,从原材料采购、生产过程到产品检验等各个环节都进行严格把控。同时,公司还引入了先进的检测设备和技术,确保产品的质量和性能达到最高标准。这些措施的实施不仅提升了产品的竞争力,也赢得了客户的信任和好评。
面对电子行业的快速变化和市场竞争的加剧,Big-Sun Electronics Co Ltd公司积极实施多元化战略。公司不仅继续深耕电子芯片领域,还逐步拓展至智能家居、物联网等新兴领域。通过产业转型和升级,Big-Sun成功实现了业务的多元化发展,为公司的可持续发展奠定了坚实基础。
本帖最后由 ddllxxrr 于 2016-1-7 17:18 编辑 就那种到货付款的 本站强荐:185娱乐╮城.足球╮真_人.彩票齐全╮手机可投╮注任何游戏. 首次开户送10元.首存送58元.信誉绝对保证185.cc … 查看全部问答∨ |
|
新买了款终端机,和以前用的很不一样。在样机上做的程序也不能跑。有很多问题请教: 1。不能实现和activesync同步,插上数据线,就像U盘一样,只显示ce里面的flash disk。 2。不能安装netcf,不能识别。查看系统是wince5.0的,处理器类型是Inge ...… 查看全部问答∨ |
CE5.0下更换数据采集卡,驱动问题,输入输出读写不了,求助 工控ce5.0+pcm卡,后来由于老板要更换数据采集卡,用了art2536 之前数据采集卡驱动是MmMapIoSpace+MmUnmapIoSpace使用内存空间 然后READ_PORT_UCHAR+WRITE_PORT_UCHAR使用被映射的内存地址写入物理地址 然后再位操作读取板卡信号 但是新卡art253 ...… 查看全部问答∨ |
HBRUSH hbr = GetSysColorBrush(RGB(50,160,210)); hdcMem = CreateCompatibleDC(hdc); hbmMem = CreateBitmap(rcTemp.right - rcTemp.left, rcTemp.bottom - rcTemp.top, 1, ...… 查看全部问答∨ |
1. Senior Mechanical Engineer - SH Description In this position, you will be responsible for the mechanical research and innovative design for notebook and portable PC systems CO-work with PM and/or ID and/or thermal ...… 查看全部问答∨ |
msp340单片机接160*80的液晶,该怎么写程序。请高手指点!急! 液晶为ST7528驱动器,用8080时序,数据口DB0~DB7接MSP430F149的P5口,改怎么写程序啊?… 查看全部问答∨ |
德国conextop推出世界上最小的串口服务器模块Neport NePort系列的串口服务器模块是德国CONEXTOP公司(www.conextop.com)于2002年初发布的一款高度集成,高性能的的嵌入式设备联网服务器的RJ45产品,它以小巧的体积为客户的产品提供一套简洁、高性能且低成本的网络连接方式,利用它,任何带有标准串口 ...… 查看全部问答∨ |