OpenEdv-开源电子网

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

程序跑得顺序不对 switch 。。。。case -- goto

[复制链接]

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
发表于 2013-9-20 12:30:22 | 显示全部楼层 |阅读模式

就这个代码 keil 调试  会有乱跳的现象 第一次检测到笔中断状态为低 会直接跳到 cnt = 0;这个很不理解  按道理 cnt++ 了 不可能到 cnt =0 这个条件里面的  调试到最后会一直  卡在case: cnt =1; 这个条件里面  很不理解


  while(1)
 {    
       if(PEN_State()==RESET)     //笔中断引脚状态
       {
       if(Touch_GetPhyXY())    //获取物理坐标成功
       {
       touchXY[cnt][0]=ADC_X;             //存储
       touchXY[cnt][1]=ADC_Y;             //

       while(PEN_State()== RESET);           //等待触笔松开 
       delay_ms(50);                     //消抖
       cnt++;                             //跳转到下个
       }
label:  switch(cnt)
         {
              case 0:
                   TP_Drow_Touch_Point(120,160,WHITE);        //清除第5个准星位置  TP_Drow_Touch_Point
                   TP_Drow_Touch_Point(20,20,RED);          //绘制第一个准星
              break;
              case 1:
                    LCD_ShowNum(0,30,touchXY[cnt-1][0],4, 16);      //输出X坐标  LCD_ShowNum
                    LCD_ShowNum(70,30,touchXY[cnt-1][1],4, 16);
                   TP_Drow_Touch_Point(20,20,WHITE);             //清除第1个准星位置
                   TP_Drow_Touch_Point(20,300,BLUE);          //绘制第二zhou个准星

              break;
              case 2:
                    LCD_ShowNum(0,300,touchXY[cnt-1][0],4, 16);      //输出X坐标
                    LCD_ShowNum(70,300,touchXY[cnt-1][1],4, 16);
                    TP_Drow_Touch_Point(20,300,WHITE);       //清除第2个准星位置
                    TP_Drow_Touch_Point(220,300,GREEN);        //绘制第三个准星 

             break;
             case 3:
                    LCD_ShowNum(120,300,touchXY[cnt-1][0],4, 16);      //输出X坐标
                    LCD_ShowNum(170,300,touchXY[cnt-1][1],4, 16);
                   TP_Drow_Touch_Point(220,300,WHITE);         //清除第3个准星位置
                   TP_Drow_Touch_Point(220,20,BLACK);          //绘制第四个准星

             break;
             case 4:
                    LCD_ShowNum(120,30,touchXY[cnt-1][0],4, 16);      //输出X坐标
                    LCD_ShowNum(160,30,touchXY[cnt-1][1],4, 16);
                    TP_Drow_Touch_Point(220,300,WHITE);          //清除第4个准星位置
                    TP_Drow_Touch_Point(120,160,BLUE);        //绘制第五个准星

             break;
             case 5:
                    LCD_ShowNum(90,180,touchXY[cnt-1][0],4, 16);      //输出X坐标
                    LCD_ShowNum(150,180,touchXY[cnt-1][1],4, 16); 
//      temp1=abs(touchXY[3][0]-touchXY[0][0]);     //获取上方两点的X的ADC值的差
//      temp2=abs(touchXY[2][0]-touchXY[1][0]);       //获得下方两点的X的ADC值的差
                   temp1=touchXY[3][0]-touchXY[0][0];     //获取上方两点的X的ADC值的差
                   temp2=touchXY[2][0]-touchXY[1][0];       //获得下方两点的X的ADC值的差
                  if(abs(temp1-temp2)>ADJUST_DE)     //对比偏差是否大于阀值,若大于则不符合
                   {
                          cnt=0;                      //归零
                         goto label;                 //跳转重新开始
                   }
                 temp3 = temp1 + temp2;      //将上下X的ADC的值的差值相加
                 xfac=200.0/(temp3>>1);//右移n位除以2的n次方      //获取x的比值
                 temp3=temp3>>2;                    //将上下X的ADC的值的差值相加除以4和中心点的X的ADC值对比    
                 if(abs(touchXY[4][0]-touchXY[0][0]-temp3)>ADJUST_DE) //对比偏差是否大于阀值,若大于则不符合
                {
                      cnt=0;                  //归零
                      goto label;         //跳转重新开始
                }
 //    temp1=abs(touchXY[1][1]-touchXY[0][1]);     //获取左边两点的Y的ADC值的差
 //    temp2=abs(touchXY[2][1]-touchXY[3][1]);     //获取右边两点的Y的ADC值的差
                  temp1=touchXY[1][1]-touchXY[0][1];     //获取左边两点的X的ADC值的差
                  temp2=touchXY[2][1]-touchXY[3][1];       //获得右边两点的X的ADC值的差
                  if(abs(temp1-temp2)>ADJUST_DE)     //对比偏差是否大于阀值,若大于则不符合
                  {
                        cnt=0;                    //归零
                       goto label;               //跳转重新开始
                  }
                  temp3=temp1+temp2;      //将左右Y的ADC差相加
                  yfac = 280.0/(temp3>>1);//获取y的比值
                 temp3=temp3>>2;         //将左右Y的ADC差的和除以4和中心点的Y的ADC值对比
                 if(abs(touchXY[4][1]-touchXY[0][1]-temp3)>ADJUST_DE)   //对比偏差是否大于阀值,若大于则不符合
                 {
                       cnt=0;            //归零
                       goto label;       //跳转重新开始
                 }
                 xoff=(240-xfac*(touchXY[0][0]+touchXY[3][0]))/2;  //获取到X的修正值
                 yoff=(320-yfac*(touchXY[0][1]+touchXY[1][1]))/2;  //获取到Y的修正值
                 LCD_ShowString(40,180," Finish");//校验完成
                 delay_ms(500);             //延时
                  return ;        //返回
            }
      }
 }

闷鱼闷闷不乐吃焖鱼
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-20 15:38:47 | 显示全部楼层
纯软件问题,仿真很好解决。
拿JTAG,跟踪代码,即可解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-20 16:52:57 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------现在不会跳了  不过 一开始 当刚进入这个函数时 它进入到 while(1)之后      它会直接忽略过 【 if(PEN_State()==RESET)     //笔中断引脚状态 】 以及之下的语句 直接跑到 case:1 的 位置 然后 什么都不干 ------(因为 cnt ++ 没执行  并且 【 while(PEN_State()== RESET);  //等待触笔松开 】这个语句也没执行

就跑回  【 if(PEN_State()==RESET)     //笔中断引脚状态】
    我不触屏 他就一直停在这里等着 这个算正常了吧   
        至于第一次往下执行  我想可能是编译器的原因么  需要如何来解释呢
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-20 18:01:08 | 显示全部楼层
回复【3楼】闷鱼:
---------------------------------
你是用了中断吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-20 19:06:46 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
中断开了 但是没有用到它 程序里面我是直接读取PEN--IO口状态的 这个影响到了么
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-20 21:05:32 | 显示全部楼层
回复【5楼】闷鱼:
---------------------------------
没用到的话,关系不大
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-20 21:06:11 | 显示全部楼层
不过我们mini板的例程,在判断PEN的时候,如果用死循环,比较诡异,会出现命名PEN已经是1了,但是还是跳不出循环,但是加一点点延时在循环里面,就可以了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-21 02:11:33 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
while    以前老师说 不要到程序里面 习惯的 用while           会出现一些意想不到的情况  唉   貌似这个就是差不多

不过 战舰的 那个 触摸屏的 例程 看了它 好象是用到一个外部的板载按键来触发校准程序 我把它移植到另一块之前做的小板子上 发现 每次读出来的数据都是 不变的 单步调试 之后发现 程序跑得 也有点诡异 

我想把那个例程的思想融进的的代码中 改来改去 就是不太对  
在 【 spi 通信+ 校准原理】都毋庸置疑的情况下 我肯定是在这个例程中有哪些地方没有领悟到…………

我是直接在main函数里面 调用 TP_Adjust() 的; lcddev 结构体 也被我添加进去到lcd的初始化中,那个 TP_Scan();函数 搞得我有点晕晕的  我直接进行触摸校准进程  ,应该调用 TP_Scan(1);的 那么它 首先就会去读取 AD转换值 也就是 注释里面的 物理坐标 ; 之后 对于 lcddev.sta 的各种判断 应该不用做相应的修改了吧  那个TP_CATH_DOWN 不再需要加在函数里面的了吧 不过我还没去掉 因为 sta 的状态值 没错……

各种疑问 原子哥 尽量多说点吧
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-21 02:18:16 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------我之前不是弄了一个很乱的函数嘛  就是 判断是否触摸 消抖 获取AD值 换算 之类的全部在一个函数里面 甚至还有 goto ,有 while………………,调了一天 发现它也能正常的跑了  读出来的数据 也是不太对的 总有那么一两个点的坐标很怪异  假如 是在获取AD值的时候出了问题  那么我也考虑了下 我用的 tsc2046嘛 时序 以及 指令都对  SPI初始化的话 这个会有很大关系么 我比对了下 初始化 没有不同的 。用的是5点校准  和例程一样   他们共同的问题就是 不能及时的响应触摸  这个我又糊涂了  

看了战舰的例程 到战舰上没有一点问题 我自己的小板子 就会有各种问题…… 它 是如何消抖的呢
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-21 21:32:32 | 显示全部楼层
回复【9楼】闷鱼:
---------------------------------

你可以写代码测试下。
这种飞点问题,可能是代码不太好,但是更多的原因,可能是你的硬件本就不稳定。
有的触摸屏好的,你按下基本就没什么飞点,但是触摸屏不好的,可能你一按下,会有一堆的飞点出现。
所以可以先写个代码,看看触摸屏是不是存在问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-22 06:59:40 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
有可能
正是 由于 飞点 多 就导致了 我按下去的 点 和 读到的点 不是 同一个 物理值  

至于 所说的测试 触摸屏 有没有问题 -------------  我还没理解透 

现在 我的屏 显示 各种 字符 以及图片 是没问题的  然后 每次 触摸 都可以 有 EN 的中断  
刚才检测了下  貌似 CS 和 CLK 在 按下去的 时候 都没有反应  一直为高 -----  tsc2046 的两个引脚
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-22 08:21:27 | 显示全部楼层



2046 的clk 引脚信号


放大后的效果
    
 
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-22 08:28:08 | 显示全部楼层
 

上为 CLK 引脚的信号
下为 CS引脚的信号


      上 为 CLK  下 为 CS  毛刺 很多
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-25 12:17:47 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
static void SetSysClockTo72(void)     ---- - 最新 MiNi 例程 初始化的时候 就死在这个里面 while
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-25 22:19:37 | 显示全部楼层
回复【14楼】闷鱼:
---------------------------------
哪个例程?你这是库函数版本的例程吧?试试寄存器版本的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-26 19:10:25 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------对  我用的 库函数版本的   


现在没有死在 while 里面了  但是 液晶 执行完 驱动代码之后 依然 是 白屏    9341 的
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 22:27:30 | 显示全部楼层
看来你调的不行了啊。。。呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-27 12:11:47 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------快挂了




那些一条一条的线 实际上触摸只有有一次 却瞬间打点了很多次

闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-27 14:35:41 | 显示全部楼层


如图所示 我触摸一下 就会有一条打点的线出来 周边飞点也很多 这个该如何处理

 
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-27 16:59:41 | 显示全部楼层
回复【18楼】闷鱼:
---------------------------------
我很早前就和你说了,可能是你的TP有问题,烂的TP,就是这种效果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-9-28 13:44:34 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
另外 逻辑坐标 X 的计算出来 超过240了 可以达到 330
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-28 21:36:03 | 显示全部楼层
回复【21楼】闷鱼:
---------------------------------
算法也有问题了?呵呵
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2013-9-29 21:11:54 | 显示全部楼层
回复【19楼】闷鱼:
---------------------------------
你用表笔不怕把屏幕戳坏么? 用一次性筷子削一只触笔就好了,蛮好用的,戳顿了又可以再削尖
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复 支持 反对

使用道具 举报

23

主题

292

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2013-9-17
在线时间
17 小时
 楼主| 发表于 2013-10-10 17:27:49 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
用的战舰的源程序
闷鱼闷闷不乐吃焖鱼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-10 22:50:24 | 显示全部楼层
回复【24楼】闷鱼:
---------------------------------
 重新校准下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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