求助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;
}
这是很正常的事情,DMA内因为设置了数据建立等待时间和数据保持时间,所以肯定比软件模拟要慢一些的,你可以调低这两个时序值(前提是保证数据发出去没有问题)。这样应该是可以接近软件模拟速度的。
另外DMA是用来让CPU干点其他的活的,可以让CPU的响应速度更快(因为其他任务由DMA处理,CPU不参与),DMA设计的时候就没有说一定要比模拟更快 通常 GPIO 可以模拟
这效率可能低些 王昱顺 发表于 2026-4-11 11:34
这是很正常的事情,DMA内因为设置了数据建立等待时间和数据保持时间,所以肯定比软件模拟要慢一些的,你可 ...
{:baoquan:}谢谢回复 狂热主宰 发表于 2026-4-11 11:46
通常 GPIO 可以模拟
这效率可能低些
感谢回复
页:
[1]