/***************************************************************************** 函 数 名 : OLED_P8x16Str 功能描述 : 写入一组8x16标准ASCII字符串 输入参数 : uchar8 ucIdxX 为显示的横坐标0~120 uchar8 ucIdxY 为页范围0~3 uchar8 ucDataStr[] 要显示的字符串 输出参数 : NONE 返 回 值 : NONE *****************************************************************************/ void OLED_P8x16Str(uchar8 ucIdxX, uchar8 ucIdxY, uchar8 ucDataStr[]) { uchar8 i, j, ucDataTmp; ucIdxY <<= 1; for (j = 0; ucDataStr[j] != '\0'; j++) { ucDataTmp = ucDataStr[j] - 32; if(ucIdxX > 120) { ucIdxX = 0; ucIdxY += 2; } OLED_SetPos(ucIdxX, ucIdxY); for(i = 0; i < 8; i++) { OLED_WrDat(Font_8x16[(ucDataTmp << 4) + i]); } OLED_SetPos(ucIdxX, ucIdxY + 1); for(i = 0; i < 8; i++) { OLED_WrDat(Font_8x16[(ucDataTmp << 4) + i + 8]); } ucIdxX += 8; } return; }
/***************************************************************************** 函 数 名 : OLED_PrintImage 功能描述 : 将图像显示出来 输入参数 : uchar8 *pucTable 二维图像数组的地址 ushort16 usRowNum 二维图像的行数1~64 ushort16 usColumnNum 二维图像的列数1~128 输出参数 : none 返 回 值 : none *****************************************************************************/ void OLED_PrintImage(uchar8 *pucTable, ushort16 usRowNum, ushort16 usColumnNum) { uchar8 ucData; ushort16 i,j,k,m,n; ushort16 usRowTmp; m = usRowNum >> 3; //计算图片行数以8位为一组完整的组数 n = usRowNum % 8; //计算分完组后剩下的行数 for(i = 0; i < m; i++) //完整组行扫描 { OLED_SetPos(0,(uchar8)i); usRowTmp = i << 3; //计算当前所在行的下标 for(j = 0; j < usColumnNum; j++) //列扫描 { ucData = 0; for(k = 0; k < 8; k++) //在i组中对这8行扫描 { ucData = ucData >> 1; if((pucTable + (usRowTmp + k) * usColumnNum)[j] == OLED_IMAGE_WHITE) { ucData = ucData | 0x80; } } OLED_WrDat(ucData); } } OLED_SetPos(0,(uchar8)i); //设置剩下的行显示的起始坐标 usRowTmp = i << 3; //计算当前所在行的下标 for(j = 0; j < usColumnNum; j++) //列扫描 { ucData = 0; for(k = 0; k < n; k++) //对剩下的行扫描 { ucData = ucData >> 1; if((pucTable + (usRowTmp + k) * usColumnNum)[j] == OLED_IMAGE_WHITE) { ucData = ucData | 0x80; } } ucData = ucData >> (8 - n); OLED_WrDat(ucData); } return; }
/***************************************************************************** 函 数 名 : OLED_Init 功能描述 : OOLED初始化 输入参数 : void 输出参数 : NONE 返 回 值 : NONE *****************************************************************************/ void OLED_Init(void) { uchar8 i; OLED |=OLED_SCL; OLED &=~OLED_RST; for(i = 0; i < 100; i++) { _nop(); //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕 } OLED |=OLED_RST; SetDisplayOnOff(0x00); // Display Off (0x00/0x01) SetDisplayClock(0x80); // Set Clock as 100 Frames/Sec SetMultiplexRatio(0x3F); // 1/64 Duty (0x0F~0x3F) SetDisplayOffset(0x00); // Shift Mapping RAM Counter (0x00~0x3F) SetStartLine(0x00); // Set Mapping RAM Display Start Line (0x00~0x3F) SetChargePump(0x04); // Enable Embedded DC/DC Converter (0x00/0x04) SetAddressingMode(0x02); // Set Page Addressing Mode (0x00/0x01/0x02) SetSegmentRemap(0x01); // Set SEG/Column Mapping 0x00左右反置 0x01正常 SetCommonRemap(0x08); // Set COM/Row Scan Direction 0x00上下反置 0x08正常 SetCommonConfig(0x10); // Set Sequential Configuration (0x00/0x10) SetContrastControl(0xCF); // Set SEG Output Current SetPrechargePeriod(0xF1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock SetVCOMH(0x40); // Set VCOM Deselect Level SetEntireDisplay(0x00); // Disable Entire Display On (0x00/0x01) SetInverseDisplay(0x00); // Disable Inverse Display On (0x00/0x01) SetDisplayOnOff(0x01); // Display On (0x00/0x01) OLED_Fill(0x00); // 初始清屏 OLED_SetPos(0,0); return; }
//-------------------------------------------------------------- // Prototype : void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N) // Calls : // Parameters : x,y -- 起始点坐标(x:0~127, y:0~7); N:汉字在codetab.h中的索引 // Description : 显示codetab.h中的汉字,16*16点阵 //-------------------------------------------------------------- void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N) { unsigned char wm=0; unsigned int adder=32*N; OLED_SetPos(x , y); for(wm = 0;wm < 16;wm++) { WriteDat(F16x16[adder]); adder += 1; } OLED_SetPos(x,y + 1); for(wm = 0;wm < 16;wm++) { WriteDat(F16x16[adder]); adder += 1; } }
/** * @brief OLED_ShowStr,显示codetab.h中的ASCII字符,有6*8和8*16可选择 * @param x,y : 起始点坐标(x:0~127, y:0~7); * ch[] :- 要显示的字符串; * TextSize : 字符大小(1:6*8 ; 2:8*16) * @retval 无 */ void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize) { unsigned char c = 0,i = 0,j = 0; switch(TextSize) { case 1: { while(ch[j] != '\0') { c = ch[j] - 32; if(x > 126) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<6;i++) WriteDat(F6x8[c][i]); x += 6; j++; } }break; case 2: { while(ch[j] != '\0') { c = ch[j] - 32; if(x > 120) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i]); OLED_SetPos(x,y+1); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i+8]); x += 8; j++; } }break; } }
/** * @brief OLED_DrawBMP,显示BMP位图 * @param x0,y0 :起始点坐标(x0:0~127, y0:0~7); * x1,y1 : 起点对角线(结束点)的坐标(x1:1~128,y1:1~8) * @retval 无 */ void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y; if(y1%8==0) y = y1/8; else y = y1/8 + 1; for(y=y0;y<y1;y++) { OLED_SetPos(x0,y); for(x=x0;x<x1;x++) { WriteDat(BMP[j++]); } } }
/***************************************************************************** 函 数 名 : OLED_P6x8Char 功能描述 : 显示一个6x8标准ASCII字符 输入参数 : uchar8 ucIdxX 显示的横坐标0~122 uchar8 ucIdxY 页范围0~7 uchar8 ucData 显示的字符 输出参数 : NONE 返 回 值 : NONE *****************************************************************************/ void OLED_P6x8Char(uchar8 ucIdxX, uchar8 ucIdxY, uchar8 ucData) { uchar8 i, ucDataTmp; ucDataTmp = ucData-32; if(ucIdxX > 122) { ucIdxX = 0; ucIdxY++; } OLED_SetPos(ucIdxX, ucIdxY); for(i = 0; i < 6; i++) { OLED_WrDat(Font_6x8[ucDataTmp][i]); } }
/***************************************************************************** 函 数 名 : OLED_P6x8Str 功能描述 : 写入一组6x8标准ASCII字符串 输入参数 : uchar8 ucIdxX 显示的横坐标0~122 uchar8 ucIdxY 页范围0~7 uchar8 ucDataStr[] 显示的字符串 输出参数 : NONE 返 回 值 : NONE *****************************************************************************/ void OLED_P6x8Str(uchar8 ucIdxX, uchar8 ucIdxY, uchar8 ucDataStr[]) { uchar8 i, j, ucDataTmp; for (j = 0; ucDataStr[j] != '\0'; j++) { ucDataTmp = ucDataStr[j] - 32; if(ucIdxX > 122) { ucIdxX = 0; ucIdxY++; } OLED_SetPos(ucIdxX,ucIdxY); for(i = 0; i < 6; i++) { OLED_WrDat(Font_6x8[ucDataTmp][i]); } ucIdxX += 6; } return; }