/***************************************************************************** 函 数 名 : 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; }
//输出汉字字符串 void OLED_P14x16Str(unsigned char x,unsigned char y,unsigned char ch[]) { unsigned char wm=0,ii = 0; unsigned int adder=1; while(ch[ii] != '\0') { wm = 0; adder = 1; while(F14x16_Idx[wm] > 127) { if(F14x16_Idx[wm] == ch[ii]) { if(F14x16_Idx[wm + 1] == ch[ii + 1]) { adder = wm * 14; break; } } wm += 2; } if(x>118){x=0;y++;} OLED_Set_Pos(x , y); if(adder != 1)// 显示汉字 { OLED_Set_Pos(x , y); for(wm = 0;wm < 14;wm++) { OLED_WrDat(F14x16[adder]); adder += 1; } OLED_Set_Pos(x,y + 1); for(wm = 0;wm < 14;wm++) { OLED_WrDat(F14x16[adder]); adder += 1; } } else //显示空白字符 { ii += 1; OLED_Set_Pos(x,y); for(wm = 0;wm < 16;wm++) { OLED_WrDat(0); } OLED_Set_Pos(x,y + 1); for(wm = 0;wm < 16;wm++) { OLED_WrDat(0); } } x += 14; ii += 2; } }
/************************************************************************* * * 函数名称OLED_ZhongXian * 功能说明:显示中线的位置 * 参数说明: * 函数返回:无 * 修改时间: * 备 注: *************************************************************************/ void OLED_ZhongXian(void) { uint8_t m; for(m = 0;m < 3;m++) { OLED_Set_XY(Center,m); OLED_WrDat(0xff); } for(m = 0;m < 3;m++) { OLED_Set_XY(Center,m); OLED_WrDat(0x00); } }
void OLED_PrintPicture(void) { uint8 data = 0; uint8 i,j,k; uint8 x,y; for (k = 0;k < 7;k++)//共计56行(后面四行单独算) { OLED_Set_Pos(5,k);//设置坐标,每次跳8行,60列 x = k*8;//行起始位置 y = (k+1)*8 - 1;//行计数(只要循环7行,还有一行单独算) for (i = 0;i< PICTURE_WIDTH;i++) { //高位显示在8行的最下面,低位显示在最上面 //例如0x83的显示 //* 1 //* 1 // 0 // 0 // 0 // 0 // 0 //* 1 //因此要从高到低扫描 for (j = y;j > x;j--)//从第j行i列到第j+6行i列 { data += PixData[j][i];//对应位置一或置零(图像已经二值化,只能是0或1) data<<=1;//左移一位 } //j+7行i列 data += PixData[j][i];//此处不要位移 OLED_WrDat(data);//写入8行,1列的数据并显示 data = 0; } } OLED_Set_Pos(5,7);//最后四行 x = 56;//行起始位置 y = 60;//行计数(只要循环4行) for (i = 0;i < PICTURE_WIDTH;i++)//每次写8行,图像宽度列 60列 { for (j = x;j < y;j++)//从第56行i列到第59行i列 { data += PixData[j][i];//对应位置一(图像已经二值化,只能是0或1) data<<=1; } data>>=1; OLED_WrDat(data);//写入8行,1列的数据并显示 data = 0; } }
/***************************************************************************** 函 数 名 : 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_ZhongXian * 功能说明:显示中线的位置 * 参数说明: * 函数返回:无 * 修改时间: * 备 注: *************************************************************************/ void OLED_ZhongXian(void) { uint8_t m; for(m = 0;m < 3;m++) { OLED_Set_XY(c,m); OLED_WrDat(0xff); } for(m = 0;m < 3;m++) { OLED_Set_XY(c,m); OLED_WrDat(0x00); } OLED_Write_Num3(0,2,c); }
/*****************功能描述:显示16*16点阵 显示的坐标(x,y),y为页范围0~7****************************/ void OLED_P16x16Ch(unsigned char x,unsigned char y,unsigned char N) { unsigned char wm = 0; unsigned int adder = 32 * N; // OLED_Set_Pos(x , y); for ( wm = 0 ; wm < 16 ; wm ++ ) // { OLED_WrDat(F16x16[adder]); adder += 1; } OLED_Set_Pos(x,y + 1); for ( wm = 0;wm < 16 ; wm ++ ) // { OLED_WrDat(F16x16[adder]); adder += 1; } }
void OLED_P8x16Str(unsigned char x,unsigned char y,unsigned char ch[]) { unsigned char c=0,i=0,j=0; while (ch[j]!='\0') { c =ch[j]-32; if(x>120){x=0;y++;} OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WrDat(F8X16[c*16+i]); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WrDat(F8X16[c*16+i+8]); x+=8; j++; } }
//============================================================== //函数名:OLED_P6x8Str(unsigned char x,unsigned char y,unsigned char *p,unsigned char ConverseSelect) //功能描述:写入一组标准ASCII字符串 //参数:显示的位置(x,y),y为页范围0~7,要显示的字符串, 黑底白字反转选择(0:黑底白字 1:白底黑字) //返回:无 //============================================================== void OLED_P6x8Str(unsigned char x,unsigned char y,unsigned char ch[],unsigned char ConverseSelect) { unsigned char c=0,i=0,j=0; while (ch[j]!='\0') { c =ch[j]-32; if(x>122){x=0;y++;} OLED_Set_Pos(x,y); for(i=0;i<6;i++) { if(ConverseSelect) OLED_WrDat(F6x8_Converse[c][i]); else OLED_WrDat(F6x8[c][i]); } x+=6; j++; } }
void OLED_clear_line(unsigned int line) { unsigned char x; OLED_WrCmd(0xb0+line); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for(x=0;x<X_WIDTH;x++) OLED_WrDat(0x00); }
void oled_show() { uint8_t i,j; for(i = 7;i >= 4;i--) { OLED_Set_XY(0,i); for(j = 0;j <= 124;j++) OLED_WrDat(oled_data[i][j]); } }
/****************************************************************************** 函数名称 :OLED_Write_Char 功能描述 :字符显示 参数说明 :x SmallChars(小字体) -- (0 - 20)共21列 LargeChars(大字体) -- (0 - 15)共16列 y SmallChars(小字体) -- (0 - 7) 共 8行 LargeChars(大字体) -- (0 - 6) 共 4行 ** y只能取"0, 2, 4, 6" 4行 ** c 字体库中任意字符 函数返回 :无 备 注 :无 *******************************************************************************/ void OLED_Write_8x8(uint8_t x,uint8_t y,uint8_t *s) { uint8_t t; OLED_Set_XY(x*8,y); for(t=0;t<8;t++) { OLED_WrDat(s[t]); } }
//============================================================== //函数名: void LCD_Rectangle(uint8 x1,uint8 y1, // uint8 x2,uint8 y2,uint8 color,uint8 gif) //功能描述:绘制一个实心矩形 //参数:左上角坐标(x1,y1),右下角坐标(x2,y2) // 其中x1、x2的范围0~127,y1,y2的范围0~63,即真实坐标值 //返回:无 //============================================================== void OLED_Rectangle(uint8 x1,uint8 y1,uint8 x2,uint8 y2,uint8 gif) { uint8 n; OLED_Set_Pos(x1,y1>>3); for(n=x1;n<=x2;n++) { OLED_WrDat(0x01<<(y1%8)); if(gif == 1) OLED_DLY_ms(50); } OLED_Set_Pos(x1,y2>>3); for(n=x1;n<=x2;n++) { OLED_WrDat(0x01<<(y2%8)); if(gif == 1) OLED_DLY_ms(5); } }
/**********写一个字符***********/ void OLED_write_char(unsigned char c) { unsigned char line; c -= 32; for ( line = 0; line < 6 ; line ++) OLED_WrDat(F6x8[c][line]); }
void OLED_Write_Picture(uint8_t x,uint8_t y,uint8_t *s) { uint8_t i,j; for(j=0;j<(x/8);j++){ OLED_Set_XY(0,j); for(i=0;i<y;i++){ OLED_WrDat(s[j*y+i]); } } }
//============================================================== //函数名: void LCD_PutPixel(uint8 x,uint8 y) //功能描述:绘制一个点(x,y) //参数:真实坐标值(x,y),x的范围0~127,y的范围0~64 //返回:无 //============================================================== void OLED_PutPixel(uint8 x,uint8 y) { uint8 data1; //data1当前点的数据 OLED_Set_Pos(x,y); data1 = 0x01<<(y%8); OLED_WrCmd(0xb0+(y>>3)); OLED_WrCmd(((x&0xf0)>>4)|0x10); OLED_WrCmd((x&0x0f)|0x00); OLED_WrDat(data1); }
void OLED_Write_Picture1(uint8_t x,uint8_t y,uint8_t *s) { uint8_t i,j; for(j=0;j<(8/8);j++){ OLED_Set_XY(x*8,j+y); for(i=0;i<8;i++){ OLED_WrDat(s[j*8+i]); } } }
void OLED_draw_line(unsigned int data[]) { unsigned char y,x; for(y=0;y<4;y++) { OLED_WrCmd(0xb0+y); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for(x=0;x<X_WIDTH;x++) OLED_WrDat(data[x]); } }
/*********************LCD复位************************************/ void OLED_CLS(void) { unsigned char y,x; for ( y = 0 ; y < 8 ; y ++ ) { OLED_WrCmd(0xb0 + y); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for ( x = 0 ; x < X_WIDTH ; x ++ ) OLED_WrDat(0); } }
/*********************LCD全屏************************************/ void OLED_Fill(unsigned char bmp_dat) { unsigned char y,x; for ( y = 0 ; y < 8 ; y ++ ) { OLED_WrCmd(0xb0 + y); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for ( x = 0 ; x < X_WIDTH ; x ++ ) OLED_WrDat(bmp_dat); } }
void OLED_Draw_Curve(unsigned char *data) { unsigned char i,temp1,y1,temp2,y2; for(i=0;i<128;i+=2) { y1=7-(data[i]>>3); //获取行号 y2=7-(data[i+1]>>3); temp1=1<<(7-(data[i]%8)); temp2=1<<(7-(data[i+1]%8)); if(y1==y2) { OLED_Set_Pos(i,y1); OLED_WrDat(temp1); OLED_WrDat(temp2); } else { OLED_Set_Pos(i,y1); OLED_WrDat(temp1); OLED_WrDat(0); OLED_Set_Pos(i,y2); OLED_WrDat(0); OLED_WrDat(temp2); } } }
/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ void Draw_BMP(unsigned char x0, unsigned char y0,unsigned char x1,unsigned char y1,const unsigned char BMP[]) { unsigned int j = 0; unsigned char x,y; for ( y = y0 ; y < y1 ; y ++ ) { OLED_Set_Pos(x0,y); for ( x = x0 ; x < x1 ; x ++ ) { OLED_WrDat(BMP[j++]); } } }
void OLED_Fill(uint8 bmp_data) { uint8 y,x; for(y=0;y<8;y++) { OLED_WrCmd(0xb0+y); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for(x=0;x<X_WIDTH;x++) OLED_WrDat(bmp_data); } }
void Draw_LibLogo(void) { uint16 ii=0; uint8 x,y; for(y=0;y<8;y++) { OLED_Set_Pos(34,y); for(x=34;x<94;x++) { OLED_WrDat(LIBLOGO60x58[ii++]); } } }
void Draw_Landzo(void) { uint16 ii=0; uint8 x,y; for(y=2;y<8;y++) { OLED_Set_Pos(40,y); for(x=40;x<90;x++) { OLED_WrDat(LANDZO_LOGO[ii++]); } } }
//============================================================== //函数名:LCD_P6x8Str(uint8 x,uint8 y,uint8 *p) //功能描述:写入一组标准ASCII字符串 //参数:显示的位置(x,y),y为页范围0~7,要显示的字符串 //返回:无 //============================================================== void OLED_P6x8Str(uint8 x,uint8 y,uint8 ch[]) { uint8 c=0,i=0,j=0; while (ch[j]!='\0') { c =ch[j]-32; if(x>126){x=0;y++;} OLED_Set_Pos(x,y); for(i=0;i<6;i++) OLED_WrDat(F6x8[c][i]); x+=6; j++; } }
//============================================================== //函数名:void OLED_P6x8Char(byte x,byte y,byte ch); //功能描述:显示一个6x8标准ASCII字符 //参数:x为显示的横坐标0~122,y为页范围0~7,ch要显示的字符 //返回:无 //============================================================== void OLED_P6x8Char(uint8 x,uint8 y,uint8 ch) { uint8 c=0,i=0; c =ch-32; if(x>122) { x=0; y++; } OLED_Set_Pos(x,y); for(i=0;i<6;i++) { OLED_WrDat(F6x8[c][i]); } }
/***************************************************************************** 函 数 名 : OLED_Fill 功能描述 : 对全屏写入同一个字符函数 如 OLED_Fill(0x01); 对于某一位0为不亮 1为亮 ------------------------------------------------------ 共128列 1 1 1 共 0 0 0 8 0 0 0 组 0 ……0 ………… 0 字 0 0 0 符 0 0 0 即 0 0 0 8 0 0 0 页 1 1 1 64 0 0 0 行 . . . . . ………… . . . . . . . 0 0 0 ------------------------------------------------------ 输入参数 : uchar8 ucData 输出参数 : NONE 返 回 值 : NONE *****************************************************************************/ void OLED_Fill(uchar8 ucData) { uchar8 ucPage,ucColumn; for(ucPage = 0; ucPage < 8; ucPage++) { OLED_WrCmd(0xb0 + ucPage); //0xb0+0~7表示页0~7 OLED_WrCmd(0x00); //0x00+0~16表示将128列分成16组其地址在某组中的第几列 OLED_WrCmd(0x10); //0x10+0~16表示将128列分成16组其地址所在第几组 for(ucColumn = 0; ucColumn < 128; ucColumn++) { OLED_WrDat(ucData); } } }
/* * 清屏函数 */ void OLED_Clear(void) { uint8_t y,x; for (y=0; y<8; y++) { OLED_WrCmd(0xb0 + y); OLED_WrCmd(0x01); OLED_WrCmd(0x10); for (x=0; x<X_WIDTH; x++) { OLED_WrDat(0); } } }
void Draw_BMP(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_Set_Pos(x0,y); for(x=x0;x<x1;x++) { OLED_WrDat(BMP[j++]); } } }