TI中文支持网
TI专业的中文技术问题搜集分享网站

关于MSP430F5529 pocket kit电子墨水屏

您好!
我在做MSP430F5529LP与MSP430F5529 POCKET KIT中的电子墨水屏实验中,遇到如下问题:
能将初始化程序中电子墨水屏上显示内容擦除,但无法重新调用display函数。目前还未发现问题出在哪里,请教论坛上的朋友。
谢谢!

/****************************main文件************************************/
#include <msp430.h> #include "Paper_Display.h" #define TimesNewRoman 0 #define Arial 1 #define ArialBlack 2 #define size8 0 #define size16 1 volatile unsigned char DisBuffer[250*16]; void initClock() {UCSCTL6 &= ~XT1OFF; //启动XT1P5SEL |= BIT2 + BIT3; //XT2引脚功能选择UCSCTL6 &= ~XT2OFF;//打开XT2__bis_SR_register(SCG0);UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;UCSCTL1 = DCORSEL_4;//DCO频率范围在28.2MHZ以下UCSCTL2 = FLLD_5 + 1;//D=16,N=1UCSCTL3 = SELREF_5 + FLLREFDIV_3;//n=8,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);DCOCLKDIV=(N+1)*(FLLREFCLK/n);UCSCTL4 = SELA_4 + SELS_3 +SELM_3;//ACLK的时钟源为DCOCLKDIV,MCLK\SMCLK的时钟源为DCOCLKUCSCTL5 = DIVA_5 +DIVS_1;//ACLK由DCOCLKDIV的32分频得到,SMCLK由DCOCLK的2分频得到//最终MCLK:16MHZ,SMCLK:8MHZ,ACLK:32KHZ // __bic_SR_register(SCG0);//Enable the FLL control loop } int main(void) { int i=180;WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timerP8DIR |= BIT1;P8OUT &=~ BIT1;initClock();PaperIO_Int();INIT_SSD1673();Init_buff();display("Hello", 42, 0,TimesNewRoman,size8,1,0);display("E-INK", 42, 16,TimesNewRoman,size8,0,0);while(1){} }





/****************************Paper_Display.h文件************************************/
#include <msp430.h>

#define nRST_H    P1OUT|=BIT4
#define nRST_L    P1OUT&=~BIT4
#define nCS_H    P3OUT|=BIT2
#define nCS_L    P3OUT&=~BIT2
#define SDA_H    P3OUT|=BIT3
#define SDA_L    P3OUT&=~BIT3
#define SCLK_H   P2OUT|=BIT7
#define SCLK_L   P2OUT&=~BIT7
#define nDC_H     P3OUT|=BIT4
#define nDC_L     P3OUT&=~BIT4
#define nBUSY    P2IN & BIT2

extern volatile unsigned char DisBuffer[250*16];

void SPI4W_WRITECOM(unsigned char INIT_COM);
void SPI4W_WRITEDATA(unsigned char INIT_DATA);
void SPI4W_WRITE(unsigned char INIT_COM,unsigned char INIT_DATA);
void MYRESET(void);
void WRITE_LUT(void);
void INIT_SSD1673(void);
void DIS_IMG(unsigned char num);
void FIRST_PICTURE(void);
void IMAGE_WRITE(unsigned char patt_num);
void DELAY_100nS(unsigned int delaytime);
void DELAY_mS(unsigned int delaytime);
void DELAY_S(unsigned int delaytime);
void DELAY_M(unsigned int delaytime);
void RING(void);
void READBUSY(void);
void closebump(void);
void DisplayString(const char* str, unsigned int sx, unsigned int sy);
void enterdeepsleep(void);
void Init_buff(void);
void SET_EYEONE(void);
void PaperIO_Int(void);
void display(unsigned char *str, //字符串
             unsigned int xsize,  //x方向位置
             unsigned int ysize,  //y方向位置
             unsigned int font,   //字体 0,1,2
             unsigned int size,   //字号 0,1
             unsigned int reverse,//反显 0 正常显示, 1 反显
             unsigned int fresh   //立即刷新
             );

 


/****************************Paper_Display.c文件************************************/
#include <msp430.h>
#include "Include.h"
#include "Paper_Display.h"

#define DELAY_TIME    50    // 图片显示完停留时间(单位:秒)
// 测试图
#define PIC_WHITE                   255  // 全白
#define PIC_BLACK                   254  // 全黑
#define PIC_Orientation             253  // 方向图
#define PIC_LEFT_BLACK_RIGHT_WHITE  249  // 左黑右白
#define PIC_UP_BLACK_DOWN_WHITE     248  // 上黑下白

const unsigned char init_data[]={
        0x50,0xAA,0x55,0xAA,0x55,0xAA,0x11,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,
        0x0F,0x0F,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,

};

void MyRESET()
{
    nRST_L;
    DELAY_mS(10);//1ms
     nRST_H;
      DELAY_mS(10);//1ms
}
void DELAY_100nS(unsigned int delaytime)   // 30us
{
    int i,j;
    for(i=0;i<delaytime;i++)
        for(j=0;j<10;j++);
}

void DELAY_mS(unsigned int delaytime)        // 1ms
{
    int i;
    for(i=0;i<delaytime;i++)
        __delay_cycles(200);
}
void DELAY_S(unsigned int delaytime)     //  1s
{
    int i;
    for(i=0;i<delaytime;i++)
        {
        __delay_cycles(3276);
        }
}
void DELAY_M(unsigned int delaytime)     //  1M
{
    int i;
    for(i=0;i<delaytime;i++)
        DELAY_S(60);
}
void READBUSY()
{
  while(1)
  {     //=1 BUSY
     if((P2IN & BIT2)==0)
         break;
  }
  DELAY_M(2);
}
void FIRST_PICTURE()
{
    SPI4W_WRITECOM(0x21);
     SPI4W_WRITEDATA(0x83);
    SPI4W_WRITECOM(0x22);
     SPI4W_WRITEDATA(0xC4);
}
void INIT_SSD1673()
{
    MyRESET();
    READBUSY();
    SPI4W_WRITECOM(0x01);       // Gate Setting
    SPI4W_WRITEDATA(0xF9);    // MUX Gate lines=250-1=249(F9H)
    SPI4W_WRITEDATA(0x00);    // B[2]:GD=0[POR](G0 is the 1st gate output channel)  B[1]:SM=0[POR](left and right gate interlaced)  B[0]:TB=0[POR](scan from G0 to G319)
    SPI4W_WRITECOM(0x3A);       // number of dummy line period   set dummy line for 50Hz frame freq
    SPI4W_WRITEDATA(0x06);    // Set 50Hz   A[6:0]=06h[POR] Number of dummy line period in term of TGate
    SPI4W_WRITECOM(0x3B);       // Gate line width   set gate line for 50Hz frame freq
    SPI4W_WRITEDATA(0x0B);    // A[3:0]=1011(78us)  Line width in us   78us*(250+6)=19968us=19.968ms
    SPI4W_WRITECOM(0x3C);          // Select border waveform for VBD
    //    SPI4W_WRITEDATA(0x30);    // GS0-->GS0
    //    SPI4W_WRITEDATA(0x31);    // GS0-->GS1
    //    SPI4W_WRITEDATA(0x32);    // GS1-->GS0
    SPI4W_WRITEDATA(0x33);    // GS1-->GS1  开机第一次刷新Border从白到白
    //    SPI4W_WRITEDATA(0x43);    // VBD-->VSS
    //    SPI4W_WRITEDATA(0x53);    // VBD-->VSH
    //    SPI4W_WRITEDATA(0x63);    // VBD-->VSL
    //    SPI4W_WRITEDATA(0x73);    // VBD-->HiZ

    SPI4W_WRITECOM(0x11);          // Data Entry mode
    SPI4W_WRITEDATA(0x01);    // 01 –Y decrement, X increment
    SPI4W_WRITECOM(0x44);       // set RAM x address start/end, in page 22
    SPI4W_WRITEDATA(0x00);    // RAM x address start at 00h;
    SPI4W_WRITEDATA(0x0f);    // RAM x address end at 0fh(15+1)*8->128    2D13
    SPI4W_WRITECOM(0x45);          // set RAM y address start/end, in page 22
    SPI4W_WRITEDATA(0xF9);    // RAM y address start at FAh-1;            2D13
    SPI4W_WRITEDATA(0x00);    // RAM y address end at 00h;            2D13

    SPI4W_WRITECOM(0x2C);       // Vcom= *(-0.02)+0.01???
    //    SPI4W_WRITEDATA(0x82);    //-2.5V
    //    SPI4W_WRITEDATA(0x69);    //-2V
    SPI4W_WRITEDATA(0x4B);    //-1.4V
    //    SPI4W_WRITEDATA(0x50);    //-1.5V
    //    SPI4W_WRITEDATA(0x37);    //-1V
    //    SPI4W_WRITEDATA(0x1E);    //-0.5V

    WRITE_LUT();
    SPI4W_WRITECOM(0x21);       // Option for Display Update
    SPI4W_WRITEDATA(0x83);    // A[7]=1(Enable bypass)  A[4]=0全黑(value will be used as for bypass)
    DIS_IMG(PIC_WHITE);         // 全黑到全白清屏,这样可防止开机出现花屏的问题

    SPI4W_WRITECOM(0x21);       //
    SPI4W_WRITEDATA(0x03);    // 后面刷新恢复正常的前后2幅图比较
    SPI4W_WRITECOM(0x3C);       // Select border waveform for VBD
    SPI4W_WRITEDATA(0x73);    // VBD-->HiZ  后面刷新时Border都是高阻

}

void WRITE_LUT()
{
    unsigned char i;
    SPI4W_WRITECOM(0x32);//write LUT register
    for(i=0;i<29;i++)
        SPI4W_WRITEDATA(init_data[i]);//write LUT register
}

void Init_buff(void)
{
    int i;
    for(i=0;i<4000;i++)
    {
        DisBuffer[i]=gImage_logo[i];
    }

}

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xx   图片显示函数    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void DIS_IMG(unsigned char num)
{
  unsigned int row, col;
  unsigned int pcnt;


  SPI4W_WRITECOM(0x4E);
  SPI4W_WRITEDATA(0x00);  // set RAM x address count to 0;
  SPI4W_WRITECOM(0x4F);
  SPI4W_WRITEDATA(0xF9);  // set RAM y address count to 250-1;    2D13
  DELAY_S(5);
  SPI4W_WRITECOM(0x24);
  DELAY_S(5);
  pcnt = 0;                 // 复位或保存提示字节序号
  for(col=0; col<250; col++)   // 总共250 GATE列  // send 128x250bits ram 2D13
  {
    for(row=0; row<16; row++)  // 总共128 SOURCE行,每个像素1bit,即 128/8=16 字节
    {
      switch (num)
      {
        case 1:
          SPI4W_WRITEDATA(DisBuffer[pcnt]);
          break;
        case 2:
          SPI4W_WRITEDATA(gImage_logo[pcnt]);
          break;
        case PIC_WHITE:
          SPI4W_WRITEDATA(0xff);
          break;
          default:
          break;
      }
      pcnt++;
    }
  }
  SPI4W_WRITECOM(0x22);
  SPI4W_WRITEDATA(0xC7);    // (Enable Clock Signal, Enable CP) (Display update,Disable CP,Disable Clock Signal)
  //  SPI4W_WRITEDATA(0xF7);    // (Enable Clock Signal, Enable CP, Load Temperature value, Load LUT) (Display update,Disable CP,Disable Clock Signal)
  SPI4W_WRITECOM(0x20);
  DELAY_mS(1);
  READBUSY();
  DELAY_S(DELAY_TIME);
}

void SetpointXY(unsigned int xs,unsigned int xe,unsigned int ys,unsigned int ye)
{
    SPI4W_WRITECOM(0x44);//set RAM x address start/end, in page 36
    SPI4W_WRITEDATA(xs);//RAM x address start at 00h;
    SPI4W_WRITEDATA(xe);//RAM x address end at 11h(17)->72: [because 1F(31)->128 and 12(18)->76]

    SPI4W_WRITECOM(0x45);//set RAM y address start/end, in page 37
    SPI4W_WRITEDATA(ys);//RAM y address start at 00h;
    SPI4W_WRITEDATA(ye);//RAM y address start at ABh(171)->172: [because B3(179)->180]

    SPI4W_WRITECOM(0x4E);//set RAM x address count to 0;
    SPI4W_WRITEDATA(xs);
    SPI4W_WRITECOM(0x4F);//set RAM y address count to 0;
    SPI4W_WRITEDATA(ye);

    SPI4W_WRITECOM(0x24);
}

void enterdeepsleep()
{
  SPI4W_WRITECOM(0x10);
  SPI4W_WRITEDATA(0x01);
}

void SPI4W_WRITECOM(unsigned char INIT_COM)
{
    unsigned char TEMPCOM;
    unsigned char scnt;
    TEMPCOM=INIT_COM;
    nCS_H;
    nCS_L;
    SCLK_L;
    nDC_L;
    for(scnt=0;scnt<8;scnt++)
    {
        if(TEMPCOM&0x80)
            SDA_H;
        else
            SDA_L;
        DELAY_100nS(10);
        SCLK_H;
        DELAY_100nS(10);
        SCLK_L;
        TEMPCOM=TEMPCOM<<1;
        DELAY_100nS(10);
    }
    nCS_H;
}

void SPI4W_WRITEDATA(unsigned char INIT_DATA)
{
    unsigned char TEMPCOM;
    unsigned char scnt;
    TEMPCOM=INIT_DATA;
    nCS_H;
    nCS_L;
    SCLK_L;
    nDC_H;
    for(scnt=0;scnt<8;scnt++)
    {
        if(TEMPCOM&0x80)
            SDA_H;
        else
            SDA_L;
        DELAY_100nS(10);
        SCLK_H;
        DELAY_100nS(10);
        SCLK_L;
        TEMPCOM=TEMPCOM<<1;
        DELAY_100nS(10);
    }
    nCS_H;
}

unsigned char FontSize[]={16,32};
void display(unsigned char *str, //字符串
             unsigned int xsize,  //x方向位置
             unsigned int ysize,  //y方向位置
             unsigned int font,   //字体 0,1,2
             unsigned int size,   //字号 0,1
             unsigned int reverse,//反显 0 正常显示, 1 反显
             unsigned int fresh   //立即刷新
             )
{
    unsigned char i,j,k;
    unsigned char *zimoPoint;
    unsigned char zimoW;
    unsigned char zimoH;
    unsigned char moveBytes;  //移动字节数
    unsigned char moveBits;   //移动位数
    volatile unsigned char zimoBufferTemp[6];

    zimoW=FontSize[size]/2;      //x向行数
    zimoH=FontSize[size]/8;      //y向字节数

    moveBits=ysize%8;
    if((moveBits)!=0) //非完整字节处理
    {
        moveBytes=zimoH+1;
    }
    else  moveBytes=zimoH;

    while(*str)
    {
       if((font==TimesNewRoman) && (size==size8)) zimoPoint=(unsigned char *)&TimesNewRoman8;
       else if((font==TimesNewRoman) && (size==size16)) zimoPoint=(unsigned char *)&TimesNewRoman16;
       zimoPoint=zimoPoint+((*str)-0x20)*zimoW*zimoH;     //指向字符字模的开始地址。
       for(i=0;i<zimoW;i++)
       {
            //读出字模一列数据
            for(j=0;j<6;j++) zimoBufferTemp[j]=0;
            if(reverse==0)
            {
                   for(j=0;j<zimoH;j++)
                {
                    zimoBufferTemp[j]=~(*(zimoPoint+i+j*zimoW));
                }
            }
            else
            {
                   for(j=0;j<zimoH;j++)
                {
                    zimoBufferTemp[j]=(*(zimoPoint+i+j*zimoW));
                }
            }
            //字模一列数据移位操作
            if (moveBits==0);
            else
            {
                for(k=0;k<moveBits;k++)
                {
                    for(j=moveBytes;j>0;j--)
                    {
                         zimoBufferTemp[j]=zimoBufferTemp[j]>>1;
                         if ((zimoBufferTemp[j-1]&0x01)>0) zimoBufferTemp[j]=zimoBufferTemp[j]+0x80;
                    }
                    zimoBufferTemp[0]=zimoBufferTemp[0]>>1;
                }
            }
            //DisBuffer处理
            if (moveBits==0);
            else
            {
                k=(0xff>>moveBits);
                zimoBufferTemp[moveBytes-1]=zimoBufferTemp[moveBytes-1] | (DisBuffer[(xsize+i)*16+((ysize/8)+zimoH)] & k);
                k=~k;
                zimoBufferTemp[0]=zimoBufferTemp[0] | (DisBuffer[(xsize+i)*16+(ysize/8)] & k);

            }
            //更新 DisBuffer
            for(j=0;j<moveBytes;j++)
            {
                DisBuffer[(xsize+i)*16+((ysize/8)+j)]=zimoBufferTemp[j];
            }
       }
       xsize=xsize+zimoW;
       str++;
    }

}

void PaperIO_Int(void)
{
    P1DIR |= BIT4;
    P2DIR |= BIT7;
    P2DIR &= ~BIT2;
    P3DIR |= BIT2 + BIT3 + BIT4;

}





灰小子:

楼主,你好。你的代码都隐藏一起了,没法看。建议重新编辑一下。

另外,大段的代码,很少有人能有时间看完的。

建议直接针对问题来描述和分析。你说“无法重新调用display函数”,有什么现象和提示信息?

bush rose:

回复 灰小子:

我说的的确不合适,谢谢您的建议。等下我再上传我使用的文件代码重新说明。

赞(0)
未经允许不得转载:TI中文支持网 » 关于MSP430F5529 pocket kit电子墨水屏
分享到: 更多 (0)