#include "oled_iic_SSD1306.h" #include "oled_font.h" #include "delay.h" #include "printfs.h" #if (1==OLED_USE_SOFT_IIC) #include "iic_soft.h" static IIC_Soft_Config oled_soft_iic; #else #include "iic.h" #endif //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_wrdat(uint8 dat) { #if (1==OLED_USE_SOFT_IIC) soft_iic_write_reg(&oled_soft_iic, OLED_ADDR, 0x40, dat); #else iic_write_reg(OLED_ADDR, 0x40, dat); #endif } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_wrcmd(uint8 cmd) { #if (1==OLED_USE_SOFT_IIC) soft_iic_write_reg(&oled_soft_iic, OLED_ADDR, 0x00, cmd); #else iic_write_reg(OLED_ADDR, 0x00, cmd); #endif } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_hexascii(uint16 hex,int8 * Print) { uint8 edata hexcheck ; uint8 edata TEMP ; TEMP = 6 ; Print[TEMP ]='\0'; while(TEMP) { TEMP -- ; hexcheck = hex%10 ; hex /=10 ; Print[TEMP ] = hexcheck + 0x30 ; } } #if (1==OLED_USE_SOFT_IIC) void oled_scl_set() { OLED_SCL_LEVEL(1); } void oled_sda_set() { OLED_SDA_LEVEL(1); } void oled_sda_clr() { OLED_SDA_LEVEL(0); } void oled_scl_clr() { OLED_SCL_LEVEL(0); } uint8 oled_sda_read() { return OLED_SDA_READ(); } #endif //------------------------------------------------------------------------------------------------------------------- // @brief OLED初始化函数 // @param NULL // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_init(void) { // unsigned char i; // unsigned char initData[] = {0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA0,0xA6,0xA8,0x3F,0xC8,0xD3,0x00,0xD5,0x80,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,0xAF}; #if (1==OLED_USE_SOFT_IIC) // oled_soft_iic.sda_pin = OLED_SDA_PIN; // oled_soft_iic.scl_pin = OLED_SCL_PIN; oled_soft_iic.SCL_SET = oled_scl_set; oled_soft_iic.SCL_CLR = oled_scl_clr; oled_soft_iic.SDA_SET = oled_sda_set; oled_soft_iic.SDA_CLR = oled_sda_clr; oled_soft_iic.SDA_READ = oled_sda_read; oled_soft_iic.wait_time = OLED_SOFT_WAIT_TIME; soft_iic_init(&oled_soft_iic); #else iic_init(OLED_IIC,OLED_HARD_WAIT_TIME); #endif // for(i=0;i<25;i++){ // oled_wrcmd(initData[i]); // } // oled_wrcmd(0xAE); // oled_wrcmd(0x40); // oled_wrcmd(0xB0); // oled_wrcmd(0xC8); // oled_wrcmd(0x81); // oled_wrcmd(0xFF); // oled_wrcmd(0xA1); // oled_wrcmd(0xA6); // oled_wrcmd(0xA8); // oled_wrcmd(0x1F); // oled_wrcmd(0xD3); // oled_wrcmd(0x00); // oled_wrcmd(0xD5); // oled_wrcmd(0xF0); // oled_wrcmd(0xD9); // oled_wrcmd(0x22); // oled_wrcmd(0xDA); // oled_wrcmd(0x02); // oled_wrcmd(0xDB); // oled_wrcmd(0x49); // oled_wrcmd(0x8D); // oled_wrcmd(0x14); // oled_wrcmd(0xAF); oled_wrcmd(0xae);//--turn off oled panel oled_wrcmd(0x00);//---set low column address oled_wrcmd(0x10);//---set high column address oled_wrcmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) oled_wrcmd(0x81);//--set contrast control register oled_wrcmd(Brightness); // Set SEG Output Current Brightness #if (0 == OLED_DISPLAY_DIR) oled_wrcmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 oled_wrcmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 #else oled_wrcmd(0xa0);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 oled_wrcmd(0xc0);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 #endif oled_wrcmd(0xa6);//--set normal display oled_wrcmd(0xa8);//--set multiplex ratio(1 to 64) oled_wrcmd(0x3f);//--1/64 duty oled_wrcmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) oled_wrcmd(0x00);//-not offset oled_wrcmd(0xd5);//--set display clock divide ratio/oscillator frequency oled_wrcmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec oled_wrcmd(0xd9);//--set pre-charge period oled_wrcmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock oled_wrcmd(0xda);//--set com pins hardware configuration oled_wrcmd(0x12); oled_wrcmd(0xdb);//--set vcomh oled_wrcmd(0x40);//Set VCOM Deselect Level oled_wrcmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02) oled_wrcmd(0x02);// oled_wrcmd(0x8d);//--set Charge Pump enable/disable oled_wrcmd(0x14);//--set(0x10) disable oled_wrcmd(0xa4);// Disable Entire Display On (0xa4/0xa5) oled_wrcmd(0xa6);// Disable Inverse Display On (0xa6/a7) oled_wrcmd(0xaf);//--turn on oled panel oled_fill(0x00); //初始清屏 oled_set_pos(0,0); } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示坐标设置 // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_set_pos(uint8 x, uint8 y) { oled_wrcmd((uint8)(0xb0+y)); oled_wrcmd((uint8)(((x&0xf0)>>4)|0x10)); oled_wrcmd((uint8)((x&0x0f))); } //------------------------------------------------------------------------------------------------------------------- // @brief OLED清屏函数 // @param bmp_data 填充颜色选着(0x00 or 0xff) // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_fill(uint8 bmp_data) { uint8 edata y,x; for(y=0;y<8;y++) { oled_wrcmd((uint8)(0xb0+y)); oled_wrcmd((uint8)(0x01)); oled_wrcmd((uint8)(0x10)); for(x=0;x>4)|0x10)); oled_wrcmd((uint8)((x&0x0f)|0x00)); oled_wrdat(data1); } //------------------------------------------------------------------------------------------------------------------- // @brief OLED关闭一个坐标所有亮点 // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_clrpixel(uint8 x,uint8 y) { oled_set_pos(x,y); oled_wrcmd((uint8)(0xb0+y)); oled_wrcmd((uint8)(((x&0xf0)>>4)|0x10)); oled_wrcmd((uint8)((x&0x0f)|0x00)); oled_wrdat(0x00); } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示字符串(6*8字体) // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @param ch[] 字符串 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_p6x8str(uint8 x,uint8 y,const int8 ch[]) { uint8 edata 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(oled_6x8[c][i]); x+=6; j++; } } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示无符号数(6*8字体) // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @param num 无符号数 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_uint16(uint8 x, uint8 y, uint16 num) { int8 ch[7]; oled_hexascii(num,ch); oled_p6x8str(x, y, &ch[1]); //显示数字 6*8字体 //oled_p8x16str(x, y, &ch[1]); //显示数字 8*16字体 } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示有符号数(6*8字体) // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @param num 有符号数 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void oled_int16(uint8 x, uint8 y, int16 num) { int8 ch[7]; if(num<0) {num = -num;oled_p6x8str(x, y, "-");} else oled_p6x8str(x, y, " "); x+=6; oled_hexascii(num,ch); oled_p6x8str(x, y, &ch[1]); //显示数字 6*8字体 } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示32位有符号(去除整数部分无效的0) // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @param dat 需要显示的变量,数据类型uint32 // @param num 需要显示的位数 最高10位 不包含正负号 // @return void // @since v1.0 // Sample usage: oled_printf_int32(0,0,x,5);//x可以为int32 uint16 int16 uint8 int8类型 // Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void oled_printf_int32(uint16 x,uint16 y,int32 dat,uint8 num) { int8 buff[34]; uint8 length; if(10dat) length = zf_sprintf( &buff[0],"%d",dat);//负数 else { buff[0] = ' '; length = zf_sprintf( &buff[1],"%d",dat); length++; } while(length < num) { buff[length] = ' '; length++; } buff[num] = '\0'; oled_p6x8str((uint8)x, (uint8)y, (int *)buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示浮点数(去除整数部分无效的0) // @param x x轴坐标设置0-127 // @param y y轴坐标设置0-7 // @param dat 需要显示的变量,数据类型float或double // @param num 整数位显示长度 最高10位 // @param pointnum 小数位显示长度 最高6位 // @return void // @since v1.0 // Sample usage: oled_printf_float(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 // @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 // 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void oled_printf_float(uint16 x,uint16 y,double dat,uint8 num,uint8 pointnum) { uint8 length; int8 buff[34]; int8 start,end,point; if(6dat) length = zf_sprintf( &buff[0],"%f",dat);//负数 else { length = zf_sprintf( &buff[1],"%f",dat); length++; } point = length - 7; //计算小数点位置 start = point - num - 1; //计算起始位 end = point + pointnum + 1; //计算结束位 while(0>start)//整数位不够 末尾应该填充空格 { buff[end] = ' '; end++; start++; } if(0>dat) buff[start] = '-'; else buff[start] = ' '; buff[end] = '\0'; oled_p6x8str((uint8)x, (uint8)y, (int8 *)buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief OLED显示图像 // @param high 图像高度 // @param width 图像宽度 // @param *p 图像地址(数组) // @param value 二值化阀值 // @return void // @since v1.0 // Sample usage: // @Note 使用Image2lcd V3.2软件取模 C语言数组 水平扫描 // 宽度高度自行设置 颜色反转 256色 //------------------------------------------------------------------------------------------------------------------- void oled_dis_bmp(uint16 high, uint16 width, uint8 *p,uint8 value) { uint16 i = 0; uint16 edata j = 0; uint16 temp = 0,temp1 = 0; uint8 dat = 0; temp1 = high%8; if(temp1 == 0) temp = high/8; else temp = high/8+1; for(i=0; i=1))dat |= (*(p+i*8*width+j+width*0) > value? 1: 0)<<0; if( (i<(temp-1)) || !temp1 || (temp1>=2))dat |= (*(p+i*8*width+j+width*1) > value? 1: 0)<<1; if( (i<(temp-1)) || !temp1 || (temp1>=3))dat |= (*(p+i*8*width+j+width*2) > value? 1: 0)<<2; if( (i<(temp-1)) || !temp1 || (temp1>=4))dat |= (*(p+i*8*width+j+width*3) > value? 1: 0)<<3; if( (i<(temp-1)) || !temp1 || (temp1>=5))dat |= (*(p+i*8*width+j+width*4) > value? 1: 0)<<4; if( (i<(temp-1)) || !temp1 || (temp1>=6))dat |= (*(p+i*8*width+j+width*5) > value? 1: 0)<<5; if( (i<(temp-1)) || !temp1 || (temp1>=7))dat |= (*(p+i*8*width+j+width*6) > value? 1: 0)<<6; if( (i<(temp-1)) || !temp1 || (temp1>=8))dat |= (*(p+i*8*width+j+width*7) > value? 1: 0)<<7; oled_wrdat(dat); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 汉字显示 // @param x 横坐标 0-127 // @param y 纵坐标 0-7 // @param size 取模的时候设置的汉字字体大小,也就是一个汉字占用的点阵长宽为多少个点,取模的时候需要长宽是一样的。 // @param *p 需要显示的汉字数组 // @param len 需要显示多少位 // @return void // @since v1.0 // Sample usage: // @Note 使用PCtoLCD2002软件取模 阴码、逐行式、顺向 16*16 //------------------------------------------------------------------------------------------------------------------- void oled_print_chinese(uint8 x, uint8 y, uint8 size, const uint8 *p, uint8 len) { uint16 i,j,k; for(i=0; i