MDK 中 if 比较不正确

[复制链接]
2758|7
 楼主| Volftooth 发表于 2012-5-30 16:40 | 显示全部楼层 |阅读模式
本帖最后由 Volftooth 于 2012-5-30 16:42 编辑

在 KEIL MDK 中写了这样一句代码、
if(LCD_ReadReg(0) == 0x5408)
{
....
}

但是不管是不是 5408H、都会执行 IF 里面的代码、这是怎么回事?、
看汇编代码里面并没有生成跳转的代码、
MOVS R0, #0x00
BL.W  LCD_ReadReg(0)
SUB    R1, R0, #0x5400

然后就没了啊.........
谁能解释一下子、、
ayb_ice 发表于 2012-5-30 16:52 | 显示全部楼层
SUB    R1, R0, #0x5400

看你的汇编代码都不对,是不是对应的汇编文件都是问题
 楼主| Volftooth 发表于 2012-5-30 16:58 | 显示全部楼层
2# ayb_ice
我把优化关掉了、可以正常判断 if、生成的汇编代码如下、
0x08006D44 2000      MOVS     r0,#0x00
0x08006D46 F7FDF95F  BL.W     LCD_ReadReg (0x08004008)
0x08006D4A F5A041A8  SUB      r1,r0,#0x5400
0x08006D4E 3908      SUBS     r1,r1,#0x08
0x08006D50 D17D      BNE      0x08006E4E


但就不知道我程序哪里让它认为可以优化了.........
ayb_ice 发表于 2012-5-30 17:31 | 显示全部楼层
我试了一下,优化级别3,没有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ayb_ice 发表于 2012-5-30 17:32 | 显示全部楼层
RT

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| Volftooth 发表于 2012-5-30 17:34 | 显示全部楼层
下面是整个函数的代码、我怎么都看不出来哪里可优化、
我用 O0 级就可以、用 O3 级就不行、

  1. void STM3210E_LCD_Init(void)
  2. {
  3. /* Configure the LCD Control pins --------------------------------------------*/
  4.   LCD_CtrlLinesConfig();

  5. /* Configure the FSMC Parallel interface -------------------------------------*/
  6.   LCD_FSMCConfig();

  7.   Delay(5); /* delay 50 ms */

  8.   /* Check if the LCD is SPFD5408B Controller */
  9.   if(LCD_ReadReg(0x00) == 0x5408)
  10.   {
  11.     /* Start Initial Sequence ------------------------------------------------*/
  12.     LCD_WriteReg(R1, 0x0100);  /* Set SS bit */
  13.     LCD_WriteReg(R2, 0x0700);  /* Set 1 line inversion */
  14.     LCD_WriteReg(R3, 0x1030);  /* Set GRAM write direction and BGR=1. */
  15.     LCD_WriteReg(R4, 0x0000);  /* Resize register */

  16.     LCD_WriteReg(R8, 0x0202);  /* Set the back porch and front porch */
  17.     LCD_WriteReg(R9, 0x0000);  /* Set non-display area refresh cycle ISC[3:0] */
  18.     LCD_WriteReg(R10, 0x0000); /* FMARK function */
  19.     LCD_WriteReg(R12, 0x0000); /* RGB 18-bit System interface setting */
  20.     LCD_WriteReg(R13, 0x0000); /* Frame marker Position */
  21.     LCD_WriteReg(R15, 0x0000); /* RGB interface polarity, no impact */

  22.     /* Power On sequence -----------------------------------------------------*/
  23.     LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  24.     LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
  25.     LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
  26.     LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */
  27.     Delay(20);                 /* Dis-charge capacitor power voltage (200ms) */

  28.     LCD_WriteReg(R17, 0x0007);        /* DC1[2:0], DC0[2:0], VC[2:0] */
  29.     Delay(5);                   /* Delay 50 ms */
  30.     LCD_WriteReg(R16, 0x12B0);        /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  31.     Delay(5);                        /* Delay 50 ms */
  32.     LCD_WriteReg(R18, 0x01BD);  /* External reference voltage= Vci */
  33.     Delay(5);
  34.     LCD_WriteReg(R19, 0x1400);  /* VDV[4:0] for VCOM amplitude */
  35.     LCD_WriteReg(R41, 0x000E);  /* VCM[4:0] for VCOMH */
  36.     Delay(5);                   /* Delay 50 ms */
  37.     LCD_WriteReg(R32, 0x0000); /* GRAM horizontal Address */
  38.     LCD_WriteReg(R33, 0x013F); /* GRAM Vertical Address */

  39.     /* Adjust the Gamma Curve (SPFD5408B)-------------------------------------*/
  40.     LCD_WriteReg(R48, 0x0b0d);
  41.     LCD_WriteReg(R49, 0x1923);
  42.     LCD_WriteReg(R50, 0x1c26);
  43.     LCD_WriteReg(R51, 0x261c);
  44.     LCD_WriteReg(R52, 0x2419);
  45.     LCD_WriteReg(R53, 0x0d0b);
  46.     LCD_WriteReg(R54, 0x1006);
  47.     LCD_WriteReg(R55, 0x0610);
  48.     LCD_WriteReg(R56, 0x0706);
  49.     LCD_WriteReg(R57, 0x0304);
  50.     LCD_WriteReg(R58, 0x0e05);
  51.     LCD_WriteReg(R59, 0x0e01);
  52.     LCD_WriteReg(R60, 0x010e);
  53.     LCD_WriteReg(R61, 0x050e);
  54.     LCD_WriteReg(R62, 0x0403);
  55.     LCD_WriteReg(R63, 0x0607);

  56.     /* Set GRAM area ---------------------------------------------------------*/
  57.     LCD_WriteReg(R80, 0x0000); /* Horizontal GRAM Start Address */
  58.     LCD_WriteReg(R81, 0x00EF); /* Horizontal GRAM End Address */
  59.     LCD_WriteReg(R82, 0x0000); /* Vertical GRAM Start Address */
  60.     LCD_WriteReg(R83, 0x013F); /* Vertical GRAM End Address */

  61.     LCD_WriteReg(R96,  0xA700); /* Gate Scan Line */
  62.     LCD_WriteReg(R97,  0x0001); /* NDL, VLE, REV */
  63.     LCD_WriteReg(R106, 0x0000); /* set scrolling line */

  64.     /* Partial Display Control -----------------------------------------------*/
  65.     LCD_WriteReg(R128, 0x0000);
  66.     LCD_WriteReg(R129, 0x0000);
  67.     LCD_WriteReg(R130, 0x0000);
  68.     LCD_WriteReg(R131, 0x0000);
  69.     LCD_WriteReg(R132, 0x0000);
  70.     LCD_WriteReg(R133, 0x0000);

  71.     /* Panel Control ---------------------------------------------------------*/
  72.     LCD_WriteReg(R144, 0x0010);
  73.     LCD_WriteReg(R146, 0x0000);
  74.     LCD_WriteReg(R147, 0x0003);
  75.     LCD_WriteReg(R149, 0x0110);
  76.     LCD_WriteReg(R151, 0x0000);
  77.     LCD_WriteReg(R152, 0x0000);

  78.     /* Set GRAM write direction and BGR=1
  79.        I/D=01 (Horizontal : increment, Vertical : decrement)
  80.        AM=1 (address is updated in vertical writing direction) */
  81.     LCD_WriteReg(R3, 0x1018);

  82.     LCD_WriteReg(R7, 0x0112); /* 262K color and display ON */

  83.     return;
  84.   }
  85.   
  86. /* Start Initial Sequence ----------------------------------------------------*/
  87.   LCD_WriteReg(R229,0x8000); /* Set the internal vcore voltage */
  88.   LCD_WriteReg(R0,  0x0001); /* Start internal OSC. */
  89.   LCD_WriteReg(R1,  0x0100); /* set SS and SM bit */
  90.   LCD_WriteReg(R2,  0x0700); /* set 1 line inversion */
  91.   LCD_WriteReg(R3,  0x1030); /* set GRAM write direction and BGR=1. */
  92.   LCD_WriteReg(R4,  0x0000); /* Resize register */
  93.   LCD_WriteReg(R8,  0x0202); /* set the back porch and front porch */
  94.   LCD_WriteReg(R9,  0x0000); /* set non-display area refresh cycle ISC[3:0] */
  95.   LCD_WriteReg(R10, 0x0000); /* FMARK function */
  96.   LCD_WriteReg(R12, 0x0000); /* RGB interface setting */
  97.   LCD_WriteReg(R13, 0x0000); /* Frame marker Position */
  98.   LCD_WriteReg(R15, 0x0000); /* RGB interface polarity */

  99. /* Power On sequence ---------------------------------------------------------*/
  100.   LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  101.   LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */
  102.   LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */
  103.   LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */
  104.   Delay(20);                 /* Dis-charge capacitor power voltage (200ms) */
  105.   LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */
  106.   LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */
  107.   Delay(5);                  /* Delay 50 ms */
  108.   LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */
  109.   Delay(5);                  /* Delay 50 ms */
  110.   LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */
  111.   LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */
  112.   Delay(5);                  /* Delay 50 ms */
  113.   LCD_WriteReg(R32, 0x0000); /* GRAM horizontal Address */
  114.   LCD_WriteReg(R33, 0x0000); /* GRAM Vertical Address */

  115. /* Adjust the Gamma Curve ----------------------------------------------------*/
  116.   LCD_WriteReg(R48, 0x0006);
  117.   LCD_WriteReg(R49, 0x0101);
  118.   LCD_WriteReg(R50, 0x0003);
  119.   LCD_WriteReg(R53, 0x0106);
  120.   LCD_WriteReg(R54, 0x0b02);
  121.   LCD_WriteReg(R55, 0x0302);
  122.   LCD_WriteReg(R56, 0x0707);
  123.   LCD_WriteReg(R57, 0x0007);
  124.   LCD_WriteReg(R60, 0x0600);
  125.   LCD_WriteReg(R61, 0x020b);
  126.   
  127. /* Set GRAM area -------------------------------------------------------------*/
  128.   LCD_WriteReg(R80, 0x0000); /* Horizontal GRAM Start Address */
  129.   LCD_WriteReg(R81, 0x00EF); /* Horizontal GRAM End Address */
  130.   LCD_WriteReg(R82, 0x0000); /* Vertical GRAM Start Address */
  131.   LCD_WriteReg(R83, 0x013F); /* Vertical GRAM End Address */

  132.   LCD_WriteReg(R96,  0x2700); /* Gate Scan Line */
  133.   LCD_WriteReg(R97,  0x0001); /* NDL,VLE, REV */
  134.   LCD_WriteReg(R106, 0x0000); /* set scrolling line */

  135. /* Partial Display Control ---------------------------------------------------*/
  136.   LCD_WriteReg(R128, 0x0000);
  137.   LCD_WriteReg(R129, 0x0000);
  138.   LCD_WriteReg(R130, 0x0000);
  139.   LCD_WriteReg(R131, 0x0000);
  140.   LCD_WriteReg(R132, 0x0000);
  141.   LCD_WriteReg(R133, 0x0000);

  142. /* Panel Control -------------------------------------------------------------*/
  143.   LCD_WriteReg(R144, 0x0010);
  144.   LCD_WriteReg(R146, 0x0000);
  145.   LCD_WriteReg(R147, 0x0003);
  146.   LCD_WriteReg(R149, 0x0110);
  147.   LCD_WriteReg(R151, 0x0000);
  148.   LCD_WriteReg(R152, 0x0000);

  149.   /* Set GRAM write direction and BGR = 1 */
  150.   /* I/D=01 (Horizontal : increment, Vertical : decrement) */
  151.   /* AM=1 (address is updated in vertical writing direction) */
  152.   LCD_WriteReg(R3, 0x1018);

  153.   LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */  
  154. }
平常人 发表于 2012-5-31 00:30 | 显示全部楼层
看不到定义,怀疑是LCD_ReadReg函数类型的问题,与比较对象不匹配。
ayb_ice 发表于 2012-5-31 09:42 | 显示全部楼层

LCD_ReadReg
函数源代码帖出来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好想睡觉好想睡觉!! 困困困困困

14

主题

61

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部