小弟编程水平和C语言都比较菜,如果犯了什么低级错误还望高手们直接指出。事情是这样的,小弟最近在学编程,这两天在STM32开发板上对XPT2046这个型号的电阻屏触摸检测芯片写驱动代码。读取触摸芯片的电压值的函数已经实现了,现在开始构思电阻屏的校准函数。初步的想法是在屏幕上面依次画4个点,点击一个点之后采集坐标的电压值然后清除这个点再画下一个,采集4个点的电压值之后开始计算电阻屏的参数。上面画4个点的过程我用了一个for循环和switch语句来组合实现。可是在这段代码里面就出现了匪夷所思的现象:点击完第一个点之后直接跳到了第三个点,然后是第四个点,第二个点直接被忽略了,然而从代码上看这四段代码除了参数以外都没有任何区别。 已经确定了是最后一个case导致出了问题,我新增了一个k变量,将i换成k,出来的结果就正常了,下面是能正常使用的代码和对应的结果:。以下是会出错的源码:
- u16 Xpos[3],Ypos[3];
- void TP_Calibration(void)
- {
- u8 flag,j;
- u16 i,k = 0;
-
- printf("void TP_Calibration(void) V2.1 \r\n");
-
-
- for(j = 0;j < 5;j++)
- {
-
- switch(j)
- {
- case 0: /* 画第一个点 */
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(20,20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos,Ypos);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第1个点的电压\r\n");
-
- }
- }
- TP_DrawPoint(20,20,WHITE);
- }
- break;
-
- case 1: /* 画第二个点 */
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(20,lcddev.height - 20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 1,Ypos + 1);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第2个点的电压\r\n");
- }
- }
- TP_DrawPoint(20,lcddev.height - 20,WHITE);
- }
- break;
-
- case 2:
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(lcddev.width - 20,lcddev.height - 20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 2,Ypos + 2);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第3个点的电压\r\n");
- }
- }
- TP_DrawPoint(lcddev.width - 20,lcddev.height - 20,WHITE);
- }
- break;
-
- case 3:
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(lcddev.width - 20,20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 3,Ypos + 3);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第4个点的电压\r\n");
- }
- }
- TP_DrawPoint(lcddev.width - 20,20,WHITE);
- }
- break;
-
- default:
- break;
- }
-
- }
-
- }
有错的实验现象:
已经确定了是最后一个case导致出了问题,我新增了一个k变量,将i换成k,出来的结果就正常了,下面是能正常使用的代码和对应的结果:
- u16 Xpos[3],Ypos[3];
- void TP_Calibration(void)
- {
- u8 flag,j;
- u16 i,k = 0;
-
- printf("void TP_Calibration(void) V2.1 \r\n");
-
-
- for(j = 0;j < 5;j++)
- {
-
- switch(j)
- {
- case 0: /* 画第一个点 */
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(20,20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos,Ypos);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第1个点的电压\r\n");
-
- }
- }
- TP_DrawPoint(20,20,WHITE);
- }
- break;
-
- case 1: /* 画第二个点 */
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(20,lcddev.height - 20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 1,Ypos + 1);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第2个点的电压\r\n");
- }
- }
- TP_DrawPoint(20,lcddev.height - 20,WHITE);
- }
- break;
-
- case 2:
- {
- i = 500;
- flag = 0;
- TP_DrawPoint(lcddev.width - 20,lcddev.height - 20,RED);
- while(i--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 2,Ypos + 2);
- if(flag == 1)
- {
- i = 0;
- printf("读取到第3个点的电压\r\n");
- }
- }
- TP_DrawPoint(lcddev.width - 20,lcddev.height - 20,WHITE);
- }
- break;
-
- [color=Red] case 3:
- {
- [b] k = 500;[/b]
- flag = 0;
- TP_DrawPoint(lcddev.width - 20,20,RED);
- while(k--)
- {
- delay_ms(10);
- flag = TP_Scan_Voltage(Xpos + 3,Ypos + 3);
- if(flag == 1)
- {
- k = 0;
- printf("读取到第4个点的电压\r\n");
- }
- }
- TP_DrawPoint(lcddev.width - 20,20,WHITE);
- }
- break;[/color]
-
- default:
- break;
- }
-
- }
-
- }
是不是我的第一段代码有逻辑问题呢?还是这原来就是STM32的BUG ?实在想不通,所以发上来和大家请教一下了
另外附件中也上传了整个工程的代码,供参考
本帖最后由 lingking 于 2019-1-12 16:55 编辑