You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
3.9 KiB

#define _OLED_C
#include "main.h"
#include "mcu.h"
#include "font32x48numbers.h"
#include "fonts.h"
#include "font6x8.h"
#include "font8x16.h"
#include "OLED.h"
//const unsigned char OLEDInitBuff[31]={0xAE, 0xD5,0xF0,0xA8,0x3F,0xD3,0x00,0x40,0x8D,0x10,0xA0,0xC0,0xDA,0x12,0x81,0xFF,0xD9,0x22,0xDB,0x40,0xA4,0xA6,0xAF,0x20,0x00,0x21,0,127,0x22,0,7};
const unsigned char OLEDInitBuff[31]={
0xAE, //display off
0xD5,0x80, //set clock & divide ratio
0xA8,0x3F, //set MUX ratio
0xD3,0x00, //set display offset
0x40, //set display start line
0x8D, 0x10, //disable charge pump
0xA0, //set segment remap
0xC0, //set COM direction
0xDA,0x12, //set COM hardware configuration
0x81,0xFF, //set contrast
0xD9,0x22, //set precharge period
0xDB,0x20, //set DCOM deselect level
0xA4, //disable entire on
0xA6, //set normal display
0xAF, //display on
0x20,0x00, //set horizontal addressing mode
0x21,0,127, //start/end column
0x22,0,7 //start/end row
};
void OLEDInit(){
_delay_ms(1);
OLED_RES = 0;
_delay_ms(1);
OLED_RES = 1;
OLED_VCC = 0;
_delay_ms(100);
OLED_DC = 0;
OLED_CS = 0;
_delay_ms(100);
mcuSPISendBytes((int*)OLEDInitBuff, 31);
mcuSPIWait();
OLEDFill(0, 128, 0, 8, 0);
OLEDUpdate();
}
void OLEDUpdate(){
OLED_DC = 1;
OLED_CS = 0;
mcuSPISendBytes((unsigned int *) OLEDBUFF.B[0], 128*8);
mcuSPIWait();
OLED_CS = 1;
}
void OLEDFill(int col, int colnum, int row, int rownum, UINT8 b){
int cc;
while(rownum--){
cc = colnum;
while(cc--)OLEDBUFF.B[row][col++] = b;
col -= colnum;
row++;
}
}
void OLEDInvert(int col,int colnum, int row, int rownum){
int cc;
while(rownum--){
cc = colnum;
while(cc--)OLEDBUFF.B[row][col++] ^= 255;
col -= colnum;
row++;
}
}
void OLEDWrite(int col, int colnum, int row, void * buf, int num){
int cc;
while(num){
cc = colnum;
while(num && cc--){
OLEDBUFF.B[row][col++] = *(UINT8*)buf;
buf++;
num--;
}
col -= colnum;
row++;
}
}
void OLEDPrintNum3248(int col, int row, int num){
int i, cd;
col += 64;
i = 3;
while(i--){
cd = num % 10;
num /= 10;
if(num || cd || (i>1)) {
OLEDWrite(col, 32, row, (void *)numbers32x48[cd],192);
}
else{
OLEDFill(col, 32, row, 6, 0);
}
col -= 32;
}
}
void OLEDPrintCF1648(int col, int row, int CF){
CF+=10;
OLEDWrite(col, 16, row++, (void *)&numbers32x48[CF][0],16);
OLEDWrite(col, 16, row++, (void *)&numbers32x48[CF][32],16);
OLEDWrite(col, 16, row++, (void *)&numbers32x48[CF][64],16);
OLEDWrite(col, 16, row++, (void *)&numbers32x48[CF][96],16);
OLEDWrite(col, 16, row++, (void *)&numbers32x48[CF][128],16);
}
void OLEDPrintNum(int col, int row, int dec, int num, void* font, int startChar, int width, int height, int blank ){
int cb = width * height;
int cw = width + blank;
int i, cd;
i = dec;
dec--;
col += cw * dec;
if(num<0)num=-num;
while(i--){
cd = num % 10;
num /= 10;
if(num || cd || (i == dec)) {
OLEDWrite(col, width, row, (void *)font + cb * (cd + 0x30 - startChar), cb);
OLEDFill(col + width, blank, row, height, 0);
}
else{
OLEDFill(col, cw, row, height, 0);
}
col -= cw;
}
}
void OLEDPrint(int col, int row, const char * s, int num, void * font, int startChar, int width, int height, int blank){
int cb = width * height;
if(num == 0) num = 128;
while(num--){
if(s[0] == 0) break;
OLEDWrite(col, width, row, (void *)font + cb * (s[0] - startChar), cb);
col += width;
OLEDFill(col, blank, row, height, 0);
col += blank;
s++;
}
}
#undef _OLED_C