乐此不疲 发表于 2024-3-23 21:16:34

请教!函数在主循环中无法运行的原因?

调试墨水屏驱动程序时碰到一个怪现象,弄了好几天百思不得其解,请编程高手指点一下,先谢了!

下面是一个局部显示的函数:
//----局部画色块--------------------------------------
void EPD_Dis_Part( u16 x0, u16 y0, u16 w, u16 h, u8datas ) //u8 * datas
{
    u16 i, n;
    n = h * w / 8;
    EPD_Part_Init();
    EPD_SetPos( x0, x0 + w, y0, y0 + h );

    L_command( 0x24 );
    for( i = 0; i < n; i++ )
    {
      L_data( datas );
    }
    EPD_Part_Update();

}下面在主函数的主循环中调用这个函数:
    while( 1 )
    {

      EPD_Dis_Part( 16, 100, 80, 40, 0x00 );//显示一块黑色
      delay_ms( 1000 );
      EPD_Dis_Part( 16, 100, 80, 40, 0xff );//显示一块白色
      EPD_sleep();
      delay_ms( 1000 );

      led = ~led;
    }
}上述代码只执行后只显示了一个黑色的色块,led隔2秒闪烁一次正常进行。
如果修改这个函数:
//----局部画色块--------------------------------------
void EPD_Dis_Part( u16 x0, u16 y0, u16 w, u16 h, u8datas ) //u8 * datas
{
    u16 i, n;
    n = h * w / 8;
   
    EPD_SetPos( x0, x0 + w, y0, y0 + h );

    L_command( 0x24 );
    for( i = 0; i < n; i++ )
    {
      L_data( datas );
    }
   

}修改主循环:
    while( 1 )
    {
                EPD_Part_Init();
      EPD_Dis_Part( 16, 100, 80, 40, 0x00 );//显示一块黑色
                EPD_Part_Update();
      delay_ms( 1000 );
                EPD_Part_Init();
      EPD_Dis_Part( 16, 100, 80, 40, 0xff );//显示一块白色
                EPD_Part_Update();
      EPD_sleep();
      delay_ms( 1000 );

      led = ~led;
    }修改后程序可以如愿运行了,同一位置交替显示黑色、白色、led闪烁。
我想知道的是:这两句代码:EPD_Part_Init(); EPD_Part_Update();放在函数中与放在主循环中有啥不同,为啥结果不同?

xxxevery 发表于 2024-3-24 00:00:12

你原来的局部显示函数每次执行都要执行初始化程序,哪有这么干的,而且墨水屏反应很慢的,你初始化后要给点时间启动到正常

乐此不疲 发表于 2024-3-24 18:42:41

xxxevery 发表于 2024-3-24 00:00
你原来的局部显示函数每次执行都要执行初始化程序,哪有这么干的,而且墨水屏反应很慢的,你初始化后要给点 ...

我是按照例程改编的程序,根据例程墨水屏要求每次刷屏都要设置驱动波形这就要求每次操作都要配置一次。
页: [1]
查看完整版本: 请教!函数在主循环中无法运行的原因?