紧急求助:MSP430G2553 液晶显示图像的问题

金字塔7号   2012-8-27 10:54 楼主
我们最近在用液晶显示特定的波形,但这需要回读,从液晶(ST7920控制器)资料上看到可以读取DDRAM和GDRAM中的数据,但是没有成功,
由于我们用的是绘图方式,所以需要读取GDRAM中的数据,小弟这里有个网上下的程序,但不太清楚具体的含义,并且回读也试不通,求大侠指教,不胜感激!
由于IO口较少,故用串行模式。

整个程序中用于读数据的部分:
uchar ReadByte(void)
{
uchar i,temp;
//P1DIR&=~BIT1;
CS1;
for(i=0;i<8;i++)
    {
  temp=temp<<1;
     SCLK1;
     SCLK0;
delay_ms(5);
     if(P1IN&0x02) temp++;
    }
//P1DIR|=BIT1;
return temp;
}


uchar Read_dos(uchar mode)
{
   uchar temp,temp1,temp2;
   sendbyte(mode);
   //write_com(mode);
   delay_ms(5);
   temp1=ReadByte();
   delay_ms(1);
   temp2=ReadByte();
   delay_ms(1);
   temp2>>=4;
   temp2&=0x0f;   //屏蔽高四位
   temp1&=0xf0;   //屏蔽低四位
   temp=temp1 | temp2;
   return(temp);
}



整个程序(打点没有问题,但是不能回读):

#include
#define uchar unsigned char
#define CS1   P1OUT |= BIT0   //串行LCD宏定义
#define CS0   P1OUT &=~BIT0
#define SID1  P1OUT |= BIT1
#define SID0  P1OUT &=~BIT1
#define SCLK1 P1OUT |= BIT2
#define SCLK0 P1OUT &=~BIT2
#define RST1  P1OUT |= BIT3
#define RST0  P1OUT &=~BIT3
//#define PSB0   P2OUT |= BIT4
//#define PSB1   P2OUT &=~BIT4
//函数声明
void InitSys();
void delay_ms(unsigned int);
void display_strings(void);
void displaydot(unsigned char x0,unsigned char y0 );
void lcdinit(void);
void clrgdram(void);
void write_com(unsigned char);
void write_data(unsigned char);
void sendbyte(unsigned char);
uchar ReadByte(void);
uchar Read_dos(uchar mode);
int  flag=1;
char row1[]={"液晶显示屏12864 "};
char row2[]={"串行静态显示模式"};
char row3[]={"430LaunchpadBord"};
char row4[]={"只需四个IO口即可"};
char num[]={"0123456789"};
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
InitSys(); //初始化
//display_strings(); //写入液晶中静态显示部分数据
//delay_ms(2000);
clrgdram();
uchar n=0;
for(;;)
{
  displaydot(n,16);
  n++;
  while(n==128)n=0;
}
// displaydot(100,50);
// displaydot(30,51);
// displaydot(30,52);
// displaydot(30,53);
//displaydot(30,54);
}
/*****************************************************************************
系统初始化
******************************************************************************/
void InitSys()
{
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
    while(1);                               // If calibration constants erased
                                            // do not load, trap CPU!!
}
BCSCTL1 = CALBC1_8MHZ;                    // 设定工作频率为8M
DCOCTL  = CALDCO_8MHZ;                    // Set DCO step + modulation
P1DIR=0x1f;
lcdinit();  //LCD初始化
}
//毫秒级延时
void delay_ms(unsigned int nValue)//delay 1ms at 8M
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1980;
for(ii = nValue;ii > 0;ii--)
{
   for(jj = nCount;jj > 0;jj--)
   _NOP();
}
}
//液晶初始化
void lcdinit()
{
RST0;
delay_ms(10);
RST1;
delay_ms(200);
write_com(0x30);  //功能设定:基本指令集
delay_ms(5);
write_com(0x0c);  //显示状态:整体显示,游标关
delay_ms(5);
write_com(0x01);  //清空显示
delay_ms(5);
}
//读一个字节
uchar ReadByte(void)
{
uchar i,temp;
//P1DIR&=~BIT1;
CS1;
for(i=0;i<8;i++)
    {
  temp=temp<<1;
     SCLK1;
     SCLK0;
delay_ms(5);
     if(P1IN&0x02) temp++;
    }
//P1DIR|=BIT1;
return temp;
}
//发送1字节数据
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
   if((zdata << i) & 0x80)
   {
    SID1;
   }
   else
   {
    SID0;
   }
   SCLK0;
   SCLK1;
}
}
//写命令
void write_com(unsigned char cmdcode)
{
CS1;
sendbyte(0xf8);   //1 1 1 1 RS RW 0   写操作RW=0 11111000写数据 11111010写指令
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay_ms(1);
CS0;
}
//写数据
void write_data(unsigned char Dispdata)
{
CS1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay_ms(1);
CS0;
}
//读一字节数据或状态函数:Read_dos(unsigned char mode)
uchar Read_dos(uchar mode)
{
   uchar temp,temp1,temp2;
   sendbyte(mode);
   //write_com(mode);
   delay_ms(5);
   temp1=ReadByte();
   delay_ms(1);
   temp2=ReadByte();
   delay_ms(1);
   temp2>>=4;
   temp2&=0x0f;   //屏蔽高四位
   temp1&=0xf0;   //屏蔽低四位
   temp=temp1 | temp2;
   return(temp);
}
/****************************************/
void display_strings()
{
unsigned int i;
delay_ms(20);
write_com(0x80);            //第1行
for(i=0;i<16;i++)
{
    write_data(row1);
    delay_ms(1);
}
}
/*write_com(0x90);           //第2行
for(i=0;i<16;i++)
{
    write_data(row2);
    delay_ms(1);
}
write_com(0x88);           //第3行
for(i=0;i<16;i++)
{
   write_data(row3);
   delay_ms(1);
}
write_com(0x98);           //第4行
for(i=0;i<16;i++)
{
    write_data(row4);
    delay_ms(1);
}
}*/
//清整个GDRAM空间
void clrgdram(void)
{
    unsigned char x,y;
    for(y=0;y<64;y++)
     for(x=0;x<16;x++)
     {
     write_com(0x34);
     write_com(y+0x80);     //行地址
     write_com(x+0x80);     //列地址
     write_com(0x30);
     write_data(0x00);
     write_data(0x00);
     }
}
//***********************************************************************************
//0,0---------------------127,0
//0,63-------------------127,63坐标
//(打点)打点位置的定位
//根据Datesheet需先把数据写到GDRAM,读取当前位置的数据,
//经过或和移位后再把数据重新写入
//***********************************************************************************
void displaydot(unsigned char x0,unsigned char y0 )//在任意位置画点输入范围x0-127  y 0-63
{
   unsigned char x,y,xb,yb,GDRAM_hbit,GDRAM_lbit;   // X,Y坐标互换,即普通的X,Y坐标
     x=x0/16;                     //定义列地址的字节位,及在字节中的哪1位
     y=y0&0x1f;                   //计算在0~31当中的哪一行
     yb=y0/32;                    //0为上半屏,1为下半屏
     xb=x0&0x0f;                  //计算在该字节16bit中的哪一位
     write_com(0x34);          //打开扩展指令集
     write_com(0x36);          //打开绘图显示
     write_com(y+0x80);        //写行地址Y坐标
     write_com(x+0x80+yb*8);   //写列地址X坐标通过8*yb选定上下屏,每行8*16=128
     ReadByte();                  //当前地址读,第一次虚读
     //GDRAM_hbit=Read_dos(0x30);      //读取当前显示高8位数据
     //GDRAM_lbit=Read_dos(0x30);      //读取当前显示低8位数据
     GDRAM_hbit=ReadByte();       //读取当前显示高8位数据
     GDRAM_lbit=ReadByte();       //读取当前显示低8位数据
     write_com(y+0x80);        //写行地址
     write_com(x+0x80+yb*8);   //写列地址
     if(xb<8)                     //判断其在高8位,还是在低8位
        {
      write_data(GDRAM_hbit|(0x01<<(7-xb)));  //显示GDRAM区高8位数据
      write_data(GDRAM_lbit);                 //显示GDRAM区低8位数据
      //write_data((0x01<<(7-xb)));
        }
     else
        {
        //write_data(0x01);
        write_data(GDRAM_hbit);
        write_data(GDRAM_lbit|(0x01<<(15-xb)));
      //write_data((0x01<<(15-xb)));
        }
     write_com(0x30);
}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复