找回密码
 立即注册
查看: 129|回复: 2

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

[复制链接]
  • TA的每日心情
    开心
    昨天 11:24
  • 签到天数: 129 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    944

    积分

    高级会员

    积分
    944
    发表于 2024-3-23 21:16:34 | 显示全部楼层 |阅读模式
    调试墨水屏驱动程序时碰到一个怪现象,弄了好几天百思不得其解,请编程高手指点一下,先谢了!

    下面是一个局部显示的函数:
    1. //----局部画色块--------------------------------------
    2. void EPD_Dis_Part( u16 x0, u16 y0, u16 w, u16 h, u8  datas ) //u8 * datas
    3. {
    4.     u16 i, n;
    5.     n = h * w / 8;
    6.     EPD_Part_Init();
    7.     EPD_SetPos( x0, x0 + w, y0, y0 + h );
    8.     L_command( 0x24 );
    9.     for( i = 0; i < n; i++ )
    10.     {
    11.         L_data( datas );
    12.     }
    13.     EPD_Part_Update();
    14. }
    复制代码
    下面在主函数的主循环中调用这个函数:
    1.     while( 1 )
    2.     {
    3.         EPD_Dis_Part( 16, 100, 80, 40, 0x00 );//显示一块黑色
    4.         delay_ms( 1000 );
    5.         EPD_Dis_Part( 16, 100, 80, 40, 0xff );//显示一块白色
    6.         EPD_sleep();
    7.         delay_ms( 1000 );
    8.         led = ~led;
    9.     }
    10. }
    复制代码
    上述代码只执行后只显示了一个黑色的色块,led隔2秒闪烁一次正常进行。
    如果修改这个函数:
    1. //----局部画色块--------------------------------------
    2. void EPD_Dis_Part( u16 x0, u16 y0, u16 w, u16 h, u8  datas ) //u8 * datas
    3. {
    4.     u16 i, n;
    5.     n = h * w / 8;
    6.    
    7.     EPD_SetPos( x0, x0 + w, y0, y0 + h );
    8.     L_command( 0x24 );
    9.     for( i = 0; i < n; i++ )
    10.     {
    11.         L_data( datas );
    12.     }
    13.    
    14. }
    复制代码
    修改主循环:
    1.     while( 1 )
    2.     {
    3.                 EPD_Part_Init();
    4.         EPD_Dis_Part( 16, 100, 80, 40, 0x00 );//显示一块黑色
    5.                 EPD_Part_Update();
    6.         delay_ms( 1000 );
    7.                 EPD_Part_Init();
    8.         EPD_Dis_Part( 16, 100, 80, 40, 0xff );//显示一块白色
    9.                 EPD_Part_Update();
    10.         EPD_sleep();
    11.         delay_ms( 1000 );
    12.         led = ~led;
    13.     }
    复制代码
    修改后程序可以如愿运行了,同一位置交替显示黑色、白色、led闪烁。
    我想知道的是:这两句代码:EPD_Part_Init(); EPD_Part_Update();放在函数中与放在主循环中有啥不同,为啥结果不同?
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 75 天

    [LV.6]常住居民II

    0

    主题

    212

    回帖

    486

    积分

    中级会员

    积分
    486
    发表于 2024-3-24 00:00:12 | 显示全部楼层
    你原来的局部显示函数每次执行都要执行初始化程序,哪有这么干的,而且墨水屏反应很慢的,你初始化后要给点时间启动到正常
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 11:24
  • 签到天数: 129 天

    [LV.7]常住居民III

    30

    主题

    107

    回帖

    944

    积分

    高级会员

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

    我是按照例程改编的程序,根据例程墨水屏要求每次刷屏都要设置驱动波形这就要求每次操作都要配置一次。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-20 10:45 , Processed in 0.064824 second(s), 36 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表