QQT912/CW32F030/原项目程序/SW/12 CW32 BLDC haLL pid OK/USER/OLED_I2C.c

629 lines
13 KiB
C
Raw Normal View History

#include "OLED_I2C.h"
#include "font.h"
sFONT *Fonttemp = &Font8x16;
//sFONT *Fonttemp = &Font16x24;
//sFONT *Fonttemp = &Font24x32;
short I2C_OFFSET_W = I2C_PIC_W / 2 - I2C_OLED_W / 2;
short I2C_OFFSET_H = I2C_PIC_H / 2 - I2C_OLED_H / 2; //<2F><>ʾ<EFBFBD><CABE><EFBFBD>뻭<EFBFBD><EBBBAD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
uint8_t I2C_P_x = 0, I2C_P_y = 0; //OLED_Print<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8_t I2C_OLED_GRAM[I2C_PIC_H][I2C_PIC_W]; //<2F><><EFBFBD><EFBFBD>256*128<32><38><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>(64,32)~(191,95)
void I2C_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStruct;
__RCC_I2C1_CLK_ENABLE();
__RCC_GPIOB_CLK_ENABLE();
PB06_AFx_I2C1SCL();
PB07_AFx_I2C1SDA();
GPIO_InitStructure.Pins = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; ////I2C<32><43><EFBFBD>뿪©<EBBFAA><C2A9><EFBFBD><EFBFBD>
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
I2C_InitStruct.I2C_BaudEn = ENABLE;
I2C_InitStruct.I2C_Baud = 0x04;
I2C_InitStruct.I2C_FLT = DISABLE;
I2C_InitStruct.I2C_AA = DISABLE; //DISABLE ENABLE
I2C1_DeInit();
I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//<2F><>ʼ<EFBFBD><CABC>ģ<EFBFBD><C4A3>
I2C_Cmd(CW_I2C1,ENABLE); //ģ<><C4A3>ʹ<EFBFBD><CAB9>
}
void I2C_MasterWriteEepromData1(I2C_TypeDef *I2Cx,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{
uint8_t u8i=0,u8State;
I2C_GenerateSTART(I2Cx, ENABLE);
while(1)
{
while(0 == I2C_GetIrq(I2Cx))
{;}
u8State = I2C_GetState(I2Cx);
switch(u8State)
{
case 0x08: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>START<52>ź<EFBFBD>
I2C_GenerateSTART(I2Cx, DISABLE);
I2C_Send7bitAddress(I2Cx, OLED_ADDRESS,0X00); //<2F><><EFBFBD>豸<EFBFBD><E8B1B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
break;
case 0x18: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SLA+W<>ź<EFBFBD>,ACK<43><4B><EFBFBD>յ<EFBFBD>
I2C_SendData(I2Cx,u8Addr);//<2F><><EFBFBD>豸<EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
break;
case 0x28: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>EEPROM<4F><4D>memory<72><79>ַҲ<D6B7><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
I2C_SendData(I2Cx,pu8Data[u8i++]);
break;
case 0x20: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SLA+W<><57><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>NACK
case 0x38: //<2F><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD> SLA+W <20>׶λ<D7B6><CEBB>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ׶ζ<D7B6>ʧ<EFBFBD>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD> SLA+R <20>׶λ<D7B6><CEBB>߻<EFBFBD>Ӧ NACK <20>׶ζ<D7B6>ʧ<EFBFBD>ٲ<EFBFBD>
I2C_GenerateSTART(I2Cx, ENABLE);
break;
case 0x30: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽں<D6BD><DABA>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>NACK
I2C_GenerateSTOP(I2Cx, ENABLE);
break;
default:
break;
}
if(u8i>u32Len)
{
I2C_GenerateSTOP(I2Cx, ENABLE);//<2F><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
I2C_ClearIrq(I2Cx);
break;
}
I2C_ClearIrq(I2Cx);
}
}
void WriteCmd(unsigned char I2C_Command)//д<><D0B4><EFBFBD><EFBFBD>
{
I2C_MasterWriteEepromData1(CW_I2C1,COM,&I2C_Command,1);
}
void WriteDat(unsigned char I2C_Data)//д<><D0B4><EFBFBD><EFBFBD>
{
I2C_MasterWriteEepromData1(CW_I2C1,DAT,&I2C_Data,1);
}
//<2F><><EFBFBD><EFBFBD>OLED<45><44>ʾ
void I2C_OLED_DisPlay_On(void)
{
WriteCmd(0x8D); //<2F><><EFBFBD>ɱ<EFBFBD>ʹ<EFBFBD><CAB9>
WriteCmd(0x14); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>
WriteCmd(0xAF); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ
}
//<2F>ر<EFBFBD>OLED<45><44>ʾ
void I2C_OLED_DisPlay_Off(void)
{
WriteCmd(0x8D); //<2F><><EFBFBD>ɱ<EFBFBD>ʹ<EFBFBD><CAB9>
WriteCmd(0x10); //<2F>رյ<D8B1><D5B5>ɱ<EFBFBD>
WriteCmd(0xAF); //<2F>ر<EFBFBD><D8B1><EFBFBD>Ļ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>Դ浽OLED
void I2C_OLED_UPdata(void)
{
uint8_t i, n;
//ˮƽģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteCmd(0x21); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteCmd(0x00); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
WriteCmd(0x7f); //<2F><><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>ַ
WriteCmd(0x22); //<2F><><EFBFBD><EFBFBD>ҳ
WriteCmd(0x00); //<2F><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʼ<EFBFBD><CABC>ַ
WriteCmd(0x07); //<2F><><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
for (i = 0; i < I2C_OLED_H; i++)
{
for (n = 0; n < I2C_OLED_W; n++)
{
WriteDat(I2C_OLED_GRAM[i + I2C_OFFSET_H][n + I2C_OFFSET_W]);
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Line:ѡ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>0<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>4<EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>6<EFBFBD><EFBFBD>7
* @param Start_x:x<EFBFBD>Ὺʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param End_x: x<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void I2C_OLED_Clear_Line(uint8_t Line,uint8_t Start_x,uint8_t End_x)
{
for(uint8_t x=Start_x;x<End_x;x++)
I2C_OLED_GRAM[Line][x]=0;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//ѡ<><D1A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Inside,Outside,All
void I2C_OLED_Clear(uint8_t OLEDShowUP)
{
uint16_t i, n;
for (i = 0; i < I2C_PIC_H; i++)
{
for (n = 0; n < I2C_PIC_W; n++)
{
I2C_OLED_GRAM[i][n] = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
I2C_P_x = 0;
I2C_P_y = 0; //<2F><><EFBFBD><EFBFBD>OLED_Print<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
I2C_OFFSET_W = I2C_PIC_W / 2 - I2C_OLED_W / 2;
I2C_OFFSET_H = I2C_PIC_H / 2 - I2C_OLED_H / 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>뻭<EFBFBD><EBBBAD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (OLEDShowUP == 1)
I2C_OLED_UPdata(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
}
//<2F><><EFBFBD><EFBFBD>
//x:0~127
//y:0~63
void I2C_OLED_DrawPoint(uint8_t x, uint8_t y)
{
uint8_t i, m, n;
i = y / 8; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>
m = y % 8; //<2F><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>λ<EFBFBD><CEBB>
n = 1 << m;
I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W] |= n; //<2F><><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ͼ<EFBFBD><CDBC>֡
}
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
//x:0~127
//y:0~63
void I2C_OLED_ClearPoint(uint8_t x, uint8_t y)
{
uint8_t i, m, n;
i = y / 8;
m = y % 8;
n = 1 << m;
I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W] = ~I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W];
I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W] |= n;
I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W] = ~I2C_OLED_GRAM[i + I2C_OFFSET_H][x + I2C_OFFSET_W]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD>
//x:0~128
//y:0~64
void I2C_OLED_DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
{
int i = 0;
float k, b;
if (x1 == x2) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
for (i = 0; i < (y2 - y1); i++)
{
I2C_OLED_DrawPoint(x1, y1 + i);
}
}
/*else if(y1==y2) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
for(i=0;i<(x2-x1);i++)
{
OLED_DrawPoint(x1+i,y1);
}
}*/
else //<2F><>б<EFBFBD><D0B1>
{
k = (y2 - y1) * 10 / (x2 - x1); //б<><D0B1>*10<31><30>ֹб<D6B9><D0B1>С<EFBFBD><D0A1>1ʱʧ<CAB1><CAA7>
b = y1 - k * x1 / 10;
while ((x1 + i) != x2)
{
I2C_OLED_DrawPoint(x1 + i, (int)((x1 + i) * k / 10 + b));
if (x1 < x2)
{
i++;
}
else
{
i--;
}
}
}
}
//x,y:Բ<><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//r:Բ<>İ뾶
void I2C_OLED_DrawCircle(uint8_t x, uint8_t y, uint8_t r)
{
int a, b, num;
a = 0;
b = r;
while (2 * b * b >= r * r)
{
I2C_OLED_DrawPoint(x + a, y - b);
I2C_OLED_DrawPoint(x - a, y - b);
I2C_OLED_DrawPoint(x - a, y + b);
I2C_OLED_DrawPoint(x + a, y + b);
I2C_OLED_DrawPoint(x + b, y + a);
I2C_OLED_DrawPoint(x + b, y - a);
I2C_OLED_DrawPoint(x - b, y - a);
I2C_OLED_DrawPoint(x - b, y + a);
a++;
num = (a * a + b * b) - r * r; //<2F><><EFBFBD>㻭<EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>Բ<EFBFBD>ĵľ<C4B5><C4BE><EFBFBD>
if (num > 0)
{
b--;
a--;
}
}
}
void I2C_OLED_ShowChar(uint8_t x, uint8_t y, char chr)
{
uint8_t i, m, temp, size = Fonttemp->Height * Fonttemp->Width / 8;
uint8_t x0 = x;
uint8_t Pfont[size];
//<2F><>ȡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
GetConslonsCode(Pfont, chr, Fonttemp);
// size=Fonttemp->Height*Fonttemp->Width/8; //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
for (i = 0; i < size; i++)
{
temp = Pfont[i];
for (m = 0; m < 8; m++) //д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (temp & 0x80)
I2C_OLED_DrawPoint(x, y);
else
I2C_OLED_ClearPoint(x, y);
temp <<= 1;
x++;
}
if ((x - x0) == (Fonttemp->Width))
{
x = x0;
y++;
}
}
}
void I2C_OLED_ShowChar_CH(uint8_t x, uint8_t y, uint16_t usChar)
{
uint8_t rowCount, bitCount;
uint8_t ucBuffer[WIDTH_CH_CHAR * HEIGHT_CH_CHAR / 8];
uint16_t usTemp;
uint8_t x0 = x;
//ȡ<><C8A1>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
GetGBKCode(ucBuffer, usChar);
for (rowCount = 0; rowCount < HEIGHT_CH_CHAR; rowCount++)
{
/* ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>lcd<63>ϼ<EFBFBD><CFBC><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>һ<EFBFBD><D2BB> */
usTemp = ucBuffer[rowCount * 2]; //ȡ<><C8A1>λ
usTemp = (usTemp << 8);
usTemp |= ucBuffer[rowCount * 2 + 1]; //ȡ<><C8A1>λ
for (bitCount = 0; bitCount < WIDTH_CH_CHAR; bitCount++)
{
if (usTemp & (0x8000 >> bitCount)) //<2F><>λ<EFBFBD><CEBB>ǰ
I2C_OLED_DrawPoint(x, y);
else
I2C_OLED_ClearPoint(x, y);
x++;
}
if (x - x0 == WIDTH_CH_CHAR)
{
x = x0;
y++;
}
}
}
//dir <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
//pix <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
//cir <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽磬<DFBD><E7A3AC><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>Ч<EFBFBD><D0A7>,0<><30>ʾ<EFBFBD><CABE>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>1<EFBFBD><31>ʾѭ<CABE><D1AD>
void I2C_OLED_Move(uint8_t dir, uint8_t pix, uint8_t cir) //<2F><>Ļ<EFBFBD><C4BB>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
{
switch (dir)
{
case UP:
{
I2C_OFFSET_H += pix;
if (I2C_OFFSET_H >= I2C_PIC_H - I2C_OLED_H)
{
if (cir == 0)
I2C_OFFSET_H = I2C_PIC_H - I2C_OLED_H;
else
I2C_OFFSET_H = 0;
}
break;
}
case DOWN:
{
I2C_OFFSET_H -= pix;
if (I2C_OFFSET_H <= 0)
{
if (cir == 0)
I2C_OFFSET_H = 0;
else
I2C_OFFSET_H = I2C_PIC_H - I2C_OLED_H;
}
break;
}
case LEFT:
{
I2C_OFFSET_W += pix;
if (I2C_OFFSET_W >= I2C_PIC_W - I2C_OLED_W)
{
if (cir == 0)
I2C_OFFSET_W = I2C_PIC_W - I2C_OLED_W;
else
I2C_OFFSET_W = 0;
}
break;
}
case RIGHT:
{
I2C_OFFSET_W -= pix;
if (I2C_OFFSET_W <= 0)
{
if (cir == 0)
I2C_OFFSET_W = 0;
else
I2C_OFFSET_W = I2C_PIC_W - I2C_OLED_W;
}
break;
}
}
I2C_OLED_UPdata();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @param usX <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>X
* @param usY <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y
* @param pStr <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ӣ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @note
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
*/
char* OLED_StrEscCharacter(uint8_t *x,uint8_t *y,char *chr)
{
uint8_t TabSize;
while(*chr < ' '&&*chr != '\0')
{
switch (*chr)
{
case '\b': //<2F>˸<EFBFBD><CBB8><EFBFBD>BS<42><53>
{
*x = *x - Fonttemp->Width;
break;
}
case '\n': //<2F><><EFBFBD>У<EFBFBD>LF<4C><46>
{
switch(Fonttemp->Height)
{
case 32:I2C_OLED_Clear_Line((*y/8)+3,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33>
case 24:I2C_OLED_Clear_Line((*y/8)+2,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
case 16:I2C_OLED_Clear_Line((*y/8)+1,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>
case 8:I2C_OLED_Clear_Line((*y/8),*x,128);break;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>
}
*x = 0;
*y = *y + Fonttemp->Height;
if (*y > (I2C_OLED_H * 8) - Fonttemp->Height) //<2F><>Ļд<C4BB><D0B4>
{
I2C_OLED_Move(UP, 2, 0);
*y = *y - Fonttemp->Height;
}
break;
}
case '\r': //<2F>س<EFBFBD><D8B3><EFBFBD>CR<43><52>
{
switch(Fonttemp->Height)
{
case 32:I2C_OLED_Clear_Line((*y/8)+3,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33>
case 24:I2C_OLED_Clear_Line((*y/8)+2,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
case 16:I2C_OLED_Clear_Line((*y/8)+1,*x,128);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>
case 8:I2C_OLED_Clear_Line((*y/8),*x,128);break;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>
}
*x = 0;
*y = *y + Fonttemp->Height;
if (*y > (I2C_OLED_H * 8) - Fonttemp->Height) //<2F><>Ļд<C4BB><D0B4>
{
I2C_OLED_Move(UP, 2, 0);
*y = *y - Fonttemp->Height;
}
break;
}
case '\t': //ˮƽ<CBAE>Ʊ<EFBFBD><C6B1><EFBFBD>HT<48><54>
{
TabSize = 4 * Fonttemp->Width - (*x % (4 * Fonttemp->Width));
switch(Fonttemp->Height)
{
case 32:I2C_OLED_Clear_Line((*y/8)+3,*x,*x+TabSize);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33>
case 24:I2C_OLED_Clear_Line((*y/8)+2,*x,*x+TabSize);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
case 16:I2C_OLED_Clear_Line((*y/8)+1,*x,*x+TabSize);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>
case 8:I2C_OLED_Clear_Line((*y/8),*x,*x+TabSize);break;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>
}
*x = *x + TabSize;
break;
}
}
chr++;
}
return chr;
}
//<2F><>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
//x,y:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//size1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
//*chr:<3A>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
void I2C_OLED_ShowString(uint8_t x, uint8_t y, char *chr)
{
uint16_t chinese_chr;
while (*chr != '\0') //<2F>ж<EFBFBD><D0B6>Dz<EFBFBD><C7B2>ǷǷ<C7B7><C7B7>ַ<EFBFBD>!
{
chr=OLED_StrEscCharacter(&x,&y,chr);
if( * chr == '\0' )
break;
if (*chr < 127) //Ӣ<><D3A2><EFBFBD>ַ<EFBFBD>
{
I2C_OLED_ShowChar(x, y, *chr);
x += Fonttemp->Width;
if (x > 128 - Fonttemp->Width) //<2F><><EFBFBD><EFBFBD>
{
x = 0;
y += Fonttemp->Height;
}
chr++;
}
else if (*chr > 127) //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
{
chinese_chr = *(uint16_t *)chr;
chinese_chr = (chinese_chr << 8) + (chinese_chr >> 8); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
I2C_OLED_ShowChar_CH(x, y, chinese_chr);
x += WIDTH_CH_CHAR;
if (x > 128 - WIDTH_CH_CHAR) //<2F><><EFBFBD><EFBFBD>
{
x = 0;
y += HEIGHT_CH_CHAR;
}
chr += 2;
}
}
}
//m^n
uint32_t I2C_OLED_Pow(uint8_t m, uint8_t n)
{
uint32_t result = 1;
while (n--)
{
result *= m;
}
return result;
}
//strָ<72><D6B8>Ҫ<EFBFBD><D2AA>ʾ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8>
//size<7A><65>ʾ<EFBFBD>ַ<EFBFBD><D6B7>ֺ<EFBFBD>
void I2C_OLED_Print(char *str) //<2F><>OLED<45><44><EFBFBD>ϴ<EFBFBD>ӡ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
{
uint16_t chinese_str;
while (*str != '\0')
{
str=OLED_StrEscCharacter(&I2C_P_x,&I2C_P_y,str);
if( * str == '\0' )
break;
if (*str < 127) //Ӣ<><D3A2><EFBFBD>ַ<EFBFBD>
{
I2C_OLED_ShowChar(I2C_P_x, I2C_P_y, *str);
I2C_P_x = I2C_P_x + Fonttemp->Width;
if (I2C_P_x > 128 - Fonttemp->Width) //<2F><><EFBFBD><EFBFBD>
{
I2C_P_x = 0;
I2C_P_y = I2C_P_y + Fonttemp->Height;
if (I2C_P_y > 32 - Fonttemp->Height) //<2F><>Ļд<C4BB><D0B4>
{
I2C_OLED_Move(UP, 2, 0);
I2C_P_y = I2C_P_y - Fonttemp->Height;
}
}
str++;
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
{
chinese_str = *(uint16_t *)str;
chinese_str = (chinese_str << 8) + (chinese_str >> 8); //<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
I2C_OLED_ShowChar_CH(I2C_P_x, I2C_P_y, chinese_str);
I2C_P_x += WIDTH_CH_CHAR;
if (I2C_P_x > 128 - WIDTH_CH_CHAR) //<2F><><EFBFBD><EFBFBD>
{
I2C_P_x = 0;
I2C_P_y = I2C_P_y + HEIGHT_CH_CHAR;
if (I2C_P_y > 32 - HEIGHT_CH_CHAR) //<2F><>Ļд<C4BB><D0B4>
{
I2C_OLED_Move(UP, 2, 0);
I2C_P_y = I2C_P_y - HEIGHT_CH_CHAR;
}
}
str += 2; //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
}
}
I2C_OLED_UPdata();
}
void I2C_OLED_ShowPicture(uint8_t x, uint8_t y, uint8_t Bmp_W, uint8_t Bmp_H, uint8_t *BMP)
{
uint8_t x0, y0; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>x<EFBFBD><78>y<EFBFBD><79>ֵ
x0 = x;
y0 = y;
for (y = y0; y < y0 + Bmp_H; y++)
{
for (x = x0; x < x0 + Bmp_W; x++)
{
I2C_OLED_GRAM[y + I2C_OFFSET_H][x + I2C_OFFSET_W] = *BMP;
BMP++;
}
}
I2C_OLED_UPdata();
}
//OLED<45>ij<EFBFBD>ʼ<EFBFBD><CABC>
void I2C_OLED_Init(void)
{
// delay1ms(200);
WriteCmd(0xAE);//<2F>ر<EFBFBD><D8B1><EFBFBD>ʾ
WriteCmd(0x40);//---set low column address
WriteCmd(0xB0);//---set high column address
WriteCmd(0xC8);//-not offset
WriteCmd(0x81);//<2F><><EFBFBD>öԱȶ<D4B1>
WriteCmd(0xff);
WriteCmd(0xa1);//<2F><><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteCmd(0xa6);//
WriteCmd(0xa8);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
WriteCmd(0x1f);
WriteCmd(0xd3);
WriteCmd(0x00);
WriteCmd(0xd5);
WriteCmd(0xf0);
WriteCmd(0xd9);
WriteCmd(0x22);
WriteCmd(0xda);
WriteCmd(0x02);
WriteCmd(0x20); //-Set Page Addressing Mode (0x00/0x01/0x02)
//WriteCmd(0x02);//ҳ<><D2B3>ַģʽ
WriteCmd(0x00); //ˮƽѰַģʽ
WriteCmd(0xdb);
WriteCmd(0x49);
WriteCmd(0x8d);
WriteCmd(0x14);
WriteCmd(0xaf);
}