C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:41:43 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 #include "oled.h" 3 //#include "stdlib.h" 4 #include "oledfont.h" 5 //#include "delay.h" 6 //OLED的显存 7 //存放格式如下. 8 //[0]0 1 2 3 ... 127 9 //[1]0 1 2 3 ... 127 10 //[2]0 1 2 3 ... 127 11 //[3]0 1 2 3 ... 127 12 //[4]0 1 2 3 ... 127 13 //[5]0 1 2 3 ... 127 14 //[6]0 1 2 3 ... 127 15 //[7]0 1 2 3 ... 127 16 void delay_ms(unsigned int ms) 17 { 18 1 unsigned int a; 19 1 while(ms) 20 1 { 21 2 a=1800; 22 2 while(a--); 23 2 ms--; 24 2 } 25 1 return; 26 1 } 27 #if OLED_MODE==1 //向SSD1106写入一个字节。 //dat:要写入的数据/命令 //cmd:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 cmd) { DATAOUT(dat); if(cmd) OLED_DC_Set(); else OLED_DC_Clr(); OLED_CS_Clr(); OLED_WR_Clr(); OLED_WR_Set(); OLED_CS_Set(); OLED_DC_Set(); } #else 45 //向SSD1306写入一个字节。 46 //dat:要写入的数据/命令 47 //cmd:数据/命令标志 0,表示命令;1,表示数据; 48 void OLED_WR_Byte(u8 dat,u8 cmd) 49 { 50 1 u8 i; 51 1 if(cmd) 52 1 OLED_DC_Set(); 53 1 else 54 1 OLED_DC_Clr(); C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:41:43 PAGE 2 55 1 OLED_CS_Clr(); 56 1 for(i=0;i<8;i++) 57 1 { 58 2 OLED_SCLK_Clr(); 59 2 if(dat&0x80) 60 2 { 61 3 OLED_SDIN_Set(); 62 3 } 63 2 else 64 2 OLED_SDIN_Clr(); 65 2 OLED_SCLK_Set(); 66 2 dat<<=1; 67 2 } 68 1 OLED_CS_Set(); 69 1 OLED_DC_Set(); 70 1 } 71 #endif 72 void OLED_Set_Pos(unsigned char x, unsigned char y) 73 { 74 1 OLED_WR_Byte(0xb0+y,OLED_CMD); 75 1 OLED_WR_Byte((((x+2)&0xf0)>>4)|0x10,OLED_CMD); 76 1 OLED_WR_Byte(((x+2)&0x0f),OLED_CMD); 77 1 } 78 //开启OLED显示 79 void OLED_Display_On(void) 80 { 81 1 OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 82 1 OLED_WR_Byte(0X14,OLED_CMD); //DCDC ON 83 1 OLED_WR_Byte(0XAF,OLED_CMD); //DISPLAY ON 84 1 } 85 //关闭OLED显示 86 void OLED_Display_Off(void) 87 { 88 1 OLED_WR_Byte(0X8D,OLED_CMD); //SET DCDC命令 89 1 OLED_WR_Byte(0X10,OLED_CMD); //DCDC OFF 90 1 OLED_WR_Byte(0XAE,OLED_CMD); //DISPLAY OFF 91 1 } 92 //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! 93 void OLED_Clear(void) 94 { 95 1 u8 i,n; 96 1 for(i=0;i<8;i++) 97 1 { 98 2 OLED_WR_Byte (0xb0+i,OLED_CMD); //设置页地址(0~7) 99 2 OLED_WR_Byte (0x02,OLED_CMD); //设置显示位置—列低地址 100 2 OLED_WR_Byte (0x10,OLED_CMD); //设置显示位置—列高地址 101 2 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 102 2 } //更新显示 103 1 } 104 105 106 //在指定位置显示一个字符,包括部分字符 107 //x:0~127 108 //y:0~63 109 //mode:0,反白显示;1,正常显示 110 //size:选择字体 16/12 111 void OLED_ShowChar(u8 x,u8 y,u8 chr) 112 { 113 1 unsigned char c=0,i=0; 114 1 c=chr-' ';//得到偏移后的值 115 1 if(x>Max_Column-1){x=0;y=y+2;} 116 1 if(SIZE ==16) C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:41:43 PAGE 3 117 1 { 118 2 OLED_Set_Pos(x,y); 119 2 for(i=0;i<8;i++) 120 2 OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); 121 2 OLED_Set_Pos(x,y+1); 122 2 for(i=0;i<8;i++) 123 2 OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA); 124 2 } 125 1 else { 126 2 OLED_Set_Pos(x,y+1); 127 2 for(i=0;i<6;i++) 128 2 OLED_WR_Byte(F6x8[c][i],OLED_DATA); 129 2 130 2 } 131 1 } 132 //m^n函数 133 u32 oled_pow(u8 m,u8 n) 134 { 135 1 u32 result=1; 136 1 while(n--)result*=m; 137 1 return result; 138 1 } 139 //显示2个数字 140 //x,y :起点坐标 141 //len :数字的位数 142 //size:字体大小 143 //mode:模式 0,填充模式;1,叠加模式 144 //num:数值(0~4294967295); 145 void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2) 146 { 147 1 u8 t,temp; 148 1 u8 enshow=0; 149 1 for(t=0;t120){x=0;y+=2;} 172 2 j++; 173 2 } 174 1 } 175 //显示汉字 176 void OLED_ShowCHinese(u8 x,u8 y,u8 no) 177 { 178 1 u8 t,adder=0; C51 COMPILER V9.52.0.0 OLED 05/03/2018 10:41:43 PAGE 4 179 1 OLED_Set_Pos(x,y); 180 1 for(t=0;t<16;t++) 181 1 { 182 2 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA); 183 2 adder+=1; 184 2 } 185 1 OLED_Set_Pos(x,y+1); 186 1 for(t=0;t<16;t++) 187 1 { 188 2 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA); 189 2 adder+=1; 190 2 } 191 1 } 192 /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7**************** -*/ 193 void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[ -]) 194 { 195 1 unsigned int j=0; 196 1 unsigned char x,y; 197 1 198 1 if(y1%8==0) y=y1/8; 199 1 else y=y1/8+1; 200 1 for(y=y0;y