搜索
bottom↓
回复: 6

RT-GUI测试碰到一个特殊问题请教...

[复制链接]

出0入0汤圆

发表于 2010-2-23 20:37:24 | 显示全部楼层 |阅读模式
初次使用RT-GUI和RT-THREAD操作系统,RT-GUI测试碰到一个特殊问题请教,所有的控件,标题和控制本身显示之时分离,控件绘制之时标题显示正常,但控制本身从右向左绘制,文字从左向右绘制(正确,有图),请各位指教!
照片照的不清楚,照了好几张都是这样!

测试时的图片-RT-GUI (原文件名:1.JPG)

下面是一张示例图片,最后一个控件是文本框,要显示的文字是textbox,可以清楚的看到,控制从右向左控制,到最左边之后,折到最继续绘制,一直到指定的大小。第一张是一个按纽,情况相同,第二个是进度条,情况也是一样,当进度条更新的时候,先从右向左填充蓝色,到最左之后,折到最右继续显示,一直到指定的大小。


说明问题的示例图片 (原文件名:2.JPG)


测试之时使用的是英蓓特公司的103ZE的开发板,320*240屏的驱动芯片是ILI9325。
各位分析一下:可能是因为驱动层的问题(ILI9325)还是我程序的问题。
代码如下:
void ili9325_Initializtion(void)
{
        u32 i=0;
        //hardware initialization
        LCD_CtrlLinesConfig();
        LCD_FSMCConfig();
        Delay(5);

        LCD_WriteReg(R227, 0x3008);   // Set internal timing
        LCD_WriteReg(R231, 0x0012); // Set internal timing
        LCD_WriteReg(R239, 0x1231);   // Set internal timing
       
        LCD_WriteReg(R1  , 0x0100); // set SS and SM bit
        LCD_WriteReg(R2  , 0x0700); // set 1 line inversion
       
        /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
        LCD_WriteReg(R3,(1<<12)|(1<<5)|(0<<4) | (1<<3) );
        LCD_WriteReg(R4  , 0x0000);   // Resize register
        LCD_WriteReg(R8  , 0x0207);   // set the back porch and front porch
        LCD_WriteReg(R9  , 0x0000);   // set non-display area refresh cycle ISC[3:0]
        LCD_WriteReg(R10 , 0x0000);   // FMARK function
        //LCD_WriteReg(R12 , 0x0001); // RGB interface setting
        LCD_WriteReg(R13 , 0x0000);   // Frame marker Position
        LCD_WriteReg(R15 , 0x0000); // RGB interface polarity
       
        /**************Power On sequence ****************/
        LCD_WriteReg(R16 , 0x0000);   // SAP, BT[3:0], AP, DSTB, SLP, STB
        LCD_WriteReg(R17 , 0x0007);   // DC1[2:0], DC0[2:0], VC[2:0]
        LCD_WriteReg(R18 , 0x0000); // VREG1OUT voltage
        LCD_WriteReg(R19 , 0x0000);   // VDV[4:0] for VCOM amplitude
        Delay(20);                    // Delay 200 MS , Dis-charge capacitor power voltage
        LCD_WriteReg(R16 , 0x1790);   // SAP, BT[3:0], AP, DSTB, SLP, STB
        LCD_WriteReg(R17 , 0x0227); // R11H=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0]
        Delay(5);      // Delay 50ms
        LCD_WriteReg(R18 , 0x009c); // External reference voltage= Vci;
        Delay(5);      // Delay 50ms
        LCD_WriteReg(R19 , 0x1900); // R13H=1D00 when R12H=009D;VDV[4:0] for VCOM amplitude
        LCD_WriteReg(R41 , 0x0023); // R29H=0013 when R12H=009D;VCM[5:0] for VCOMH
        LCD_WriteReg(R43 , 0x000e);   // Frame Rate = 96Hz
        Delay(5);      // Delay 50ms
        LCD_WriteReg(R32 , 0x0000); // GRAM horizontal Address
        LCD_WriteReg(R33 , 0x0000); // GRAM Vertical Address
        /* ----------- Adjust the Gamma Curve ---------- */
        LCD_WriteReg(R48 , 0x0007);
        LCD_WriteReg(R49 , 0x0707);
        LCD_WriteReg(R50 , 0x0006);
        LCD_WriteReg(R53 , 0x0704);
        LCD_WriteReg(R54 , 0x1F04);
        LCD_WriteReg(R55 , 0x0004);
        LCD_WriteReg(R56 , 0x0000);
        LCD_WriteReg(R57 , 0x0706);
        LCD_WriteReg(R60 , 0x0701);
        LCD_WriteReg(R61 , 0x000F);
        /* ------------------ Set GRAM area --------------- */
        LCD_WriteReg(R80 , 0x0000);   // Horizontal GRAM Start Address
        LCD_WriteReg(R81 , 0x00ef);   // Horizontal GRAM End Address
        LCD_WriteReg(R82 , 0x0000); // Vertical GRAM Start Address
        LCD_WriteReg(R83 , 0x013f); // Vertical GRAM End Address
       
        LCD_WriteReg(R96 , 0xa700); // Gate Scan Line
        LCD_WriteReg(R97 , 0x0001); // NDL,VLE, REV
        LCD_WriteReg(R106, 0x0000); // set scrolling line
        /* -------------- Partial Display Control --------- */
        LCD_WriteReg(R128, 0x0000);   
        LCD_WriteReg(R129, 0x0000);
        LCD_WriteReg(R130, 0x0000);
        LCD_WriteReg(R131, 0x0000);
        LCD_WriteReg(R132, 0x0000);
        LCD_WriteReg(R133, 0x0000);
        /* -------------- Panel Control ------------------- */
        LCD_WriteReg(R144, 0x0010);
        LCD_WriteReg(R146, 0x0600);
        LCD_WriteReg(R147, 0x0003);
        LCD_WriteReg(R149, 0x0110);
        LCD_WriteReg(R151, 0x0000);
        LCD_WriteReg(R152, 0x0000);
       
        LCD_WriteReg(R7  , 0x0133); // 262K color and display ON
       
        LCD_WriteReg(R32 , 0x0000); // GRAM horizontal Address
        LCD_WriteReg(R33 , 0x0000); // GRAM Vertical Address

       
        Delay(5);
   ili9325_Clear(White);
}
上述是ILI9325部分的程序;
下面是RT-GUI部分:
static rtgui_progressbar_t* hbar;
static rtgui_timer_t *bar_timer=RT_NULL;

static char* radio_item[2]={"one","two"};

static rt_bool_t benchmain_evetn_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
        //处理benchmain面板中发生的事件,暂时不用,直接用默认处理
        return rtgui_view_event_handler(widget, event);   
}

static rt_bool_t main_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
        //处理benchmain面板中发生的事件,暂时不用,直接用默认处理
        return rtgui_view_event_handler(widget, event);   
}

void progressbar_timeout(struct rtgui_timer* timer,void* parameter)
{
   static rt_uint32_t value=0;
        value++;

        if(value==100)
           value=0;
        rtgui_progressbar_set_value(hbar,value);

}
static void info_entry(void* parameter)
{
        //UI依赖于一定的线程环境,它依赖于一个消息队列,
        //这个消息队列会收到来自GUI SERVER的请求信息
        rt_mq_t mq;       
       
        //工作台
        struct rtgui_workbench* main_workbench;
   
        //               
        struct rtgui_view* main_view;
        rtgui_checkbox_t *checkbox;
        rtgui_button_t*  button;
        rtgui_label_t* label;
        rtgui_radiobox_t* radiobox;
        rtgui_slider_t* slider;
        rtgui_textbox_t* textbox;
        //
        rtgui_font_t* font;
        //
        rtgui_rect_t rect;       
       
        //创建一个消息队列
        mq = rt_mq_create("qInfo",
                           32,
                                                         8,
                                                         RT_IPC_FLAG_FIFO);
       
        //注册消息对列mq到当前线程上
        rtgui_thread_register(rt_thread_self(), mq);
       
        //创建工作台 在main面板区域
        main_workbench = rtgui_workbench_create("main", "benchmain");
        if (main_workbench == RT_NULL) return;
        //rtgui_widget_set_event_handler(RTGUI_WIDGET(main_workbench),benchmain_evetn_handler);

        //下面在mainbench上创建另一个视图
        main_view=rtgui_view_create("mainview");
        RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(main_view))=white;
        rtgui_widget_set_event_handler(RTGUI_WIDGET(main_view),main_view_event_handler);
        rtgui_workbench_add_view(main_workbench,main_view);

        //创建checkbox
   //获取视图的区域
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+100;
        rect.y1+=5;
        rect.y2=rect.y1+20;

       
        checkbox=rtgui_checkbox_create("checkbox");
        RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox))=red;
        rtgui_widget_set_rect(RTGUI_WIDGET(checkbox),&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(checkbox));

   //创建按钮               
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
       
        rect.x1+=50;
        rect.x2=rect.x1+80;
        rect.y1+=5+25;
        rect.y2=rect.y1+20;

        button=rtgui_button_create("red");
        RTGUI_WIDGET(button)->align = RTGUI_ALIGN_CENTER_VERTICAL;
        rtgui_widget_set_rect(RTGUI_WIDGET(button),&rect);
        RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button))=red;
       
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(button));

        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
       
        rect.x1+=100;
        rect.x2=rect.x1+50;
        rect.y1+=5+25+25;
        rect.y2=rect.y1+20;
        button=rtgui_button_create("blue");
        RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button))=blue;
        rtgui_widget_set_rect(RTGUI_WIDGET(button),&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(button));

        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+40;
        rect.y1+=5+25+25+25;
        rect.y2=rect.y1+20;
        button=rtgui_button_create("12 font");
        font=rtgui_font_refer("asc",12);
        RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(button))=red;
        RTGUI_WIDGET_FONT(RTGUI_WIDGET(button))=font;

        rtgui_widget_set_rect(RTGUI_WIDGET(button),&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(button));
       
       
        //创建label
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+100;
        rect.y1+=5+25+25+25+25;
        rect.y2=rect.y1+20;
       
        label=rtgui_label_create("blue left");
        RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(label))=RTGUI_ALIGN_LEFT;
        RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(label))=blue;
        rtgui_widget_set_rect(RTGUI_WIDGET(label),&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(label));
   

        //create a progressbar
   rect.y1+=20;
        rect.y2=rect.y1+18;
        hbar=rtgui_progressbar_create(RTGUI_HORIZONTAL,100,&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(hbar));
       
        bar_timer=rtgui_timer_create(50,RT_TIMER_FLAG_PERIODIC,progressbar_timeout,RT_NULL);
        rtgui_timer_start(bar_timer);

   //create two raidobox
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+40;
        rect.y1+=5+25+25+25+25+25;
        rect.y2=rect.y1+20;
   
        radiobox=rtgui_radiobox_create("Radio box",RTGUI_VERTICAL,radio_item,2);
        rtgui_radiobox_set_selection(radiobox,0);
       

        //crate a slider
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+40;
        rect.y1+=5+25+25+25+25+25+25*2;
        rect.y2=rect.y1+20;
   
   slider=rtgui_slider_create(0,100,RTGUI_HORIZONTAL);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(slider));                                 
        rtgui_widget_set_rect(RTGUI_WIDGET(slider),&rect);


        //create a textbox
           //crate a slider
        rtgui_widget_get_rect(RTGUI_WIDGET(main_view),&rect);       
        rect.x1+=5;
        rect.x2=rect.x1+120;
        rect.y1+=5+25+25+25+25+25+25*3;
        rect.y2=rect.y1+20;
   
        textbox=rtgui_textbox_create("textbox");
        rtgui_widget_set_rect(RTGUI_WIDGET(textbox),&rect);
        rtgui_container_add_child(RTGUI_CONTAINER(main_view),RTGUI_WIDGET(textbox));

        //显示次视图
        rtgui_view_show(main_view, RT_FALSE);
       
        //rtgui_view_show(()checkbox,RT_FALSE);
        //执行窗口的事件循环
        rtgui_workbench_event_loop(main_workbench);
   
        //去注册当前线程
        rtgui_thread_deregister(rt_thread_self());
        //删除相应的消息队列
        rt_mq_delete(mq);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-2-23 21:36:52 | 显示全部楼层
第一张看不清,你指的是显示位置不对?

先看看你的驱动吧,这个驱动应该是你自己实现的吧。你可以配合finsh进行,绘水平线和垂直线,看看它们是否正确。

出0入0汤圆

发表于 2010-2-23 21:40:52 | 显示全部楼层
看驱动貌似引自RADIO中的9325.但又不完全相同.
这份驱动目前是不行的(基本绘图正常),已投入3人正在调试.
如果有查出是RADIO中的代码有问题,会在这里回复,你也先查下基本的绘图是否OK.

出0入0汤圆

 楼主| 发表于 2010-2-23 22:18:30 | 显示全部楼层
原来测试的时候,已经将ILI9325的驱动部分不含有RT-THREAD和RT-GUI的时候调试通过。因为需要操作系统和RT-GUI,所以驱动按我自已的实现写了ILI9325的部分,初始化值重要的部分相同。R3,R30,R31等。LCD的驱动部分是用的RADIO项目的。

现在调试后发现:lcd.c中
/* 画水平线 */
void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y)
{
    unsigned short p;

    /* get color pixel */
    p = rtgui_color_to_565p(*c);

    /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
    LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) );

    ili9325_SetCursor(x1, y);
    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
    while (x1 < x2)
    {
        //LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
        LCD_WriteRAM(p);
        x1++;
        //ili9320_SetCursor(x1, y);
    }
}
部分改为:LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) );就正确了
原来是:    LCD_WriteReg(0x0003,(1<<12)|(1<<5)|(0<<4) | (0<<3) );
将R3寄存器的ID0改为1,再测试就对了。

其它部分还未发现不正常的地方,因为还没有测试到呢!

在这里首先真诚的感谢ffxx和aozima二位的快速回贴,倍受感动!同时再次感谢版主ffxx,提供的RT-Thread和RT-GUI。

出0入0汤圆

发表于 2010-2-24 01:17:38 | 显示全部楼层
是的,这里确实错了,难怪以前那条线总是反着画的.
原因在于,我以DS上面的长方形来判断XY了,而不是以横竖方向.老眼昏花了.
技艺不精,误导他人,罪过罪过!!

另外:
今天终于在正点原子的协助下发现我手上这个9325的LCD不支持连读,只支持一次读一个点.
哎,浪费了不少时间.

现在SVN中的代码已修正(这价代码是COPY,里面不用的东西还比较多,都是没有亲自测试的).

出0入0汤圆

发表于 2010-2-24 01:19:15 | 显示全部楼层
另外,楼主莫非是晕图党印象派的前辈?

出0入0汤圆

 楼主| 发表于 2010-2-24 13:12:59 | 显示全部楼层
相机不好,而且是晚上照的,所以。哈哈,谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 00:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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