首页 > 编程知识 正文

第十四章096寸OLED12864显示屏

时间:2023-05-06 00:10:51 阅读:216436 作者:1239

MCU Interface Selection

----------------------这里说下通过字模软件来提取库

 

                        ---------6800

                        ---------8080

                        ---------4线制的SPI

                        ----------3线制的SPI

                       -----------IIC接口

/**********************************************//IIC Start**********************************************/void IIC_Start(){OLED_SCL=1;OLED_SDIN=1;OLED_SDIN=0;OLED_SCL=0;}/**********************************************//IIC Stop**********************************************/void IIC_Stop(){OLED_SCL=1;OLED_SDIN=0;OLED_SDIN=1;}/**********************************************// IIC Write byte**********************************************/void Write_IIC_Byte(unsigned char IIC_Byte){unsigned char i;unsigned char m,da;da=IIC_Byte;OLED_SCL=0;for(i=0;i<8;i++){m=da;m=m&0x80;if(m==0x80){ OLED_SDIN=1; }else OLED_SDIN=0;da=da<<1; OLED_SCL=1; OLED_SCL=0;}}void IIC_Wait_Ack(){// GPIOB->CRH &= 0XFFF0FFFF;//设置PB12为上拉输入模式// GPIOB->CRH |= 0x00080000; //OLED_SDA = 1; //delay_us(1);// OLED_SCL = 1;// delay_us(50000); /*while(1) { if(!OLED_SDA)//判断是否接收到OLED 应答信号 { //GPIOB->CRH &= 0XFFF0FFFF;//设置PB12为通用推免输出模式 //GPIOB->CRH |= 0x00030000; return; } } */ OLED_SCLK_Set() ; OLED_SCLK_Clr(); }

1--应用层

/**********************************************// IIC Write Command**********************************************/void Write_IIC_Command(unsigned char IIC_Command){ IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0IIC_Wait_Ack(); Write_IIC_Byte(0x00); //write commandIIC_Wait_Ack(); Write_IIC_Byte(IIC_Command); IIC_Wait_Ack(); IIC_Stop();}/**********************************************// IIC Write Data**********************************************/void Write_IIC_Data(unsigned char IIC_Data){ IIC_Start(); Write_IIC_Byte(0x78);//D/C#=0; R/W#=0IIC_Wait_Ack(); Write_IIC_Byte(0x40);//write dataIIC_Wait_Ack(); Write_IIC_Byte(IIC_Data);IIC_Wait_Ack(); IIC_Stop();}/***********************************************/***********************************************void OLED_WR_Byte(unsigned dat,unsigned cmd){if(cmd){ Write_IIC_Data(dat); }else { Write_IIC_Command(dat);}}

2---上层

#define OLED_CMD 0// 写命令//坐标设置void OLED_Set_Pos(unsigned char x, unsigned char y) { OLED_WR_Byte(0xb0+y, OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10, OLED_CMD);OLED_WR_Byte((x&0x0f), OLED_CMD); }//开启OLED显示 void OLED_Display_On(void){OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD); //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON}//关闭OLED显示 void OLED_Display_Off(void){OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF}//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示}//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD); //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示} //在指定位置显示一个字符,包括部分字符//x:0~127//y:0~63//mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size){ unsigned char c = 0, i = 0;c = chr - ' ';//得到偏移后的值if (x > Max_Column-1){x = 0;y = y + 2;}if (Char_Size == 16){OLED_Set_Pos(x, y);for(i=0; i<8; i++)OLED_WR_Byte(F8X16[c*16+i], OLED_DATA);OLED_Set_Pos(x, y + 1);for(i=0; i<8; i++)OLED_WR_Byte(F8X16[c*16+i+8], OLED_DATA);}else {OLED_Set_Pos(x, y);for(i=0; i<6; i++)OLED_WR_Byte(F6x8[c][i], OLED_DATA);}}//显示一个字符号串void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size){unsigned char j=0;while (chr[j]!=''){OLED_ShowChar(x,y,chr[j],Char_Size);x+=8;if(x>120){x=0;y+=2;}j++;}}//显示汉字void OLED_ShowCHinese(u8 x, u8 y, u8 no){ u8 t, adder = 0;OLED_Set_Pos(x, y); for(t=0;t<16;t++){OLED_WR_Byte(Hzk[no][t], OLED_DATA);adder += 1;}OLED_Set_Pos(x, y+1); for(t=0; t<16; t++){OLED_WR_Byte(Hzk[no][t+16], OLED_DATA);adder += 1;}}/***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1, u8 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_WR_Byte(BMP[j++], OLED_DATA); }}}

3----初始化

//初始化SSD1306 void OLED_Init(void){ OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128 OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel}

主函数:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。