看了好多同样的贴子,解决不了我的问题,代码是之前写OLED的代码,之前可以运行,修改了一下,就报错了,求大佬帮忙一下
可以复制粘贴运行一下,有3的文件:OLED.c、OLED.h、zk16x16.h(字库)
首先是OLED.c文件:
#include <reg52.h>
#include <intrins.h>
#include "zk16x16.h" //16*18点阵汉字库
#include "OLED.h"
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define SCL_high SCL=1 //SCL高电平
#define SCL_low SCL=0 //SCL低电平
#define SDA_high SDA_OLED=1 //SDA高电平
#define SDA_low SDA_OLED=0 //SDA低电平
sbit SDA_OLED = P2^1;
sbit SCL = P2^0;
//I2C总线启动信号
void IIC_Start(void)
{
SDA_high;
SCL_high;
SDA_low;
SCL_low;
}
//I2C总线停止信号
void IIC_Stop(void)
{
SDA_low;
SCL_high;
SDA_high;
}
//等待应答
bit IIC_WaitAck(void)
{
bit ackbit;
SCL_high;
ackbit = SDA_OLED;
SCL_low;
return ackbit;
}
//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL_low;
if(byt & 0x80) SDA_high;
else SDA_low;
SCL_high;
byt <<= 1;
}
SCL = 0;
}
//延时函数
void delay(unsigned int ms)
{
unsigned int a;
while(ms)
{
a=1800;
while(a--);
ms--;
}
return;
}
//反显函数
void OLED_ColorTurn(unsigned char i)
{
if(i==0)
{
OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
}
if(i==1)
{
OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
}
}
//屏幕旋转180度
void OLED_DisplayTurn(unsigned char i)
{
if(i==0)
{
OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
OLED_WR_Byte(0xA1,OLED_CMD);
}
if(i==1)
{
OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
OLED_WR_Byte(0xA0,OLED_CMD);
}
}
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void)
{
unsigned char 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);
} //更新显示
}
//发送一个字节
//向SSD1306写入一个字节。
//mode:数据/命令标志 0,表示命令;1,表示数据;
void OLED_WR_Byte(unsigned char dat,unsigned char mode)
{
IIC_Start(); //IIC起始信号
IIC_SendByte(0x78); //IIC从机地址SA0=0
IIC_WaitAck(); //IIC应答信号
if(mode){IIC_SendByte(0x40);} //mode=1,写入数据,0x40写命令
else{IIC_SendByte(0x00);} //mode=0,写入命令,0x00写命令
IIC_WaitAck(); //IIC应答信号
IIC_SendByte(dat); //写入具体命令/数据
IIC_WaitAck(); //IIC应答信号
IIC_Stop(); //IIC停止信号
}
//坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD); //页地址——从0xb0开始(一共8页)
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); //(x&0xf0)——对应x高四位
OLED_WR_Byte((x&0x0f),OLED_CMD); //(x&0x0f)——对应x第四位
}
//初始化
void OLED_Init(void)
{
delay(200);
OLED_WR_Byte(0xAE,OLED_CMD); /*关显示*/
OLED_WR_Byte(0x00,OLED_CMD); /*set lower column address*/
OLED_WR_Byte(0x10,OLED_CMD); /*set higher column address*/
OLED_WR_Byte(0x40,OLED_CMD); /*01A5A4 A3A2A1A0 从第0行开始显示(设置”显示起始行“)*/
OLED_WR_Byte(0xB0,OLED_CMD); /*0111 A3A2A1A0 从第0页开始显示(设置”页地址“)*/
OLED_WR_Byte(0x81,OLED_CMD); /*对比度模式设置*/
OLED_WR_Byte(0xff,OLED_CMD); /*对比度256(共256级)*/
OLED_WR_Byte(0xA1,OLED_CMD); /*向左旋转(反方向)*/
OLED_WR_Byte(0xA6,OLED_CMD); /*不”反白显示“(0x07为反白显示)*/
OLED_WR_Byte(0xA8,OLED_CMD); /*multiplex ratio*/
OLED_WR_Byte(0x1F,OLED_CMD); /*占空比duty = 1/32*/
OLED_WR_Byte(0xAD,OLED_CMD); /*DC-DC转换模式*/
OLED_WR_Byte(0xBB,OLED_CMD); /*显示时DC-DC打开*/
OLED_WR_Byte(0xC8,OLED_CMD); /*列扫描方向*/
OLED_WR_Byte(0xD3,OLED_CMD); /*设置显示偏移(滚屏)*/
OLED_WR_Byte(0x00,OLED_CMD);
OLED_WR_Byte(0xD5,OLED_CMD); /*设置OSC部门(set osc division)*/
OLED_WR_Byte(0x80,OLED_CMD);
OLED_WR_Byte(0xD9,OLED_CMD); /*set pre-charge period*/
OLED_WR_Byte(0x1f,OLED_CMD);
OLED_WR_Byte(0xDA,OLED_CMD); /*set COM pins*/
OLED_WR_Byte(0x12,OLED_CMD); //行地址连续显示
OLED_WR_Byte(0xdb,OLED_CMD); /*VCOM设置*/
OLED_WR_Byte(0x40,OLED_CMD);
OLED_WR_Byte(0x8d,OLED_CMD); /*设置电荷泵使能*/
OLED_WR_Byte(0x14,OLED_CMD);
OLED_WR_Byte(0xAF,OLED_CMD); /*开显示*/
OLED_Set_Pos(0,0);//指定坐标(0列,0行)
OLED_Clear(); //清屏
delay(200);
}
//显示8*16
void OLED_8x16(unsigned char x, y, N)
{
unsigned char m; //循环计数值
unsigned int adder=N*16; //字模编号
OLED_Set_Pos(x,y);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA);
adder++;
}
OLED_Set_Pos(x,y+1);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA); //跳过右上1/4点阵
adder++;
}
}
//显示汉字
void OLED_ShowChinese(unsigned char x, y, N) //16*16
{
unsigned char m; //循环计数值
unsigned int adder=N*32; //字模编号*32(16*16点阵,每个汉字32字节)
OLED_Set_Pos(x,y);
for(m=0;m<16;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA);
adder++;
}
OLED_Set_Pos(x,y+1);
for(m=0;m<16;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA);
adder++;
}
}
//显示汉字,为了兼容英文,将中文拆成2部分
void OLED_ShowChinese_L(unsigned char x, y, N) //左部分
{
unsigned char m; //循环计数值
unsigned int adder=N*32; //字模编号*32(16*16点阵,每个汉字32字节)
OLED_Set_Pos(x,y);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA);
adder++;
}
OLED_Set_Pos(x,y+1);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder+8],OLED_DATA); //跳过右上1/4点阵
adder++;
}
}
void OLED_ShowChinese_R(unsigned char x, y, N) //右部分
{
unsigned char m; //循环计数值
unsigned int adder=N*32+8; //字模编号*32(16*16点阵,每个汉字32字节)
OLED_Set_Pos(x,y);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder],OLED_DATA);
adder++;
}
OLED_Set_Pos(x,y+1);
for(m=0;m<8;m++)
{
OLED_WR_Byte(Hzk[adder+8],OLED_DATA);
adder++;
}
}
//显示图片
void OLED_BMP(unsigned char x, y, sizex, sizey,unsigned char BMP[])
{
unsigned int j=0;
unsigned char i,m;
sizey=sizey/8+((sizey%8)?1:0);
for(i=0;i<sizey;i++)
{
OLED_Set_Pos(x,i+y);
for(m=0;m<sizex;m++)
{
OLED_WR_Byte(BMP[j++],OLED_DATA);
}
}
}
OLED.h文件:
#ifndef __OLED_H
#define __OLED_H
void delay_ms(unsigned int ms);
void OLED_Clear(void);
void OLED_WR_Byte(unsigned char dat,unsigned char mode);
void OLED_Set_Pos(unsigned char x, unsigned char y);
void OLED_Init(void);
void OLED_ShowChinese(unsigned char x,unsigned char y,unsigned char N);
void OLED_ShowChinese_L(unsigned char x, y, N);
void OLED_ShowChinese_R(unsigned char x, y, N);
void OLED_ColorTurn(unsigned char i);
void OLED_DisplayTurn(unsigned char i);
void OLED_BMP(unsigned char x, y, sizex, sizey, unsigned char BMP[]);
void OLED_8x16(unsigned char x, y, N);
#endif
然后是zk16x16.h:
#ifndef __zk16x16_H
#define __zk16x16_H
unsigned char code Hzk[]={
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",3*/
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",4*/
0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",6*/
0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92, 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,
0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*"温",10、11*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25, 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,
0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00, 0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",12、13*/
0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92, 0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,
0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00, 0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,/*"湿",14、15*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,/*"H",16*/
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,/*"T",17*/
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,/*"<",18*/
0x04,0x44,0x84,0x14,0x64,0x0F,0x04,0xE4, 0x00,0x08,0x09,0x78,0x04,0x03,0x00,0x3F,
0x24,0x2F,0x24,0x24,0xE4,0x04,0x04,0x00, 0x40,0x40,0x42,0x44,0x43,0x40,0x78,0x00,/*"范",19、20*/
0x00,0xFE,0x02,0x12,0x52,0x52,0x52,0xFE, 0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,
0x52,0x52,0x52,0x12,0x02,0xFE,0x00,0x00, 0x41,0x49,0x51,0x4F,0x40,0xFF,0x00,0x00,/*"围",21、22*/
0x40,0x42,0xCC,0x00,0x00,0xFE,0x82,0x92, 0x00,0x00,0x3F,0x10,0x88,0x7F,0x00,0x1E,
0x92,0xFE,0x92,0x92,0x82,0xFE,0x00,0x00, 0x12,0x12,0x12,0x5E,0x80,0x7F,0x00,0x00,/*"调",23、24*/
0x04,0x74,0xD4,0x54,0xFF,0x54,0xD4,0x74, 0x82,0x89,0x88,0xE8,0x8B,0x88,0x88,0xF9,
0x14,0x08,0x77,0x84,0x44,0x3C,0x04,0x00, 0xA8,0xAA,0xA9,0xA8,0xA9,0x8A,0x82,0x00,/*"整",25、26*/
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE, 0x08,0x08,0x04,0x84,0x62,0x1E,0x01,0x00,
0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x00, 0x01,0xFE,0x02,0x04,0x04,0x08,0x08,0x00,/*"界",27、28*/
0x02,0x02,0xE2,0x22,0x22,0xF2,0x2E,0x22, 0x00,0x00,0xFF,0x40,0x40,0x7F,0x49,0x49,
0x22,0xE2,0x22,0x22,0xE2,0x02,0x02,0x00, 0x49,0x7F,0x40,0x40,0xFF,0x00,0x00,0x00,/*"面",29、30*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"空格",31*/
}
#endif
|