OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10166|回复: 7

请教触摸屏外部中断

[复制链接]

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
发表于 2012-7-17 00:14:19 | 显示全部楼层 |阅读模式
这是触摸屏进行屏幕校准的,我设定三个点进行校准,屏幕每按一下,adjust_flag+1,记录相应的点的坐标
//产生中断
u16 adjust_flag=0;
void EXTI1_IRQHandler()
{    
    touch_sc=1;//触摸屏被按下
        if(key_flag==1)
    {
        adjust_flag=adjust_flag+1;//设定断点
        if(adjust_flag==4)
        adjust_flag=0;
        EXTI->R=1<<1;  //清除LINE1上的中断标志位
    }
    EXTI->R=1<<1;  //清除LINE1上的中断标志位                                                                                                         
}

下面这段是 adjust_flag+1后所要执行的程序
void lcd_adjust()
{      
    u16 buf_temp[4][2];
    Draw_Circle(10,10,6,BLACK);    
    LCD_DrawbigPoint(10,10,BLACK);
    LCD_ShowString(18,10,"Touch First",BLACK);

    Draw_Circle(230,10,6,BLACK);
    LCD_DrawbigPoint(230,10,BLACK);
    LCD_ShowString(130,10,"Touch Second",BLACK);

    Draw_Circle(10,310,6,BLACK);
    LCD_DrawbigPoint(10,310,BLACK);
    LCD_ShowString(18,300,"Touch Third",BLACK);    
    if((touch_sc==1)&&(adjust_flag==1))//touch first
    {    pen_int(0);
        read_xy_twice();
        buf_temp[0][0]=read_x;
        buf_temp[0][1]=read_y;
        pen_int(1);    
    }
    if((touch_sc==1)&&(adjust_flag==2))//touch second
    {    pen_int(0);
        read_xy_twice();
        buf_temp[1][0]=read_x;
        buf_temp[1][1]=read_y;
        pen_int(1);    
    }
    if((touch_sc==1)&&(adjust_flag==3))//touch third
    {
        pen_int(0);
        read_xy_twice();
        buf_temp[2][0]=read_x;
        buf_temp[2][1]=read_y;
        x_shi=(float)(230-10)/(buf_temp[1][0]-buf_temp[0][0]);//得到x_shi
        x_ge=((230+10)-x_shi*(buf_temp[1][0]+buf_temp[0][0]))/2;//得到x_shi
        y_shi=(float)(310-10)/(buf_temp[2][1]-buf_temp[0][1]);//得到y_shi
        y_ge=((310+10)-y_shi*(buf_temp[2][1]+buf_temp[0][1]))/2;//得到x_shi
        key_flag=0;
        LCD_clear(YELLOW);
        pen_int(1);    
    }        
}  
问题是我无法保证每次按下adjust_flag都会加1,我只有在程序所示红色部分加断点,然后每次执行会加1,这是为什么?有做过的同学多提意见              
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-17 01:19:48 | 显示全部楼层
     if(key_flag==1)
    {
        adjust_flag=adjust_flag+1;//设定断点
        if(adjust_flag==4)
        adjust_flag=0;
        EXTI->R=1<<1;  //清除LINE1上的中断标志位
    }
    EXTI->R=1<<1;  //清除LINE1上的中断标志位                                                                                                          
}

你这代码就有问题.
哪个flag==4,永远不会成立.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-7-17 09:44:36 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我觉得是可以成立的,因为我每触摸一次屏幕,就会进入一次中断,所以adjust_flag就会加1,因为是通过三个点来调整,所以设定if(adjust_flag==4) adjust_flag=0;是不是这样? 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-17 10:37:39 | 显示全部楼层
回复【3楼】zhengchao20105:
---------------------------------
你自己好好再缕一缕.
我可以负责任的告诉你,你那个==4不会成立,永远不成立!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-7-17 11:10:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
确实不会成立的,因为执行到adjust_flag==3时就会进入if((touch_sc==1)&&(adjust_flag==3))//touch third
然后把 key_flag=0;不会执行到adjust_flag=4。
但是这句即使没有执行到,也不应该出现无法保证每次按下adjust_flag都会加1,我只有在程序所示红色部分加断点,然后每次执行会加1这样的问题。是不是这个样子?

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-7-17 12:44:39 | 显示全部楼层
这问题,你拿JTAG仿真跟踪吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2012-6-21
在线时间
12 小时
发表于 2012-7-17 15:16:09 | 显示全部楼层
会不是防抖动未作好,连续加了几次1到清0了。
回复 支持 反对

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-6-13
在线时间
0 小时
 楼主| 发表于 2012-7-18 13:09:20 | 显示全部楼层
问题基本解决
主要是读坐标值时候,里面的ad转换每次我都给了delay_us(100)的延时,所以如果用jtag仿真,中断后要给出一段时间进行ad转换,然后再点击屏幕,进行下一次校准,如果delay_us(100)改成delay_us(1)就ok了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表