OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9578|回复: 13

新手求救 综合实验鼠标画板问题:不用按中间的按键也可擦除 求改

[复制链接]

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
发表于 2012-12-31 17:05:35 | 显示全部楼层 |阅读模式
我是借了同学的ALIENTEK MiniSTM32开发板来学的,用他的液晶做综合实验时,鼠标画板是正常的。我之前买了另外一块开发板,上面有液晶,2.8寸,5408驱动的,但接口跟原子的开发板原理图不一样的。我就按原子的原理图用杜邦线外接我的液晶。然后烧光盘上的好几个程序下去,都是正常的。但在综合实验那里,像电子图书、数码相框、拼图游戏等等都是正常的,唯独鼠标画板的时候有点问题,就是没按鼠标中间那个按键的时候,光标也可以擦除所画的东西,不知是什么问题。而用原子自带的液晶是不会有这种问题的。求高手指点迷津。

图示:




下面的代码有的地方看不懂,求大神指点

//标准光标
//12*20大小
const u8 std_cur_tab[36]=                                    //什么是标准光标,下面的数怎么获得
{0xFF,0xFF,0x00,0x80,0x02,0x00,0x40,0x04,0x00,
 0x20,0x08,0x00,0x10,0x18,0x00,0x08,0x06,0x00,
 0x04,0x01,0x80,0x02,0x38,0x60,0x01,0x26,0x10,
 0x00,0xA1,0x90,0x00,0x60,0x60,0x00,0x20,0x00};
//标准光标掩码                                                      //什么是标准掩码,下面的数怎么获得
const u8 std_cur_msk[36]=
{0xFF,0xFF,0x00,0xFF,0xFE,0x00,0x7F,0xFC,0x00,
 0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x0F,0xFE,0x00,
 0x07,0xFF,0x80,0x03,0xFF,0xE0,0x01,0xE7,0xF0,
 0x00,0xE1,0xF0,0x00,0x60,0x60,0x00,0x20,0x00};

//光标覆盖区域数据缓存区
//12*20的光标实际上只需要125个字节
u16 cur_buf[125];                                       //这里为什么是125个字节?

//清除光标                                                  //这个函数说是清除光标,如何体现?怎么理解?
//用于清除最近一次的光标
//(x,y)一般就是(MY_Cursor.X,MY_Cursor.Y)                               
void Clear_Cursor(u16 x,u16 y)
{
    u16 y0=y;
    u8 t,t1,temp,temp1;               
    u8 rccnt=0;//读取到的颜色计数器   
    if((MY_Cursor.STA&0x01)==0)return;//如果光标还没开始画,则直接返回     
    for(t=0;t<36;t++)
    {                                                     
        temp=std_cur_tab[t]; //得到数据
        temp1=std_cur_msk[t];//得到掩码数据                        
        for(t1=0;t1<8;t1++)
        {
            if(temp1&0x80)                               
            {
                  POINT_COLOR=cur_buf[rccnt];//还原原来的颜色                 
                if(y<320)LCD_DrawPoint(x,y);//LCD_DrawPoint函数没有判断范围,这里我们需外部判断
                rccnt++;
             }      
            temp<<=1;                       //这里一直移位,可是这个清除光标的函数貌似没用到temp,有什么用?
            temp1<<=1;
            y++;                              
            if((y-y0)==20)
            {
                y=y0;
                x++;
                if(x>=LCD_W)return;//X方向 越界
                break;
            }
        }       
    }
}     
//(x,y):设置光标的位置
//color:光标的颜色
//如果为白色,则为标准光标
void Set_Cursor(u16 x,u16 y)
{   
    u16 y0=y;
    u8 t,t1,temp,temp1;     
    u16 out_color,in_color;     
    u8 rccnt=0;//读取到的颜色计数器

    out_color=in_color=MY_Cursor.Color;
    if(MY_Cursor.Color==WHITE)out_color=BLACK;//如果为白色,则为标准光标
    MY_Cursor.STA|=0X01;//标记开始
    MY_Cursor.X=x;//记录此次坐标
    MY_Cursor.Y=y;  
    POINT_COLOR=MY_Cursor.Color;
    BACK_COLOR=WHITE;
    for(t=0;t<36;t++)
    {                                                     
        temp=std_cur_tab[t]; //得到数据
        temp1=std_cur_msk[t];//得到掩码数据                        
        for(t1=0;t1<8;t1++)
        {
            if(temp1&0x80)
            {
                if(temp&0x80)POINT_COLOR=out_color;//边框
                else POINT_COLOR=in_color;//内部
                cur_buf[rccnt]=LCD_ReadPoint(x,y);//读取当前点的颜色值
                rccnt++;
                if(y<320)LCD_DrawPoint(x,y);//LCD_DrawPoint函数没有判断范围,这里我们需外部判断
             }//透明区域,不画出来       
            temp<<=1;
            temp1<<=1;
            y++;                             
            if((y-y0)==20)
            {
                y=y0;
                x++;
                if(x>=LCD_W)return;//X轴方向 越界
                break;
            }
        }       
    }  
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-31 17:50:24 | 显示全部楼层
回复【楼主位】似水彪心:
---------------------------------
读点函数需要做修改。
应该是RGB/BGR转化的问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2012-12-31 20:02:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,其他涉及lcd的实验和实验23 S2鼠标实验都正常,能否说明我的硬件连接没问题?

我参考了论坛网友的程序改了http://www.openedv.com/posts/list/9236.htm,但改后的程序是画蓝线带点红。原来的程序就不会。

据我观察,问题是这样的,假如我一直按下左键乱画一些蓝色的线,一松开移动鼠标,蓝色的线就会被擦掉,显示白色光标的区域,这个问题还是读点函数问题吗?

给我的感觉好像是清除光标的同时将我画的东西也清除了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-31 21:31:19 | 显示全部楼层
回复【3楼】似水彪心:
---------------------------------
你先测试读点函数正常不。
测试办法:任意位置画一个指定颜色的点,然后读取这个点的颜色,看看你读到的和写进去的是不是一致。
一般测试R/G/B三色,就可以确定你的读点函数有无问题。 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2012-12-31 22:59:17 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
测试程序可以像下面这样写吗?   好奔溃啊。怎么串口那里读回来点的颜色的值都是0, 红绿蓝我都试了,都是0。我插回您开发板的液晶,也是0。我是在您开发板光盘的程序上写测试程序的。

int main(void)
{
u16 t;
Stm32_Clock_Init(9); // 系统时钟设置
delay_init(72); // 延时初始化 
uart_init(72,9600); // 串口初始化
LED_Init();
LCD_Init();
while(1)
{
POINT_COLOR=GREEN;  
LCD_DrawPoint(0x0010,0x0010);
t=LCD_ReadPoint(0x0010,0x0010);
printf("%d\n",t);
}
}

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-12-31 23:30:14 | 显示全部楼层
0就有问题了,呵呵.
GREEN不是0呢.

用我们的usmart调试吧,你这样太蛋疼了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2012-12-31 23:40:47 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
很感谢您的耐心回答。板还是您的板,液晶用回了您的液晶,综合程序,鼠标画板是正常的。就不知为啥GREEN在串口上读到的是0,好吧,我试一下usmart调试吧。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2013-1-1 16:17:20 | 显示全部楼层

回复【6楼】正点原子:
---------------------------------
上面的测试程序我写错了,%d 应改为 %x。 

我在综合程序那里移植了USMART ,在丁丁软件SSCOM 3.3上调试读点函数,打印出来的红绿蓝信息如下:红:f800 绿:7e0 蓝:1f,还测了其他点,结果是写进去点的颜色和读出来点的颜色是一样的。这应该可以
说明我的读点函数没错吧。但我用回5408驱动的液晶,鼠标画板的问题还是搞不定。


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-1 17:59:38 | 显示全部楼层
回复【8楼】似水彪心:
---------------------------------
颜色读取正常了。
你5408的液晶,读取也是正常的是吧? 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2013-1-1 18:09:40 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
是的,其实鼠标画板的每个功能基本上可以实现的,就是不知为什么我什么都不按的时候,液晶上的光标就会擦除我所画的东西。

例如,我右击,出现颜色板,稍微移动鼠标,也会擦除,要不移动鼠标,定住点击颜色板(未被擦除的部分),才可取色。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-1 18:15:01 | 显示全部楼层
是不是快速读取颜色的时候,还存在问题。
加入一点延时看看吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2013-1-1 18:19:56 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
好的,我试一下
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2013-1-1 22:23:13 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,我在一楼放了个图,你看一下,有图好说明一点。我在下面的函数中的快速IO那里面加了点us延时,没多大影响,问题依旧。

//读取个某点的颜色值  
//x:0~239
//y:0~319
//返回值:此点的颜色
u16 LCD_ReadPoint(u16 x,u16 y)

//(x,y):设置光标的位置
//color:光标的颜色
//如果为白色,则为标准光标
void Set_Cursor(u16 x,u16 y)

我的好像是鼠标经过之前,鼠标内部便画一个白色的鼠标区域,将我的东西以区域的方式擦除,而不是点擦除,这个问题会不会是这两个函数的问题。这两个函数我有的地方看不懂,不懂之处我也加在了一楼。

//清除光标
//用于清除最近一次的光标
//(x,y)一般就是(MY_Cursor.X,MY_Cursor.Y)     
void Clear_Cursor(u16 x,u16 y)


我将函数Set_Cursor 稍微修改了一下,

我将此句:else OINT_COLOR=in_color;//内部
改为:else OINT_COLOR=LCD_ReadPoint(x,y);

void Set_Cursor(u16 x,u16 y)
{
u16 y0=y;
u8 t,t1,temp,temp1;   
u16 out_color,in_color;  
u8 rccnt=0;//读取到的颜色计数器

out_color=in_color=MY_Cursor.Color;
if(MY_Cursor.Color==WHITE)out_color=BLACK;//如果为白色,则为标准光标 
MY_Cursor.STA|=0X01;//标记开始
MY_Cursor.X=x;//记录此次坐标
MY_Cursor.Y=y;   
POINT_COLOR=MY_Cursor.Color;
BACK_COLOR=WHITE;
    for(t=0;t<36;t++)
    {       
    temp=std_cur_tab[t]; //得到数据 
temp1=std_cur_msk[t];//得到掩码数据                         
        for(t1=0;t1<8;t1++)
{
if(temp1&0x80)
{
if(temp&0x80)POINT_COLOR=out_color;//边框


//              else OINT_COLOR=in_color;//内部
else OINT_COLOR=LCD_ReadPoint(x,y);   //我修改的地方


 
cur_buf[rccnt]=LCD_ReadPoint(x,y);//读取当前点的颜色值 
rccnt++;
if(y<320)LCD_DrawPoint(x,y);//LCD_DrawPoint函数没有判断范围,这里我们需外部判断
  }//透明区域,不画出来     
temp<<=1;
temp1<<=1;
y++;   
if((y-y0)==20)
{
y=y0;
x++;
if(x>=LCD_W)return;//X轴方向 越界
break;
}
}    
}   
}


发现鼠标透明了,只有黑色的外框,算是不会擦除了。但是鼠标的黑色外框不是全封闭的,左边是全黑,右边
和下边可以看到一些很细很细的白点,也就是右边和下边的黑色外框不是连续的。
我很想知道以下光标的数据怎么得到的?

//标准光标
//12*20大小
const u8 std_cur_tab[36]=
{0xFF,0xFF,0x00,0x80,0x02,0x00,0x40,0x04,0x00,
 0x20,0x08,0x00,0x10,0x18,0x00,0x08,0x06,0x00,
 0x04,0x01,0x80,0x02,0x38,0x60,0x01,0x26,0x10,
 0x00,0xA1,0x90,0x00,0x60,0x60,0x00,0x20,0x00};
//标准光标掩码
const u8 std_cur_msk[36]=
{0xFF,0xFF,0x00,0xFF,0xFE,0x00,0x7F,0xFC,0x00,
 0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x0F,0xFE,0x00,
 0x07,0xFF,0x80,0x03,0xFF,0xE0,0x01,0xE7,0xF0,
 0x00,0xE1,0xF0,0x00,0x60,0x60,0x00,0x20,0x00};



回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-26
在线时间
0 小时
 楼主| 发表于 2013-1-1 22:27:15 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,还是有点问题的。因为鼠标黑色外框不是全封闭的,所以右边和下边还是会擦除东西,左边就不会,所以我很想知道标准光标和标准光标掩码的数据怎么得到到?好让鼠标外框全封闭。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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