OpenEdv-开源电子网

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

正点原子7寸屏V1.8版连续写入像素数据出错

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-12-2
在线时间
0 小时
发表于 2015-12-2 17:42:46 | 显示全部楼层 |阅读模式
5金钱
     正点原子7寸液晶屏V1.8版(与V1版除了触屏接口有点改动外,其他没变),在以连续模式写入数据时出现头几个像素点与后面的像素点在颜色上有很大反差,主要是体现在红色和白色时是这样。
    举个例子:我要以红色刷屏,我设定起始坐标 CUR_Y=0,CUR_X=0;自动折返点END_X =799;然后我往其像素数据寄存器PIXEL连续写入0xf800(红色),头几个点(约10个像素左右)亮度叫大,后续的数据偏暗。在使用白色刷屏时依然如此。
   然而,我采用单独写入的方式时颜色是正常的。即我每一次写入数据前都对CUR_Y、CUR_XEND_X这几个寄存器重新设定。

另外,测试视频如下:
http://v.youku.com/v_show/id_XMTM4ODIwNDczNg==.html

    好了,直接上图。

下面是图片重复显示,图像的背景本是白色,但是由于是连续写入,背景有些偏蓝

下图当中的背景为白色的图片显示采用的是非连续方式,很显然这才是正常的数据。



好了,直接上STC90C516代码:
const unsigned char code gImage_pic2[13720] = { /* 0X00,0X10,0X46,0X00,0X62,0X00,0X01,0X1B, */
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,0X18,0XC6,
}
上面是图片数据,由于太多页面装不下所以只上一部分数据。

下面是51单片机源代码,供大家学习交流只用,完全自编:
#include<reg52.h>
#include"pic2.h"
#define CUR_Y 0X0000
#define CUR_X 0X0001
#define PIXEL 0X0002
#define END_X 0X0003
#define NONE0 0X0004
#define PREF  0X0005
#define NONE1 0X0006
#define MIRRO 0X0007
#define data0 P0
#define Addr0 P0
#define data1 P1
#define Addr1 P1
sbit NEC=P2^0;
sbit RS =P2^1;
//sbit WR =P3^6;
//sbit RD =P3^7;
sbit RST=P2^4;

sbit MISO=P2^5;
sbit MISI=P2^6;
sbit PEN =P2^7;
/****************************/
/*Basic function            */
/****************************/
void nop(void)
{
int time=1;
while(time--);
}
void delay(long int time)
{
while(time--)
{
nop();
}
}
/******************************/
/*Function:Reset the LCD      */
/******************************/
void RstLCD(void)
{
RST=0;
nop();
nop();
nop();
nop();
nop();
nop();
nop();
RST=1;
while((data0&0X01)!=0X01);
}
/******************************/
/*Function:Write address      */
/******************************/
void WriteAddressLCD( int com)
{
WR=1;
NEC=0;
RD=1;
RS=0;
Addr0=(unsigned char)(0x00ff&com);
Addr1=(unsigned char)((0xff00&com)>>8);
nop();
WR=0;
  nop();
WR=1;
NEC=1;
}
/******************************/
/*Function:Write data         */
/******************************/
void WriteDataLCD( int Data)
{
WR=1;
NEC=0;
RD=1;
RS=1;
Addr1=( char)((Data&0xff00)>>8);
Addr0=( char)(Data&0x00ff);
  nop();
WR=0;
nop();
WR=1;
NEC=1;
}

/************************************/
/*Function:Set operate page, display*/
/*page, light degeray               */
/************************************/
void SetBasicParameterLCD(int OperatPage,int DisplayPage,int Light)
{
unsigned Temp;
Temp=DisplayPage<<9|OperatPage<<12|Light;
WriteAddressLCD(PREF);
WriteDataLCD(Temp);
}
/*********************************/
/*Function:Set the display zone  */
/*********************************/
void SetZone(int X,int Y,int Turn)
{
WriteAddressLCD(CUR_X);
WriteDataLCD(X);
WriteAddressLCD(CUR_Y);
WriteDataLCD(Y);
WriteAddressLCD(END_X);
WriteDataLCD(Turn);
}


int ReadPixelDataLCD(void)
{
int temp0,temp1,temp;

char temp00;
WR=1;
RS=0;
nop();
NEC=0;
RD=1;
nop();
RD=0;
nop();
do
{
temp00=P0;
//temp1=P1;

}while((temp00&0x01)!=0x01);
RD=1;
//WR=1;
nop();
//RD=1;
//nop();
//NEC=0;
//nop();
RS=1;
nop();
RD=0;
nop();
temp0=data0;
temp1=data1;
nop();
RD=1;
temp=temp1<<8|temp0;
NEC=1;
return temp;
}
/*********************************/
/*Funtion:Read the pixel data for*/
/*continuously                   */
/*********************************/
char *ReadPictue(int StartX,int StartY,int EndX,int wideX,int highY,char *counst)
{
int x,y,temp0,temp1,*address;
char temp00;
address=counst;
SetZone(StartX,StartY,EndX);

for(y=0;y<highY;y++)
{
for(x=0;x<wideX*2;x=x+2)
{
/*************************************/
WR=1; //Check
RS=0; //whether
nop(); //if
NEC=0; //LCD
RD=1; //is
nop(); //busy
RD=0; //or
nop(); //not
do //
{ //
temp00=P0; //
//temp1=P1; //
}while((temp00&0x01)!=0x01); //
RD=1; //
RS=1; //
/*************************************/
RD=0;
nop();
temp0=data0;
temp1=data1;
nop();
RD=1;
//counst=counst+x+y;
counst[x+y]=temp0;
//counst=counst+1;
counst[x+y+1]=temp1;
}
}
NEC=1;
return address;
}

/*********************************/
/*Function:Brush the screen      */
/*********************************/
void BrushLCD(int OperatPage,int DisplayPage,int Light,int color)
{
long int i;
SetBasicParameterLCD(OperatPage,DisplayPage,Light);
SetZone(0,0,799);
WriteAddressLCD(PIXEL);
WR=1;
NEC=0;
RD=1;
RS=1;
//P0=0XFF;
//while((P0&0x01)!=0x01);
Addr1=(char)((color&0xff00)>>8);
Addr0=(char)( color&0x00ff)    ;
for(i=0;i<384000;i++)
{
nop();
WR=0;
nop();
WR=1;
}
WR=1;
NEC=1;
}

/*********************************/
/*Functionisplay a picture     */
/*which is wideX multiply highY  */
/*********************************/
void PictureLCD( int OperatPage,int DisplayPage,int Light,char *pic,long int wideX,long int highY,int x,int y)
{
long int i;
unsigned int p;
SetBasicParameterLCD(OperatPage, DisplayPage, Light);
WriteAddressLCD(CUR_X);
WriteDataLCD(x);
WriteAddressLCD(CUR_Y);
WriteDataLCD(y);
WriteAddressLCD(END_X);
WriteDataLCD(x+wideX-1);
WriteAddressLCD(PIXEL);
for(i=0;i<wideX*highY*2;i=i+2)
{
p=pic[i+1]<<8|pic;
WriteDataLCD(p);
}
}

void main(void)
{
long int i,j,k;
int da;
char ta[140],*ad;
delay(10);
delay(10);
RstLCD();
for(k=0;k<4;k++)
{
PictureLCD(0,0,0x003f,gImage_pic2,70,100,0,k*100);
for(j=1;j<11;j++)
{
for(i=0;i<100;i++)
{
ad=ReadPictue(0,k*100+i,70,70,1,ta);
PictureLCD(0,0,0x003f,ad,70,1,j*70,k*100+i);
}
}
}
delay(100000);
for(j=0;j<100;j++)
{
for(i=0;i<70;i++)
{
SetZone(i,j,70);
da=ReadPixelDataLCD();
SetZone(80+i,j,80+70);
WriteAddressLCD(PIXEL);
WriteDataLCD(da);
}
}
delay(100000);
SetBasicParameterLCD(0,1,0x003f);

WriteAddressLCD(MIRRO);
delay(10000);
WriteDataLCD(2);
delay(10000);
WriteDataLCD(3);
delay(10000);
WriteDataLCD(0);
delay(10000);
WriteDataLCD(1);
BrushLCD(0x0000,0x0000,0x003f,0xffff);
BrushLCD(0x0000,0x0000,0x003f,0xf800);

BrushLCD(0x0000,0x0000,0x003f,0x001f);
for(j=0;j<100;j++)
{
for(i=0;i<70;i++)
{
SetZone(i,j,70);
da=ReadPixelDataLCD();
SetZone(80+i,j,80+70);
WriteAddressLCD(PIXEL);
WriteDataLCD(da);
}
}
BrushLCD(0x0000,0x0000,0x003f,0x07e0);
BrushLCD(0x0000,0x0000,0x003f,0xf800);
for(j=0;j<100;j++)
{
for(i=0;i<70;i++)
{
SetZone(i,j,70);
da=ReadPixelDataLCD();
SetZone(80+i,j,80+70);
WriteAddressLCD(PIXEL);
WriteDataLCD(da);
}
}
delay(999999);
//1,Red
BrushLCD(0x0001,0x0001,0x003f,0xf801);

for(i=1;i<8;i++)
{
BrushLCD(i,i,0x003f,i*20);
}
while(1)
{
for(i=0;i<8;i++)
{
SetBasicParameterLCD(0,i,0x003f);
delay(100000);
}
}
}

最佳答案

查看完整内容[请看2#楼]

找到问题了,原来是开发板上的P1.7口连接了一块74HC165(并入串出)的输出口导致该IO口一直被拉低,现在撤销了其连接,数据恢复正常了。无论如何,还是谢谢大家的帮助。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 17:42:47 | 显示全部楼层
找到问题了,原来是开发板上的P1.7口连接了一块74HC165(并入串出)的输出口导致该IO口一直被拉低,现在撤销了其连接,数据恢复正常了。无论如何,还是谢谢大家的帮助。
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2015-12-2 19:08:09 | 显示全部楼层
建议你使用测试,杜邦线一根一根连接容易产生干扰

好像视频后期刷红色就没有出现你说的“头几个点(约10个像素左右)亮度叫大”
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-12-2
在线时间
0 小时
 楼主| 发表于 2015-12-2 19:21:13 | 显示全部楼层
回复【2楼】hpeng1874:
---------------------------------
事实上视频后期的颜色值已经不是0xf800了,另外我相信写入的颜色数据绝对是正确的,因为我将写入LCD的图像数据读出一个点来然后采用单独写点的方法在LCD新的区域重现,这样连续读一个写一个,整图片的颜色又恢复正常了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-12-2 22:56:18 | 显示全部楼层
总感觉你这个开发板代码是不是有什么问题。
拿我们的板子试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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