ercircle 发表于 2025-6-11 14:34:45

一个LCM外设读取问题|时序问题,已解决

使用Ai8051U实验箱+37.1 37.2例程测试

仅修改main函数和读取颜色测试函数对比:
1.IO读取是准确的

2.LCM读取有差异


为方便验证读取结果,代码修改内容:




C_wolf 发表于 2025-6-13 12:01:33

用这个试试看

u16 LCD_RD_DATA(void)
{
      u16 dat;

      LCM_CS = 0;
      LCMIFCR = 0x87;                //Enable interface, Read data
      while(!LCMIFSTA);
      LCMIFSTA = 0x00;
      LCM_CS = 1;
      dat = LCMIFDATL;

      return dat;
}

u16 LCD_RD_DATA_16Bit(void)
{
      u16 r,g,b;

      r = LCD_RD_DATA(); //dummy data
      r = LCD_RD_DATA();
      g = LCD_RD_DATA();
      b = LCD_RD_DATA();

      return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3);
}

u16 LCD_ReadPoint(u16 x,u16 y)
{
      u16 color;
   
      LCD_WR_REG(0x2A);
      LCD_WR_DATA_16Bit(x);
      LCD_WR_DATA_16Bit(x);
      LCD_WR_REG(0x2B);
      LCD_WR_DATA_16Bit(y);
      LCD_WR_DATA_16Bit(y);   
      LCD_WR_REG(0x2E);
      
      P2M0=0x00;
      P2M1=0xff;
      color = LCD_RD_DATA_16Bit();
      P2M0=0xff;
      P2M1=0x00;
      
      return color;
}

ercircle 发表于 2025-6-13 12:57:53

不行,直接乱套了

C_wolf 发表于 2025-6-13 13:35:18

工程打包了,我这是没问题的。

ercircle 发表于 2025-6-13 14:00:34

C_wolf 发表于 2025-6-13 13:35
工程打包了,我这是没问题的。

666,再改个LCMIFCFG2 = 0x2F;和LCD_Read_ID就好了,看来是个时序问题。
原来的Lcd_RD_DATA_16Bit只需要屏蔽一次r = LCD_RD_DATA();就效果一样了







C_wolf 发表于 2025-6-13 14:41:04

ercircle 发表于 2025-6-13 14:00
666,再改个LCMIFCFG2 = 0x2F;和LCD_Read_ID就好了,看来是个时序问题。
原来的Lcd_RD_DATA_16Bit只需要 ...

使用 “LCD_SetCursor(x,y);//设置光标位置 ”这个语句,在设置完坐标后会写入(0x2C)写数据。
而读数据是2E,所以我根据手册,为了严谨些就直接操作了,没有调用这个函数。

ercircle 发表于 2025-6-13 15:11:03

C_wolf 发表于 2025-6-13 14:41
使用 “LCD_SetCursor(x,y);//设置光标位置 ”这个语句,在设置完坐标后会写入(0x2C)写数据。
而读数据 ...

手册能上传下不,我也学习下,昨天在立创上找没找到{:4_164:}
页: [1]
查看完整版本: 一个LCM外设读取问题|时序问题,已解决