NucleoF446 re + SSD1331 simple Library

Dependents:   Nucleo_446 Nucleo446_SSD1331

ssd1331.cpp

Committer:
kadonotakashi
Date:
2018-10-11
Revision:
1:85198abc3103
Parent:
0:9442efe129e7

File content as of revision 1:85198abc3103:


#include "ssd1331.h"
#include "mbed.h"



/*
    private function
*/

void ssd1331::DataWr(uint8_t data) {
    _dc=1;
    _cs=0;
    _spi.write(data);
    _cs=1;
}

void ssd1331::CmdWr(uint8_t Cmd) {
    _dc=0;
    _cs=0;
    _spi.write(Cmd);
    _cs=1;
}

ssd1331::ssd1331(PinName mosi,PinName miso,PinName sclk,PinName cs,PinName dc,PinName reset) 
    : _spi(mosi,miso,sclk),_cs(cs),_dc(dc),_rst(reset) 
{
    _spi.format(8,3);
    _spi.frequency(500000);
    _cs =1;
    _dc =1;
    _rst =0;
    
    SetFontInf();
}



void ssd1331::Initssd1331()
{
    _cs =1;
    _dc =1;
    _rst =0;
    
    wait_ms(100);
    _rst =1;
    wait_ms(1);
    
    CmdWr(SSD1331_CMD_SetDspOff);
    CmdWr(SSD1331_CMD_SetRemap_DataFormat); CmdWr(0x72);    //A[7:6] = 00; 256 color. A[7:6] = 01; 65k color format
    CmdWr(SSD1331_CMD_SetDspStrtLine);      CmdWr(0x0);     //
    CmdWr(SSD1331_CMD_SetDspOffset);        CmdWr(0x0);     //
    CmdWr(SSD1331_CMD_SetDspModeNorm);
    CmdWr(SSD1331_CMD_SetMltplRatio);       CmdWr(63);      //
    CmdWr(SSD1331_CMD_SetMstrCnfg);         CmdWr(0x8e);    //
    CmdWr(SSD1331_CMD_PowerSave);           CmdWr(0x1A);    //
    CmdWr(SSD1331_CMD_P1_P2_ADJ);           CmdWr(0x74);    //
    CmdWr(SSD1331_CMD_SetDispCLK);          CmdWr(0xf0);    //
    CmdWr(SSD1331_CMD_SetChrgA);            CmdWr(0x81);    //
    CmdWr(SSD1331_CMD_SetChrgB);            CmdWr(0x82);    //
    CmdWr(SSD1331_CMD_SetChrgC);            CmdWr(0x83);    //
    CmdWr(SSD1331_CMD_SetPrChrgV);          CmdWr(0x3A);    //
    CmdWr(SSD1331_CMD_SetVcomhV);           CmdWr(0x3E);    //
    CmdWr(SSD1331_CMD_SetMstrCrrnt);        CmdWr(0x06);    //
    CmdWr(SSD1331_CMD_SetClmAddr);          CmdWr(0);   CmdWr(95);  //
    CmdWr(SSD1331_CMD_SetRawAddr);          CmdWr(0);   CmdWr(63);  //
    CmdWr(SSD1331_CMD_SetCntrstA);          CmdWr(0xff);    //
    CmdWr(SSD1331_CMD_SetCntrstB);          CmdWr(0xff);    //
    CmdWr(SSD1331_CMD_SetCntrstC);          CmdWr(0xfF);    //

    CmdWr(SSD1331_CMD_SetDspOn);            //
    wait_ms(100);    
}

void ssd1331::ClearScreen()
{

    wait_ms(1); //クリアーコマンドは400μs 以上の休止期間が必要かも

    CmdWr(SSD1331_CMD_ClearWindow);
        CmdWr(0);   //X始点
        CmdWr(0);   //Y始点
        CmdWr(WIDTH_1331-1);    //X終点
        CmdWr(HEIGHT_1331-1);   //Y終点

    wait_ms(1); //クリアーコマンドは400μs 以上の休止期間が必要かも
    }


void ssd1331::DrawPix(    uint16_t x, 
                            uint16_t y, 
                            uint16_t color   )
{
    if(x>=WIDTH_1331-1){        return ;    }
    if(y>=HEIGHT_1331-1){   return ;    }

    CmdWr(SSD1331_CMD_SetClmAddr);      CmdWr(x);   CmdWr(x);
    CmdWr(SSD1331_CMD_SetRawAddr);      CmdWr(y);   CmdWr(y);
    DataWr( 0xff & (color>>8) );        DataWr( 0xff & (color) );
    return;

}

void ssd1331::DrawLine( uint8_t xs, 
                        uint8_t ys, 
                        uint8_t xe, 
                        uint8_t ye, 
                        uint16_t color  )
{
    if(xe>=WIDTH_1331-1){   return ;    }
    if(ye>=HEIGHT_1331-1){  return ;    }
    if(xe>=WIDTH_1331-1){   return ;    }
    if(ye>=HEIGHT_1331-1){  return ;    }

    CmdWr(SSD1331_CMD_DrawLine);
        CmdWr(xs);  CmdWr(ys);  CmdWr(xe);  CmdWr(ye);

        //color     R 5bit      bit 15-11
        //          G 6bit      bit 10- 5
        //          B 5bit      bit  4- 0
        CmdWr((color>>10) & 0x3e);  //R 5bit
        CmdWr((color>>5) & 0x3f);   //G 6bit
        CmdWr((color<<1)  & 0x3e);  //B 5bit
}

void ssd1331::DrawRectangle(  uint8_t xs,   
                                uint8_t ys, 
                                uint8_t xe, 
                                uint8_t ye, 
                                uint16_t color  )
{
    CmdWr(SSD1331_CMD_FillEnable);  CmdWr(0x00);    //塗りつぶし禁止

    CmdWr(SSD1331_CMD_DrawRectangle);
        CmdWr(xs);  CmdWr(ys);  CmdWr(xe);  CmdWr(ye);

        //color     R 5bit      bit 15-11
        //          G 6bit      bit 10- 5
        //          B 5bit      bit  4- 0
        CmdWr((color>>10) & 0x3e);  //R 5bit
        CmdWr((color>>5) & 0x3f);   //G 6bit
        CmdWr((color<<1)  & 0x3e);  //B 5bit
        CmdWr(0);   //R 5bit
        CmdWr(0);   //G 6bit
        CmdWr(0);   //B 5bit
    wait_us(100);

}

void ssd1331::DrawRectangleFill(  uint8_t xs,   
                                    uint8_t ys, 
                                    uint8_t xe, 
                                    uint8_t ye, 
                                    uint16_t line_color,
                                    uint16_t fill_color )

{
    CmdWr(SSD1331_CMD_FillEnable);  CmdWr(0x01);    //塗りつぶし禁止

    CmdWr(SSD1331_CMD_DrawRectangle);
        CmdWr(xs);  CmdWr(ys);  CmdWr(xe);  CmdWr(ye);

        //color     R 5bit      bit 15-11
        //          G 6bit      bit 10- 5
        //          B 5bit      bit  4- 0
        CmdWr((line_color>>10) & 0x3e); //R 5bit
        CmdWr((line_color>>5) & 0x3f);  //G 6bit
        CmdWr((line_color<<1)  & 0x3e); //B 5bit
        CmdWr((fill_color>>10) & 0x3e); //R 5bit
        CmdWr((fill_color>>5) & 0x3f);  //G 6bit
        CmdWr((fill_color<<1)  & 0x3e); //B 5bit
    wait_us(400);
}



/*
 * Adafruit Font Library
 * */
int ssd1331::put_charPattern(char CharCode,uint16_t CHAR_COLOR,uint16_t xs,uint16_t ys,int FontSel)
{
    uint8_t FirstCode,char_offset;
    uint8_t *pFNT;

    int x,y;
    int FontWidth,FontHeight,FontDotCap,bitCnt;
    int xOffset,yOffset;
    uint8_t LinePattern;
    int BitCount;

    FirstCode = FntList[FontSel].pFnt->first;
    if ((CharCode > FntList[FontSel].pFnt->last)||(CharCode < FirstCode)){
        return -1;
    }

    char_offset=(CharCode - FirstCode);
    pFNT = FntList[FontSel].pFnt->bitmap;
    pFNT += FntList[FontSel].pFnt->glyph[char_offset].bitmapOffset;

    FontWidth = FntList[FontSel].pFnt->glyph[char_offset].width;
    FontHeight = FntList[FontSel].pFnt->glyph[char_offset].height;
    FontDotCap = FontWidth * FontHeight;

    xOffset = FntList[FontSel].pFnt->glyph[char_offset].xOffset;
    yOffset = FntList[FontSel].pFnt->glyph[char_offset].yOffset;

    x=0;
    y=0;
    BitCount=8;
    
    for(bitCnt=0;bitCnt<FontDotCap;bitCnt++){
        if (8==BitCount){
            LinePattern = *pFNT++;
            BitCount=0;
        }
        if((LinePattern & 0x80)!=0){
            DrawPix(x+xs+xOffset,y+ys+yOffset,CHAR_COLOR);
//          Serial.print("@");  

//          Serial.print(" x ");    
//          Serial.print(x+xs+xOffset); 
//          Serial.print(" y ");    
//          Serial.print(y+ys+yOffset); 

        }else{
//          Serial.print(".");  
        }

        LinePattern = LinePattern<<1;

        if(x>=FontWidth-1){
            x=0;    y++;
//          Serial.println();   
        }else{
            x++;
        }
        BitCount++;
    }
    return FntList[FontSel].pFnt->glyph[char_offset].xAdvance;
}

int ssd1331::PutString(int x,int y,char *string,uint16_t CharColor,int FontSel)
{
    int i,j,k;
    char *STR;

    STR = (char *)string;

    for(i=0,j=x;;i++,STR++){

        if (*STR==0){
            return 0;
        }

        k=put_charPattern(*STR,CharColor,j,y,FontSel);
        if(k<0){
            return -2;
        }else{
            j=j+k;
        }
    }
//    return 0;
}

void ssd1331::GetFontInfo(int FontNo, FontList  *FntLst){
    FntLst->pFnt =FntList[FontNo].pFnt; 

    for(int i=0;i<16;i++){
        FntLst->FontName[i] = FntList[FontNo].FontName[i];
    }

//    strcpy(FntList->FontName,FntList[0].FontName);

}
int ssd1331::GetFontNum(void){
    return FontNum;
}

int ssd1331::SetFontInf()
{
    FntList[7].pFnt=(GFXfont *)0;
    FntList[6].pFnt=(GFXfont *)0;
    FntList[5].pFnt=(GFXfont *)0;
    FntList[4].pFnt=(GFXfont *)0;
    FntList[3].pFnt=(GFXfont *)0;
    FntList[2].pFnt=(GFXfont *)0;
    FntList[1].pFnt=(GFXfont *)0;
    FntList[0].pFnt=(GFXfont *)0;

    FntList[3].pFnt=(GFXfont *)&TomThumb;
    strcpy(FntList[3].FontName,"TomThumb\0");

    FntList[2].pFnt=(GFXfont *)&FreeSerif9pt7b;
    strcpy(FntList[2].FontName,"Serif9pt7b\0");

    FntList[1].pFnt=(GFXfont *)&FreeSans9pt7b;
    strcpy(FntList[1].FontName,"Sans9pt7b\0");

    FntList[0].pFnt=(GFXfont *)&FreeMonoBold9pt7b;
    strcpy(FntList[0].FontName,"MonoBold9pt7b\0");

    return 5;
}