• 0

Help with basic IO shield Oled Display


Question

I'm trying to write a code that will display the character H in the left top corner when the potentiometer is fully counter-clockwise, H in the middle when potentiometer is halfway between ccw and cw, and finally H in the right top corner when potentiometer is fully clockwise. Though my code works, I used a for loop to iterate through all the LEDS before the place where I want to put the H character. I wanted to know how I can change the position of the column number of the Oled.

Here's my code:

#include<p32xxxx.h>
#include<plib.h>

#pragma config POSCMOD=HS, FNOSC = PRIPLL
#pragma config FPLLIDIV = DIV_4
#pragma config FPLLMUL = MUL_16
#pragma config FPLLODIV = DIV_4
#pragma config FWDTEN = OFF
#pragma config FPBDIV=DIV_4



#define   prtVddCtrl     IOPORT_F 
#define   prtVbatCtrl    IOPORT_F 
#define   prtDataCmd     IOPORT_F 
#define   prtReset       IOPORT_G 
#define   bitVddCtrl     BIT_6 
#define   bitVbatCtrl    BIT_5 
#define   bitDataCmd     BIT_4 
#define   bitReset       BIT_9 

#define   cbOledDispMax  512       //max number of bytes in display buffer 
#define   ccolOledMax         128  //number of display columns 
#define   crowOledMax         32   //number of display rows 
#define   cpagOledMax         4   

#define POT 2

void initADC(int amask){
    AD1PCFG = amask;
    AD1CON1=0x00E0;
    AD1CSSL=0;
    AD1CON2=0;
    AD1CON3=0x1F3F;
    AD1CON1SET = 0x8000;
}

int readADC(int ch)
{
    AD1CHSbits.CH0SA = ch;
    AD1CON1bits.SAMP=1;
    while(!AD1CON1bits.DONE);
    return ADC1BUF0;
}
BYTE rgb0ledBmp[cbOledDispMax];

void DelayMs(int n){
    int k = 0;
    for(k=0;k<n*10;k++){
        
    }
}
void OledHostInit()      {      
unsigned int   tcfg;      /* Initialize SPI port 2.      */      
SPI2CON = 0;      
SPI2BRG = 15;                 //8Mhz, with 80Mhz PB clock      
SPI2STATbits.SPIROV = 0;      
SPI2CONbits.CKP = 1;      
SPI2CONbits.MSTEN = 1;
SPI2CONbits.ON = 1;      /* Make pins RF4, RF5, and RF6 be outputs.      */      
PORTSetBits(IOPORT_F, bitVddCtrl|bitVbatCtrl|bitDataCmd);      
PORTSetPinsDigitalOut(prtDataCmd, bitDataCmd);         //Data/Command# select      
PORTSetPinsDigitalOut(prtVddCtrl, bitVddCtrl);         //VDD power control (1=off)      
PORTSetPinsDigitalOut(prtVbatCtrl, bitVbatCtrl);   //VBAT power control (1=off)      /* Make the RG9 pin be an output. On the Basic I/O Shield, this pin      ** is tied to reset.      */      
PORTSetBits(prtReset, bitReset);      
PORTSetPinsDigitalOut(prtReset, bitReset); } 

BYTE Spi2PutByte(BYTE bVal)      {      
BYTE bRx;      /* Wait for transmitter to be ready      */      
while (SPI2STATbits.SPITBE == 0);      /* Write the next transmit byte.      */      
SPI2BUF = bVal;      /* Wait for receive byte.      */      
while (SPI2STATbits.SPIRBF == 0);      /* Put the received byte in the buffer.      */      
bRx = SPI2BUF;      
return bRx; }


void OledDspInit()      {      /* We're going to be sending commands, so clear the Data/Cmd bit      
*/      PORTClearBits(prtDataCmd, bitDataCmd);      
/* Start by turning VDD on and wait a while for the power to come up.      */      
PORTClearBits(prtVddCtrl, bitVddCtrl);      
DelayMs(1);      /* Display off command      */      
Spi2PutByte(0xAE);      /* Bring Reset low and then high      */      
PORTClearBits(prtReset, bitReset);      
DelayMs(1);      
PORTSetBits(prtReset, bitReset);      /* Send the Set Charge Pump and Set Pre-Charge Period commands      */      
Spi2PutByte(0x8D);      
Spi2PutByte(0x14);      
Spi2PutByte(0xD9);      
Spi2PutByte(0xF1);      /* Turn on VCC and wait 100ms      */      
PORTClearBits(prtVbatCtrl, bitVbatCtrl);      
DelayMs(100);      /* Send the commands to invert the display. This puts the display origin      ** in the upper left corner. */   
Spi2PutByte(0xA1);            //remap columns      
Spi2PutByte(0xC8);            //remap the rows      /* Send the commands to select sequential COM configuration. This makes the      ** display memory non-interleaved.      */      
Spi2PutByte(0xDA);            //set COM configuration command      
Spi2PutByte(0x20);            //sequential COM, left/right remap enabled      /* Send Display On command      */      
Spi2PutByte(0xAF); }



void OledPutBuffer(int cb, BYTE * rgbTx)      {      
int       ib;      
BYTE bTmp;      /* Write/Read the data      */      
for (ib = 0; ib < cb; ib++) {           /* Wait for transmitter to be ready           */           
while (SPI2STATbits.SPITBE == 0);           /* Write the next transmit byte.           */           
SPI2BUF = *rgbTx++;           /* Wait for receive byte.           */           
while (SPI2STATbits.SPIRBF == 0);           
bTmp = SPI2BUF;      
} 
}

void OledUpdate()      {      
int       ipag;      
int       icol;      
BYTE *    pb;      
pb = rgb0ledBmp;      
for (ipag = 0; ipag < cpagOledMax; ipag++) {    
    PORTClearBits(prtDataCmd, bitDataCmd);           /* Set the page address           */          
    Spi2PutByte(0x22);       //Set page command          
    Spi2PutByte(ipag);       //page number           /* Start at the left column           */        
    Spi2PutByte(0x00);       //set low nybble of column           
    Spi2PutByte(0x10);       //set high nybble of column           
PORTSetBits(prtDataCmd, bitDataCmd);           /* Copy this memory page of display data.           */           
OledPutBuffer(ccolOledMax, pb);           
pb += ccolOledMax;      }
 }

void CharTable(int index){
    switch(index){
        case 17:
            //character H
            Spi2PutByte(0x00);
            Spi2PutByte(0xFF);
            Spi2PutByte(0x10);
            Spi2PutByte(0x10);
            Spi2PutByte(0xFF);
            Spi2PutByte(0x00);
            break;
    };
}

void setPageNumber(BYTE pagnum){
    PORTClearBits(prtDataCmd, bitDataCmd);           /* Set the page address           */          
    Spi2PutByte(0x22);       //Set page command          
    Spi2PutByte(pagnum);       //page number           /* Start at the left column           */        
    Spi2PutByte(0x10);       //set low nybble of column           
    Spi2PutByte(0x10);       //set high nybble of column           
    PORTSetBits(prtDataCmd, bitDataCmd);
}
void main(){
    int a;
    int repeatccw=0;
    int repeatcw=0;
    int repeathor=0;
    OledHostInit();
    OledDspInit();
    OledUpdate();
    setPageNumber(0x00);
    T3CON = 0x8070;
    PR3 = 0xFFFF;
    initADC(0xFFFB);
    int k=0;
    while(1){
        a = readADC(POT);
        a=a>>5;
        if(a==0b00000){
            if(repeatccw==0) repeatccw++;
            else if(repeatccw!=0) continue;
            OledUpdate();
            setPageNumber(0x00);
            CharTable(17);
            repeathor=0;
            repeatcw=0;
        }
        else if(a==0b10000){
            if(repeathor==0) repeathor++;
            else if(repeathor!=0) continue;
            OledUpdate();
            setPageNumber(0x00);
            for(k=0;k<64;k++) Spi2PutByte(0x00);
            CharTable(17);
            repeatcw=0;
            repeatccw=0;
        }
        else if(a==0b11111){
            if(repeatcw==0) repeatcw++;
            else if(repeatcw!=0) continue;
            OledUpdate();
            setPageNumber(0x00);
            for(k=0;k<110;k++) Spi2PutByte(0x00);
            CharTable(17);
            repeathor=0;
            repeatccw=0;
        }
        
    }
    
}

 

Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Hi Hashir,

We have a demo/library that you can look at for reference here. I would look at the void setCursor(int xch, int ych) function which allows you to change the cursors position in the row and column. Hope this helps!

cheers,

Jon 

Edited by jpeyron
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now