OLED屏的点亮使用的是模拟IIC功能实现
OLED屏为像素自发光,其尺寸多为128*64,表示横轴上有128个像素,纵轴上有64个像素。
本章将提供使用软件取模的详细介绍,及编程全部代码和注释。
部分结果展示:
字体取模方法
软件下载
链接:https://pan.baidu.com/s/1c5uz6CE97aakRtx9hMXqtQ
提取码:2df6
取模软件使用介绍:
1、汉字取模:
2、图片取模:ps -> 画图 -> 取模软件 -> c代码数组
将保存到头文件的数组内容直接读取即可使用
51代码(未测试)
1 #include "REG51.h" 2 unsigned char code F6x8[][6]; 3 unsigned char code F8X16[]; 4 unsigned char code China[][32]; 5 unsigned char code photox[]; 6 7 sbit OLED_SCL=P1^0;//时钟 D0(SCLK? 8 sbit OLED_SDA=P1^1;//D1(MOSI) 数据 9 10 11 12 void iic_delay(){//延时函数 13 //int i; 14 //for(i=16;i>0;i--);//us=(3+5*9)/12 15 } 16 17 18 void IIC_Start()//开始信号 SDA下降沿 19 { 20 21 OLED_SDA=1; 22 iic_delay(); 23 OLED_SCL=1; 24 iic_delay(); 25 OLED_SDA=0; 26 } 27 28 void IIC_Stop()//停止信号 SDA上升沿 29 { 30 OLED_SDA = 0; 31 iic_delay(); 32 OLED_SCL = 1; 33 iic_delay(); 34 OLED_SDA = 1; 35 } 36 37 void IIC_Wait_Ack()//发送应答信号 38 { 39 OLED_SCL=1; 40 OLED_SCL=0; 41 } 42 43 void Write_IIC_Byte(unsigned char wdata)//写一个字节 44 { 45 unsigned char i,temp,temp1; 46 temp1 = wdata; 47 for (i = 0; i < 8; i++) 48 { 49 OLED_SCL = 0; 50 iic_delay(); 51 temp = temp1; 52 temp = temp&0x80; 53 OLED_SDA = (temp == 0x80? 1: 0); 54 iic_delay(); 55 OLED_SCL = 1; 56 iic_delay(); 57 OLED_SCL = 0; 58 iic_delay(); 59 temp1 <<= 1; 60 } 61 } 62 63 void iic_write(unsigned char byte_add,unsigned char wdata)//按地址写入一字节数据 64 { 65 66 IIC_Start(); //起始信号 67 68 Write_IIC_Byte(0x78);//写器件地址 69 70 IIC_Wait_Ack(); 71 72 Write_IIC_Byte(byte_add);//内部寄存器地址 73 74 IIC_Wait_Ack(); 75 76 Write_IIC_Byte(wdata);//内部寄存器数据 77 78 IIC_Wait_Ack(); 79 80 IIC_Stop(); 81 } 82 83 void OLED_W_UP(unsigned char wdata,unsigned char orderx )//写字节分支判断 84 { 85 if(orderx) iic_write(0x40,wdata);//0x40 写数据 86 87 else iic_write(0x00,wdata);//0x00 写命令 88 89 } 90 //坐标设置 91 92 void OLED_Set_Pos(unsigned char x, unsigned char y) 93 { OLED_W_UP(0xb0+y,0); 94 OLED_W_UP(((x&0xf0)>>4)|0x10,0); 95 OLED_W_UP((x&0x0f),0); 96 } 97 98 //开启OLED显示 99 void OLED_Display_On(void) 100 { 101 OLED_W_UP(0X8D,0); //SET DCDC命令 102 OLED_W_UP(0X14,0); //DCDC ON 103 OLED_W_UP(0XAF,0); //DISPLAY ON 104 } 105 106 //关闭OLED显示 107 void OLED_Display_Off(void) 108 { 109 OLED_W_UP(0X8D,0); //SET DCDC命令 110 OLED_W_UP(0X10,0); //DCDC OFF 111 OLED_W_UP(0XAE,0); //DISPLAY OFF 112 } 113 114 void OLED_show_photo(unsigned char BMP[])//填充照片,照片大小等于 128*64 115 { 116 unsigned int j=0; 117 unsigned char x,y; 118 for(y=0;y<8;y++) 119 { 120 OLED_Set_Pos(0,y); 121 for(x=0;x<128;x++) 122 { 123 OLED_W_UP(BMP[j++],1); 124 } 125 } 126 } 127 128 //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! 129 void OLED_Clear(void) 130 { 131 unsigned char i,n; 132 for(i=0;i<8;i++) 133 { 134 OLED_W_UP (0xb0+i,0); //设置页地址(0~7) 135 OLED_W_UP (0x00,0); //设置显示位置—列低地址 136 OLED_W_UP (0x10,0); //设置显示位置—列高地址 137 for(n=0;n<128;n++)OLED_W_UP(0,1); //写0x00到屏幕寄存器上 138 } 139 } 140 //在指定位置显示一个字符串 141 //x:0~127 142 //y:0~8 143 //size:选择字体 16/8 144 void OLED_show_str(unsigned char x,unsigned char y,unsigned char *chr,unsigned char sizex) 145 { 146 unsigned char j=0; 147 while (chr[j]!='