511224asdf 发表于 2026-4-10 21:21:20

求助STC32G12K128驱动彩屏硬件I8080还没有软件模拟快

用STC32G12K128芯片,用硬件LCM驱动16位并口屏,刷新还没有用软件模拟快,请教老师帮忙看看是哪里没有配置好吗?



////////////////////////////////////////
// LCM初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void LCM_Init(void)
{
      LCM_DATA16BSwitchP2P0();            //选择LCM数据口: {P2, P0}
    LCM_RSSwitchP40();                  //选择LCM的RS端口: RS (P4.0)
    LCM_CTRLSwitchP4442();            //选择LCM的R/W控制端口: RD (P4.4), WR (P4.2)

    LCM_SetMode_i8080();                //设置LCM为i8080模式
    LCM_SetBitWidth_16B();            //设置LCM为16数据模式
    LCM_SetSetupTime(2);                //设置LCM数据建立时间
    LCM_SetHoldTime(1);               //设置LCM数据保持时间

    // LCM_SetIntPriority(3);            //设置中断为最高优先级                                 //查询法不用打开中断
    // LCM_EnableInt();                     //使能LCM中断                                                //查询法不用打开中断
    //LCMIFSTA = 0x00;                         // LCMIFIF中断请求标志,需软件清零          //查询法不用打开中断
      
      LCM_Enable();                               //使能LCM功能
}


/*****************************************************************************
* @name       :void LCM_Interrupt(void)
* @date       :2018-11-13
* @function   :None
* @parameters :None
* @retvalue   :查询法不用打开中断
******************************************************************************/
void LCM_ISR(void) interrupt LCM_VECTOR
{
//      LCMIFSTA = 0x00;
//      LCD_CS=1;
}
/*****************************************************************************
* @name       :void LCD_WR_REG(u16 Reg)   
* @date       :2018-08-09
* @function   :Write an 16-bit command to the LCD screen          在LCD屏幕上写入16位命令
* @parameters :Reg:Command value to be written                              要写入的命令值
* @retvalue   :None
******************************************************************************/
void LCD_WR_REG(u16 Reg)   
{
/*****************硬件LCM**********************************/               
      
//    LCMIFDATH = Reg>>8;
//      LCMIFDATL = Reg;
//      LCD_CS_L();
//      LCMIFCR = 0x84;                //启用接口,写出命令
//    while(!LCMIFSTA);      //中断法去掉这行
//    LCMIFSTA = 0x00;      //中断法去掉这行
//    LCD_CS_H();                //中断法去掉这行
      
/*****************软件模拟**********************************/      
      LCD_RS=0;
      LCD_CS=0;
      LCD_WR=0;
      LCD_DataPortH=Reg>>8;
      LCD_DataPortL=Reg;
      LCD_WR=1;
      LCD_CS=1;
}

/*****************************************************************************
* @name       :void LCD_WR_DATA(u16 Data)
* @date       :2018-08-09
* @function   :Write an 16-bit data to the LCD screen将16位数据写入LCD屏幕
* @parameters :data:data value to be written                        要写入的数据值
* @retvalue   :None
******************************************************************************/
void LCD_WR_DATA(u16 Data)
{
/*****************硬件LCM**********************************/               
      
//    LCMIFDATH = Data>>8;
//      LCMIFDATL = Data;
//      LCD_CS_L();
//      LCMIFCR = 0x85;                // 启用接口,写出数据
//    while(!LCMIFSTA);                //中断法去掉这行
//    LCMIFSTA = 0x00;               //中断法去掉这行
//    LCD_CS_H();                     //中断法去掉这行
      
/*****************软件模拟**********************************/               
      LCD_RS=1;
      LCD_CS=0;
      LCD_WR=0;
      LCD_DataPortH=Data>>8;
      LCD_DataPortL=Data;
      LCD_WR=1;
      LCD_CS=1;      
}

王昱顺 发表于 2026-4-11 11:34:09

这是很正常的事情,DMA内因为设置了数据建立等待时间和数据保持时间,所以肯定比软件模拟要慢一些的,你可以调低这两个时序值(前提是保证数据发出去没有问题)。这样应该是可以接近软件模拟速度的。
另外DMA是用来让CPU干点其他的活的,可以让CPU的响应速度更快(因为其他任务由DMA处理,CPU不参与),DMA设计的时候就没有说一定要比模拟更快

狂热主宰 发表于 2026-4-11 11:46:56

通常 GPIO 可以模拟
这效率可能低些

511224asdf 发表于 2026-4-11 13:25:29

王昱顺 发表于 2026-4-11 11:34
这是很正常的事情,DMA内因为设置了数据建立等待时间和数据保持时间,所以肯定比软件模拟要慢一些的,你可 ...

{:baoquan:}谢谢回复

511224asdf 发表于 2026-4-11 13:25:54

狂热主宰 发表于 2026-4-11 11:46
通常 GPIO 可以模拟
这效率可能低些

感谢回复
页: [1]
查看完整版本: 求助STC32G12K128驱动彩屏硬件I8080还没有软件模拟快