C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:37:07 PAGE 1 C51 COMPILER V9.52.0.0, COMPILATION OF MODULE OLED OBJECT MODULE PLACED IN oled.obj COMPILER INVOKED BY: D:\KEIL_51\C51\BIN\C51.EXE SRC\oled.c BROWSE INCDIR(.\SRC) DEBUG OBJECTEXTEND PRINT(.\oled.lst) TAB -S(2) OBJECT(oled.obj) line level source 1 ////////////////////////////////////////////////////////////////////////////////// 2 //本程序只供学习使用,未经作者许可,不得用于其它任何用途 3 //中景园电子 4 //店铺地址:http://shop73023976.taobao.com/?spm=2013.1.0.0.M4PqC2 5 // 6 // 文 件 名 : main.c 7 // 版 本 号 : v2.0 8 // 作 者 : HuangKai 9 // 生成日期 : 2014-0101 10 // 最近修改 : 11 // 功能描述 : OLED 4接口演示例程(51系列) 12 // 说明: 13 // ---------------------------------------------------------------- 14 // GND 电源地 15 // VCC 接5V或3.3v电源 16 // D0 P1^0(SCL) 17 // D1 P1^1(SDA) 18 // RES 接P12 19 // DC 接P13 20 // CS 接P14 21 // ---------------------------------------------------------------- 22 // 修改历史 : 23 // 日 期 : 24 // 作 者 : HuangKai 25 // 修改内容 : 创建文件 26 //版权所有,盗版必究。 27 //Copyright(C) 中景园电子2014/3/16 28 //All rights reserved 29 //******************************************************************************/。 30 #include "oled.h" 31 //#include "stdlib.h" 32 #include "oledfont.h" 33 //#include "delay.h" 34 //OLED的显存 35 //存放格式如下. 36 //[0]0 1 2 3 ... 127 37 //[1]0 1 2 3 ... 127 38 //[2]0 1 2 3 ... 127 39 //[3]0 1 2 3 ... 127 40 //[4]0 1 2 3 ... 127 41 //[5]0 1 2 3 ... 127 42 //[6]0 1 2 3 ... 127 43 //[7]0 1 2 3 ... 127 44 void delay_ms(unsigned int ms) 45 { 46 1 unsigned int a; 47 1 while(ms) 48 1 { 49 2 a=1800; 50 2 while(a--); 51 2 ms--; 52 2 } 53 1 return; 54 1 } C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:37:07 PAGE 2 55 /********************************************** 56 //IIC Start 57 **********************************************/ 58 void IIC_Start() 59 { 60 1 61 1 OLED_SCLK_Set() ; 62 1 OLED_SDIN_Set(); 63 1 OLED_SDIN_Clr(); 64 1 OLED_SCLK_Clr(); 65 1 } 66 67 /********************************************** 68 //IIC Stop 69 **********************************************/ 70 void IIC_Stop() 71 { 72 1 OLED_SCLK_Set() ; 73 1 // OLED_SCLK_Clr(); 74 1 OLED_SDIN_Clr(); 75 1 OLED_SDIN_Set(); 76 1 77 1 } 78 79 void IIC_Wait_Ack() 80 { 81 1 82 1 //GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为上拉输入模式 83 1 //GPIOB->CRH |= 0x00080000; 84 1 // OLED_SDA = 1; 85 1 // delay_us(1); 86 1 //OLED_SCL = 1; 87 1 //delay_us(50000); 88 1 /* while(1) 89 1 { 90 1 if(!OLED_SDA) //判断是否接收到OLED 应答信号 91 1 { 92 1 //GPIOB->CRH &= 0XFFF0FFFF; //设置PB12为通用推免输出模式 93 1 //GPIOB->CRH |= 0x00030000; 94 1 return; 95 1 } 96 1 } 97 1 */ 98 1 OLED_SCLK_Set() ; 99 1 OLED_SCLK_Clr(); 100 1 } 101 /********************************************** 102 // IIC Write byte 103 **********************************************/ 104 105 void Write_IIC_Byte(unsigned char IIC_Byte) 106 { 107 1 unsigned char i; 108 1 unsigned char m,da; 109 1 da=IIC_Byte; 110 1 OLED_SCLK_Clr(); 111 1 for(i=0;i<8;i++) 112 1 { 113 2 m=da; 114 2 // OLED_SCLK_Clr(); 115 2 m=m&0x80; 116 2 if(m==0x80) C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:37:07 PAGE 3 117 2 {OLED_SDIN_Set();} 118 2 else OLED_SDIN_Clr(); 119 2 da=da<<1; 120 2 OLED_SCLK_Set(); 121 2 OLED_SCLK_Clr(); 122 2 } 123 1 124 1 125 1 } 126 /********************************************** 127 // IIC Write Command 128 **********************************************/ 129 void Write_IIC_Command(unsigned char IIC_Command) 130 { 131 1 IIC_Start(); 132 1 Write_IIC_Byte(0x78); //Slave address,SA0=0 133 1 IIC_Wait_Ack(); 134 1 Write_IIC_Byte(0x00); //write command 135 1 IIC_Wait_Ack(); 136 1 Write_IIC_Byte(IIC_Command); 137 1 IIC_Wait_Ack(); 138 1 IIC_Stop(); 139 1 } 140 /********************************************** 141 // IIC Write Data 142 **********************************************/ 143 void Write_IIC_Data(unsigned char IIC_Data) 144 { 145 1 IIC_Start(); 146 1 Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 147 1 IIC_Wait_Ack(); 148 1 Write_IIC_Byte(0x40); //write data 149 1 IIC_Wait_Ack(); 150 1 Write_IIC_Byte(IIC_Data); 151 1 IIC_Wait_Ack(); 152 1 IIC_Stop(); 153 1 } 154 void OLED_WR_Byte(unsigned dat,unsigned cmd) 155 { 156 1 if(cmd) 157 1 { 158 2 159 2 Write_IIC_Data(dat); 160 2 161 2 } 162 1 else { 163 2 Write_IIC_Command(dat); 164 2 165 2 } 166 1 167 1 168 1 } 169 170 /******************************************** 171 // fill_Picture 172 ********************************************/ 173 void fill_picture(unsigned char fill_Data) 174 { 175 1 unsigned char m,n; 176 1 for(m=0;m<8;m++) 177 1 { 178 2 OLED_WR_Byte(0xb0+m,0); //page0-page1 C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:37:07 PAGE 4 179 2 OLED_WR_Byte(0x02,0); //low column start address 180 2 OLED_WR_Byte(0x10,0); //high column start address 181 2 for(n=0;n<128;n++) 182 2 { 183 3 OLED_WR_Byte(fill_Data,1); 184 3 } 185 2 } 186 1 } 187 188 189 /***********************Delay****************************************/ 190 void Delay_50ms(unsigned int Del_50ms) 191 { 192 1 unsigned int m; 193 1 for(;Del_50ms>0;Del_50ms--) 194 1 for(m=6245;m>0;m--); 195 1 } 196 197 void Delay_1ms(unsigned int Del_1ms) 198 { 199 1 unsigned char j; 200 1 while(Del_1ms--) 201 1 { 202 2 for(j=0;j<123;j++); 203 2 } 204 1 } 205 206 //坐标设置 207 208 void OLED_Set_Pos(unsigned char x, unsigned char y) 209 { 210 1 OLED_WR_Byte(0xb0+y,OLED_CMD); 211 1 OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD); 212 1 OLED_WR_Byte(((x+2)&0x0f),OLED_CMD); 213 1 } 214 //开启OLED显示 215 void OLED_Display_On(void) 216 { 217 1 OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 218 1 OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON 219 1 OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON 220 1 } 221 //关闭OLED显示 222 void OLED_Display_Off(void) 223 { 224 1 OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 225 1 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF 226 1 OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF 227 1 } 228 //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! 229 void OLED_Clear(void) 230 { 231 1 u8 i,n; 232 1 for(i=0;i<8;i++) 233 1 { 234 2 OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) 235 2 OLED_WR_Byte (0x02,OLED_CMD); //设置显示位置—列低地址 236 2 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 237 2 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 238 2 } //更新显示 239 1 } 240 void OLED_On(void) C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:37:07 PAGE 5 241 { 242 1 u8 i,n; 243 1 for(i=0;i<8;i++) 244 1 { 245 2 OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) 246 2 OLED_WR_Byte (0x02,OLED_CMD); //设置显示位置—列低地址 247 2 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 248 2 for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA); 249 2 } //更新显示 250 1 } 251 //在指定位置显示一个字符,包括部分字符 252 //x:0~127 253 //y:0~63 254 //mode:0,反白显示;1,正常显示 255 //size:选择字体 16/12 256 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) 257 { 258 1 unsigned char c=0,i=0; 259 1 c=chr-' ';//得到偏移后的值 260 1 if(x>Max_Column-1){x=0;y=y+2;} 261 1 if(Char_Size ==16) 262 1 { 263 2 OLED_Set_Pos(x,y); 264 2 for(i=0;i<8;i++) 265 2 OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); 266 2 OLED_Set_Pos(x,y+1); 267 2 for(i=0;i<8;i++) 268 2 OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); 269 2 } 270 1 else { 271 2 OLED_Set_Pos(x,y); 272 2 for(i=0;i<6;i++) 273 2 OLED_WR_Byte(F6x8[c][i],OLED_DATA); 274 2 275 2 } 276 1 } 277 //m^n函数 278 u32 oled_pow(u8 m,u8 n) 279 { 280 1 u32 result=1; 281 1 while(n--)result*=m; 282 1 return result; 283 1 } 284 //显示2个数字 285 //x,y :起点坐标 286 //len :数字的位数 287 //size:字体大小 288 //mode:模式 0,填充模式;1,叠加模式 289 //num:数值(0~4294967295); 290 void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) 291 { 292 1 u8 t,temp; 293 1 u8 enshow=0; 294 1 for(t=0;t120){x=0;y+=2;} 317 2 j++; 318 2 } 319 1 } 320 //显示汉字 321 void OLED_ShowCHinese(u8 x,u8 y,u8 no) 322 { 323 1 u8 t,adder=0; 324 1 OLED_Set_Pos(x,y); 325 1 for(t=0;t<16;t++) 326 1 { 327 2 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); 328 2 adder+=1; 329 2 } 330 1 OLED_Set_Pos(x,y+1); 331 1 for(t=0;t<16;t++) 332 1 { 333 2 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); 334 2 adder+=1; 335 2 } 336 1 } 337 /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7**************** -*/ 338 void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[ -]) 339 { 340 1 unsigned int j=0; 341 1 unsigned char x,y; 342 1 343 1 if(y1%8==0) y=y1/8; 344 1 else y=y1/8+1; 345 1 for(y=y0;y