硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3143|回复: 5
收起左侧

[FreeRTOS] 富莱7寸屏关于屏幕保护问题:退出屏保后经常出现屏幕是黑屏现象,但是程序却仍然运

[复制链接]

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2016-6-29 15:51:54 | 显示全部楼层 |阅读模式
    使用安富莱7寸屏跑FREERTOS和UCGUI,想实现电脑上的屏幕保护功能,目的是为了节省电量,功能如下:


                (1)、如果连续5分钟没有检测到某个开关量振动信号,则屏幕进入屏保状态,
                                    使用LCD_DispOff()函数关闭屏幕显示,LCD_DispOff()函数用的是开发板上的函数。

              (2)、如果屏幕已经进入屏幕保护,则连续3秒钟检测到某个开关量振动信号,则屏幕退出屏保状态,
               
                                    使用LCD_DispOn();函数打开屏幕显示,LCD_DispOn()函数用的是开发板上的函数

               (3)、现象如下:
                                 进入屏保后屏幕黑屏,退出屏保后有时候屏幕正常显示,但是经常出现屏幕是黑屏现象,此后屏幕再也无法显示出画面了,但是程序却一直运行正常 。
                     



/*
*********************************************************************************************************
*    函 数 名: LCD_DispOn
*    功能说明: 打开显示
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
void LCD_DispOn(void)
{
    if (g_ChipID == IC_8875)
    {
        RA8875_DispOn();
    }
    else if (g_ChipID == IC_9488)
    {
        //ILI9488_DispOn();
    }
    else    /* 61509, 5420, 4001 */
    {
        //SPFD5420_DispOn();
    }
}



/*
*********************************************************************************************************
*    函 数 名: LCD_DispOff
*    功能说明: 关闭显示
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
void LCD_DispOff(void)
{
    if (g_ChipID == IC_8875)
    {
        RA8875_DispOff();
    }
    else if (g_ChipID == IC_9488)
    {
        //ILI9488_DispOff();
    }
    else    /* 61509, 5420, 4001 */
    {
        //SPFD5420_DispOff();
    }
}
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2016-6-29 15:58:01 | 显示全部楼层
休眠任务如下:

void vTask_sleep( void *pvParameters )
{
    static uint32_t vibration_j = 0x00;   
    static uint32_t vibration_k = 0x00;
    static uint8_t vibration_isr = 0;
    static uint8_t vibration_di[2] = {0,0};   
   

   
    while(1)
    {               
        switch (vibration_isr)
        {
            case 0:
                vibration_isr = 1;
                vibration_di[0] = VIBRATION_READ();   //检测某个开关量振动信号
                break;
            case 1:
                vibration_isr = 0;
                vibration_di[1] = VIBRATION_READ();   
                if (vibration_di[0] == vibration_di[1])     //如果前后2个周期振动信号相同
                {
                    if (vibration_di[1] == 1)//VIBRATION_READ())//本分支准备退出休眠(采集到振动信号)
                    {               
            
                        vibration_k++;      // 退出休眠计数器+1
                        if (vibration_k >= 5)
                            vibration_j = 0;   //进入休眠计数器清0
                        
                        if (vibration_k >= 100)    // 连续检测到100次振动信号,则退出休眠
                        {
                            vibration_k = 0;
                            if (RMC208_sleep_mark)
                            {        
                                RMC208_sleep_mark = 0;                    
                                //LCD_SetBackLight(255);//2016.06.03删除本语句验证是否本语句进入屏幕保护;
                                LCD_DispOn();   
                            }
                        }        
                    }
                    else//本分支准备进入休眠(未采集到振动信号)
                    {

            
                        vibration_j++;              // 进入休眠计数器+1
                        if (vibration_j >= 5)   // 连续5次都没有检测到振动信号,则退出休眠计数器清0
                            vibration_k = 0;
                        
                        if (vibration_j >= 500)  //连续500次都没有检测到振动信号,则进入休眠
                        {
                            vibration_j = 0;
                            if (!RMC208_sleep_mark)
                            {
                                RMC208_sleep_mark = 1;
                                //LCD_SetBackLight(0);//2016.06.03删除本语句验证是否本语句进入屏幕保护                        
                                LCD_DispOff();   

                            }
                        }
                    }
               
                }            

        }
        
        vTaskDelay(100 / portTICK_RATE_MS);
    }
}
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2016-6-30 10:15:28 | 显示全部楼层
我就是是想实现,如果长时间没有操作,则进入屏保,关闭屏幕。

                                   屏保状态时,检测到操作后,退出屏保,打开屏幕。

     但是现在出现的现象为:

                  进入屏保后,屏幕能够正常关闭显示,但是退出屏保后,【经常】出现屏幕无论如何也无法打开显示,此后屏幕再也无法显示出画面,但是程序却一直运行正常。
我是新手,请多多关照。
回复

使用道具 举报

4

主题

65

回帖

77

积分

初级会员

积分
77
发表于 2016-6-30 17:35:49 | 显示全部楼层
简单呀,不能调试跟踪吗?比如符合条件后是否进入display on 函数。进入后不亮再继续排查
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2016-7-1 09:59:41 | 显示全部楼层
平时屏保能够正常运行,即:

             进入屏保后,调用LCD_DispOff(); 函数,屏幕黑屏。
             退出屏保后,调用函数 LCD_DispOn();   屏幕正常显示。

     但是运行一段时间后,退出屏保时调用函数 LCD_DispOn();   屏幕仍然是黑屏,此后屏幕再也无法显示出画面了,但是程序却一直运行正常 ,因为电脑和板子的通信一直正常,而且进入屏保时我会点亮一个指示灯,退出屏保时,我会熄灭一个指示灯,指示灯的状态一直正确。
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2016-7-4 08:58:21 | 显示全部楼层
平时屏保能够正常运行,即:

             进入屏保后,调用LCD_DispOff(); 函数,屏幕黑屏。
             退出屏保后,调用函数 LCD_DispOn();   屏幕正常显示。

     但是运行一段时间后,退出屏保时调用函数 LCD_DispOn();   屏幕仍然是黑屏,此后屏幕再也无法显示出画面了,但是程序却一直运行正常 ,因为电脑和板子的通信一直正常,而且进入屏保时我会点亮一个指示灯,退出屏保时,我会熄灭一个指示灯,指示灯的状态一直正确。
我是新手,请多多关照。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 11:24 , Processed in 0.294114 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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