历史上的今天
今天是:2024年09月30日(星期一)
2021年09月30日 | S3C2440裸机------触摸屏_定时候程序优化
2021-09-30 来源:eefocus
我们前面的触摸屏代码中,当我们短按一次会有一个数据输出,但是当我们长按或者滑动时并没有数据输出,我们用定时器使触摸屏支持长按,在按下时我们启动定时器,定时器间隔一段时间中断一次,然后在中断函数里面再去测量触点的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;
}
史海拾趣
|
由于Microchip推出的PIC系列8位单片机是朝着超小型、低功耗、低成本方向发展的,这些产品无功能堆积而以多品种方式来满足各种应用层次的要求,所以PIC 8位单片机的型号特别多,正因为如此,给初学者带来学习上的不便,易使初学者在阅读单片机 ...… 查看全部问答> |
|
高速公路视频监控系统一般分为收费监控和道路监控两部分。收费监控系统主要是对收费站的车道、收费广场、收费亭的收费情况,对收费车道通过的车辆类型、收费员的操作过程以及收费过程中的突发事件和特殊事件进行观察和记录,实施有效的监督。道路监 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 一、 面板压缩法 利用电器面板、操作台或机外露出的各个开关、旋钮的作用做检查,大概判断故障发生的部位。比如:电视伴音时有时无,调音量旋钮,出现“喀拉”声同时伴音时有时无,由此 ...… 查看全部问答> |
|
wince5 响应右键时事 cannot execute program 添加相应的头文件和库 但执行时 if(::SHRecognizeGesture(&shrg) == GN_CONTEXTMENU)//长按键消息 { } 在这条语句出现了& ...… 查看全部问答> |
|
现在采用的三星的 K9FXX 1G byte 的nand, XIPKERNAL.NB0 < 2M NK.NB0 = 20MB, 启动的时间居然要 10s 左右,load XIPKERNAL.NB0 到 RAM 中, 从跳到OS 入口到 Explorer 出来需要6~7s, 先在想问一下,multi b ...… 查看全部问答> |
|
产品:PDA设备,CPU:PXA270 起因:电源管理中,PDA有两种供电模式:1,电池; 2.外部电源或USB供电 当当前PDA是电池供电时,在CE系统的桌面的下方(任务栏上)无图标,在控制面板的电源管理中显示是电池 ...… 查看全部问答> |
|
我先要做的是一个定点实数的倒数运算,我用16bit的数表示范围为1.0~15.0的实数,用4bit表示整数,11bit表示小数我的思路是先把1.0~15.0做倒数, 然后扩大2048倍(右移11位), 但是如果我要精确运算的话,要从 ...… 查看全部问答> |
|
提到ARM大家都能如数家珍的列出几个公司来:NXP, Samsung等。提到TI的ARM,很多人会惊讶地说TI还在做ARM呀?!是的TI在做ARM,而且TI做ARM已经不是新鲜事了,TI最早获得ARM的授权已经是1993年的事了“1993 * 为 Cirrus Logic 和 ...… 查看全部问答> |




