看了好多同樣的貼子,解決不了我的問題,代碼是之前寫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
|