///#include "bsp_485.h" ///#include "tpc_debug.h" ////#include "tpc_x.h" #include "c_lib.h" #include "bsp_oled.h" #include "debug_drv.h" #include "bsp_font.h" #include "bmp.h" TS_oled_ ts_oled; void L2_OLED_oht_init(void) { printf("\r\n xy "); ///显示血氧 L1_OLED_ShowChar(0,2,'X',D_8X16); L2_OLED_Showint2_16X32(1,0,78); L1_OLED_ShowChar(8*8,2,'H',D_8X16); L2_OLED_Showint3_16X32(5,0,123); ////显示温度示意 L2_OLED_Show_sint21_6X8(8*6,0,25); /******* Lc_delay_ms(1000); L2_OLED_Show_sint21_6X8(8*6,0,156);Lc_delay_ms(1000); L2_OLED_Show_sint21_6X8(8*6,0,3);Lc_delay_ms(1000); L2_OLED_Show_sint21_6X8(8*6,0,-3);Lc_delay_ms(1000); L2_OLED_Show_sint21_6X8(8*6,0,-888);Lc_delay_ms(1000); ******/ L1_OLED_ShowChar(0,0,'O',D_6X8);////表示没有入网成功 L1_OLED_ShowChar(6,0,'1',D_6X8);///发送一个数据累加一个 //L1_OLED_ShowChar(12,0,'2',D_6X8); //// L1_OLED_ShowChar(18,0,'3',D_6X8); } void L2_OLED_init_show(void) { u8 hang,lie; L0_OLED_io_int(); printf("L0_OLED_io_int"); Lc_memset(ts_oled.d,0,10); L1_OLED_Init(); //初始化OLED /// OLED_ShowNum(); /// L2_OLED_ShowString(0,0,"0.91OLEDTEST",8); /// L2_OLED_ShowString(0,0,"12345678",16); // delay_ms(3000); /// L2_OLED_Clear(); ///打印太原理工 L1_OLED_ShowCHinese16X16(4,1,0);// L1_OLED_ShowCHinese16X16(22,1,1);// L1_OLED_ShowCHinese16X16(40,1,2);// L1_OLED_ShowCHinese16X16(58,1,3);// L1_OLED_ShowCHinese16X16(76,1,4);// L1_OLED_ShowCHinese16X16(94,1,5);// Lc_delay_ms(200); //// 888刷屏 for(lie = 0;lie < 16*8;lie += 8) { for(hang = 0;hang < 3;hang +=2) { L1_OLED_ShowChar(lie,hang,'8',D_8X16);////16lie 2hang ///Lc_delay_ms(3); } } /* /// delay_ms(1000); Lc_delay_ms(400); L2_OLED_Clear(); L1_OLED_ShowChar(0,0,'0',D_16X32); printf(" 0 "); Lc_delay_ms(800); L2_OLED_Clear(); L1_OLED_ShowChar(1*16,0,'1',D_16X32); printf(" 1 "); Lc_delay_ms(800); L2_OLED_Clear(); L1_OLED_ShowChar(2*16,0,'2',D_16X32); printf(" 2 "); Lc_delay_ms(800); Lc_delay_ms(1000); L2_OLED_Clear(); L1_OLED_ShowChar(0,0,'0',D_8X16); Lc_delay_ms(1000); L2_OLED_Clear(); L1_OLED_ShowChar(0,0,'0',D_6X8); Lc_delay_ms(1000); ///D_8X16 总共3行 0 1 2 L2_OLED_Clear(); L2_OLED_Showint3(0,0,120,D_8X16); Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Showint3(0,1,121,D_8X16); Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Showint3(0,2,222,D_8X16);//// Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Showint2(0,0,7,D_8X16); Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Showint2(0,1,17,D_8X16); Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Showint2(0,2,27,D_8X16); Lc_delay_ms(2000); //// 0-14 L2_OLED_Clear(); L2_OLED_Show_sint21(8*8,0,178,D_8X16); Lc_delay_ms(2000); L2_OLED_Clear(); L2_OLED_Show_sint21(11*8,0,118,D_8X16);//// 11 12 13 14 11.8 Lc_delay_ms(2000); ////16 32字体刷屏 L2_OLED_Clear(); printf("\r\n 01 "); L2_OLED_Showint2_16X32(0,0,12); Lc_delay_ms(100); printf("\r\n 23 "); L2_OLED_Showint2_16X32(2,0,34); Lc_delay_ms(100); printf("\r\n 45 "); L2_OLED_Showint2_16X32(4,0,56); Lc_delay_ms(100); printf("\r\n 67 "); L2_OLED_Showint2_16X32(6,0,78); */ /////////////////// L2_OLED_Clear(); L2_OLED_oht_init(); /// Lc_delay_ms(8000); /******** L1_OLED_ShowChar(8*6,0,'8',D_6X8); L1_OLED_ShowChar(9*6,0,'9',D_6X8); L1_OLED_ShowChar(10*6,0,'A',D_6X8); L1_OLED_ShowChar(11*6,0,'B',D_6X8); L1_OLED_ShowChar(12*6,0,'C',D_6X8); **/ // L1_OLED_ShowChar(0,8,'w',D_6X8); // L1_OLED_ShowChar(0,9,'w',D_6X8); } void IIC_Start() { OLED_SCLK_Set() ; OLED_SDIN_Set(); OLED_SDIN_Clr(); OLED_SCLK_Clr(); } /********************************************** //IIC Stop **********************************************/ void IIC_Stop() { OLED_SCLK_Clr(); OLED_SDIN_Clr(); OLED_SDIN_Set(); OLED_SCLK_Set() ; } /********************************************** // IIC Write byte **********************************************/ void L0_I2C_WR_Byte(unsigned char IIC_Byte) { unsigned char i; unsigned char m,da; da=IIC_Byte; for(i=0;i<8;i++) { m=da; OLED_SCLK_Clr(); m=m&0x80; if(m==0x80) {OLED_SDIN_Set();} else OLED_SDIN_Clr(); da=da<<1; OLED_SCLK_Set(); } OLED_SCLK_Clr(); OLED_SCLK_Set() ; } /********************************************** // IIC Write Command void L1_OLED_WR_1D(unsigned char IIC_Command) { IIC_Start(); L0_I2C_WR_Byte(0x78); //Slave address,SA0=0 L0_I2C_WR_Byte(0x00); //write command L0_I2C_WR_Byte(IIC_Command); IIC_Stop(); } **********************************************/ /********************************************** // IIC Write Data void Write_IIC_Data(unsigned char IIC_Data) { IIC_Start(); L0_I2C_WR_Byte(0x78); //D/C#=0; R/W#=0 L0_I2C_WR_Byte(0x40); //write data L0_I2C_WR_Byte(IIC_Data); IIC_Stop(); } **********************************************/ void L1_OLED_WR_1B(unsigned dat,unsigned cmd) { if(cmd) { IIC_Start(); L0_I2C_WR_Byte(0x78); //D/C#=0; R/W#=0 L0_I2C_WR_Byte(0x40); //write data L0_I2C_WR_Byte(dat); IIC_Stop(); } else { IIC_Start(); L0_I2C_WR_Byte(0x78); //Slave address,SA0=0 L0_I2C_WR_Byte(0x00); //write command L0_I2C_WR_Byte(dat); IIC_Stop(); } } /******************************************** // fill_Picture ********************************************/ /***********************Delay**************************** void fill_picture(unsigned char fill_Data) { unsigned char m,n; for(m=0;m<8;m++) { L1_OLED_WR_1B(0xb0+m,0); //page0-page1 L1_OLED_WR_1B(0x00,0); //low column start address L1_OLED_WR_1B(0x10,0); //high column start address for(n=0;n<128;n++) { L1_OLED_WR_1B(fill_Data,1); } } } void Delay_1ms(unsigned int Del_1ms) { unsigned char j; while(Del_1ms--) { for(j=0;j<123;j++); } } ***** void Delay_50ms(unsigned int Del_50ms) { unsigned int m; for(;Del_50ms>0;Del_50ms--) for(m=6245;m>0;m--); } *******/ //坐标设置 void L1_OLED_Set_Pos(unsigned char x, unsigned char y) { L1_OLED_WR_1B(0xb0+y,OLED_CMD); L1_OLED_WR_1B(((x&0xf0)>>4)|0x10,OLED_CMD); L1_OLED_WR_1B((x&0x0f),OLED_CMD); } //开启OLED显示 void L2_OLED_Display_On(void) { L1_OLED_WR_1B(0X8D,OLED_CMD); //SET DCDC命令 L1_OLED_WR_1B(0X14,OLED_CMD); //DCDC ON L1_OLED_WR_1B(0XAF,OLED_CMD); //DISPLAY ON } //关闭OLED显示 void L2_OLED_Display_Off(void) { L1_OLED_WR_1B(0X8D,OLED_CMD); //SET DCDC命令 L1_OLED_WR_1B(0X10,OLED_CMD); //DCDC OFF L1_OLED_WR_1B(0XAE,OLED_CMD); //DISPLAY OFF } //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void L2_OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { L1_OLED_WR_1B (0xb0+i,OLED_CMD); //设置页地址(0~7) L1_OLED_WR_1B (0x00,OLED_CMD); //设置显示位置—列低地址 L1_OLED_WR_1B (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)L1_OLED_WR_1B(0,OLED_DATA); } //更新显示 } /********* void OLED_On(void) { u8 i,n; for(i=0;i<8;i++) { L1_OLED_WR_1B (0xb0+i,OLED_CMD); //设置页地址(0~7) L1_OLED_WR_1B (0x00,OLED_CMD); //设置显示位置—列低地址 L1_OLED_WR_1B (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)L1_OLED_WR_1B(1,OLED_DATA); } //更新显示 } //m^n函数 u32 oled_pow(u8 m,u8 n) { u32 result=1; while(n--)result*=m; return result; } ********/ //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~32 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void L1_OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) { unsigned char c = 0,i = 0,j = 0; u16 d = 0; c = chr-' ';//得到偏移后的值 if (c> 94) c = 94; if(x > Max_Column-1){x=0;y=y+2;} switch (Char_Size) { case D_6X8: L1_OLED_Set_Pos(x,y); for(i = 0;i < 6;i ++) L1_OLED_WR_1B(F6x8[c][i],OLED_DATA); break; case D_8X16: L1_OLED_Set_Pos(x,y); /// printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); for(i = 0;i < 8;i ++) { d = c;d *= 16;d += i;/////c*16+i L1_OLED_WR_1B(char8X16[d],OLED_DATA); /// printf(" %2d_%2X ",(int)d,(int)char8X16[d]); } L1_OLED_Set_Pos(x,y+1); /// printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); for(i = 0;i < 8;i ++) { d = c;d *= 16;d += i;d += 8;/////c*16+i+8 L1_OLED_WR_1B(char8X16[d],OLED_DATA); /// printf(" %2d_%2X ",(int)d,(int)char8X16[d]); } break; case D_16X32: ///printf("\r\n<%2d %2d> %d %d - \r\n",(int)x,(int)y,(int)chr,(int)c); for(j = 0;j < 4;j ++) { L1_OLED_Set_Pos(x,y + j); ////printf("\r\n(%2d %2d %d) ",(int)x,(int)(y+j),(int)(j)); for(i = 0;i < 16;i ++) { ///d = c*16*4 + i + j*16; d = c;d *= 64; d += i; d += (j*16); L1_OLED_WR_1B(char16X32[d],OLED_DATA); ///printf(" %2d.%2X ",(int)d,(int)char16X32[d]); } } break; default: break; } } ///char8X16 void OLED_ShowChar8X16(u8 x,u8 y,u8 chr) { u16 c = 0,i = 0,d = 0; c = chr - ' '; //得到偏移后的值 if(x > Max_Column-1){x=0;y=y+2;} L1_OLED_Set_Pos(x,y); printf("(%2d %2d) %d %d -",(int)x,(int)y,(int)chr,(int)c); for(i=0;i<8;i++) { L1_OLED_WR_1B(char8X16[c*16+i],OLED_DATA); d = c*16+i ; printf(" %2d ",(int)d); } L1_OLED_Set_Pos(x,y+1); printf("(%2d %2d) ",(int)x,(int)y); for(i=0;i<8;i++) { L1_OLED_WR_1B(char8X16[c*16+i+8],OLED_DATA); d = c*16+i+8; printf(" %2d ",(int)d); } } //// void OLED_ShowChar16X32(u8 x,u8 y,u8 chr) { u16 c = 0,i = 0,j = 0,d = 0; c = chr - ' '; //得到偏移后的值 if(x > Max_Column-1){x=0;y=y+2;} printf("\r\n<%2d %2d> %2X %d - \r\n",(int)x,(int)y,(int)chr,(int)c); for(j=0;j<4;j++)////4行 8bits { L1_OLED_Set_Pos(x,y + j); printf("\r\n(%2d %2d %d) ",(int)x,(int)(y+j),(int)(j)); for(i=0;i<16;i++)/// 16列 { d = c*16*4 + i + j*16; L1_OLED_WR_1B(char16X32[d],OLED_DATA); printf(" %2d.%2X ",(int)d,(int)char16X32[d]); } } } //显示一个字符号串 void L2_OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size) { unsigned char j=0; while (chr[j]!='\0') { L1_OLED_ShowChar(x,y,chr[j],Char_Size); x += 8; if(x>120) {x = 0;y += 2;} j ++; } } //显示汉字 void L1_OLED_ShowCHinese16X16(u8 x,u8 y,u8 no) { u8 t,adder=0; L1_OLED_Set_Pos(x,y); for(t=0;t<16;t++) { L1_OLED_WR_1B(Hzk_tylg[2*no][t],OLED_DATA); adder+=1; } L1_OLED_Set_Pos(x,y+1); for(t=0;t<16;t++) { L1_OLED_WR_1B(Hzk_tylg[2*no+1][t],OLED_DATA); adder+=1; } } //初始化SSD1306 void L1_OLED_Init(void) { ///delay_ms(100); L1_OLED_WR_1B(0xAE,OLED_CMD);//关闭显示 L1_OLED_WR_1B(0x40,OLED_CMD);//---set low column address L1_OLED_WR_1B(0xB0,OLED_CMD);//---set high column address L1_OLED_WR_1B(0xC8,OLED_CMD);//-not offset L1_OLED_WR_1B(0x81,OLED_CMD);//设置对比度 L1_OLED_WR_1B(0xff,OLED_CMD); L1_OLED_WR_1B(0xa1,OLED_CMD);//段重定向设置 L1_OLED_WR_1B(0xa6,OLED_CMD);// L1_OLED_WR_1B(0xa8,OLED_CMD);//设置驱动路数 L1_OLED_WR_1B(0x1f,OLED_CMD); L1_OLED_WR_1B(0xd3,OLED_CMD); L1_OLED_WR_1B(0x00,OLED_CMD); L1_OLED_WR_1B(0xd5,OLED_CMD); L1_OLED_WR_1B(0xf0,OLED_CMD); L1_OLED_WR_1B(0xd9,OLED_CMD); L1_OLED_WR_1B(0x22,OLED_CMD); L1_OLED_WR_1B(0xda,OLED_CMD); L1_OLED_WR_1B(0x02,OLED_CMD); L1_OLED_WR_1B(0xdb,OLED_CMD); L1_OLED_WR_1B(0x49,OLED_CMD); L1_OLED_WR_1B(0x8d,OLED_CMD); L1_OLED_WR_1B(0x14,OLED_CMD); L1_OLED_WR_1B(0xaf,OLED_CMD); L2_OLED_Clear(); } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~31 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void L2_OLED_Showint3(u8 x,u8 y,u16 inta,u8 Char_Size) { Lc_int2str_3(inta,ts_oled.d); L2_OLED_ShowString(x,y,ts_oled.d,Char_Size); } void L2_OLED_Showint2(u8 x,u8 y,u16 inta,u8 Char_Size) { Lc_int2str_2(inta,ts_oled.d); L2_OLED_ShowString(x,y,ts_oled.d,Char_Size); } ////-12.3 表示温度 void L2_OLED_Show_sint21_6X8(u8 x,u8 y,int inta) { Lc_sint2str_2_1(inta,ts_oled.d); L1_OLED_ShowChar(x,y,ts_oled.d[0],D_6X8); L1_OLED_ShowChar(x+6,y,ts_oled.d[1],D_6X8); L1_OLED_ShowChar(x+6+6,y,ts_oled.d[2],D_6X8); L1_OLED_ShowChar(x+6+6+6,y,ts_oled.d[3],D_6X8); L1_OLED_ShowChar(x+6+6+6+6,y,ts_oled.d[4],D_6X8); } /////0 1 2 3 4 5 6 7 /////y = 0 void L2_OLED_Showint2_16X32(u8 x,u8 y,u8 inta) { x *= 16; Lc_uc2str_2(inta,ts_oled.d); ////printf("\r\n <%s> %2X %2X", (char*)ts_oled.d, (int)ts_oled.d[1], (int)ts_oled.d[0]); L1_OLED_ShowChar(x,y,ts_oled.d[0],D_16X32); L1_OLED_ShowChar(x+16,y,ts_oled.d[1],D_16X32); } void L2_OLED_Showint3_16X32(u8 x,u8 y,u8 inta) { x*=16; Lc_int2str_3(inta,ts_oled.d); L1_OLED_ShowChar(x,y,ts_oled.d[0],D_16X32); L1_OLED_ShowChar(x+16,y,ts_oled.d[1],D_16X32); L1_OLED_ShowChar(x+16+16,y,ts_oled.d[2],D_16X32); } #if 0 /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/ 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