欢迎光临~啄木鸟电子科技

软件设计

OLED 显示屏



#include<iostm8s105c6.h>
#include <stdio.h>

#include"OLED.h"
#include"oledfont.h"
#include"8x16.h"
#include"ds1302.h"
#include<math.h>

//D0
#define     SCLK_Set()        	PC_ODR_bit.ODR6 = 1
#define     SCLK_Reset()      	PC_ODR_bit.ODR6 = 0
//D1
#define     SDIN_Set()        	PC_ODR_bit.ODR5 = 1
#define     SDIN_Reset()      	PC_ODR_bit.ODR5 = 0

#define     RES_Set()         	PC_ODR_bit.ODR4 = 1
#define     RES_Reset()       	PC_ODR_bit.ODR4 = 0

#define     DC_Set()          	PC_ODR_bit.ODR3 = 1
#define     DC_Reset()        	PC_ODR_bit.ODR3 = 0

#define     CS_Set()          	PC_ODR_bit.ODR2 = 1
#define     CS_Reset()    		PC_ODR_bit.ODR2 = 0	
    
unsigned char gui_disp_buf[X_WIDTH * Y_WIDTH / 8]={       //取的字模
0x20,0x30,0xAC,0x63,0x32,0x00,0xFC,0xA4,0xA5,0xA6,0xA4,0xA4,0xA4,0xBC,0x00,0x00,
0x00,0x08,0x06,0x82,0xFA,0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x9A,0x96,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x40,0xF0,0x1C,0x07,0xE2,0x24,0x24,0x24,0xE4,0x04,0x04,0xFC,0x04,0x04,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x80,0xBE,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xA2,0xBE,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x11,0x09,0x49,0x21,0x1C,0x03,0x7F,0x04,0x3F,0x04,0x3F,0x44,0x7F,0x00,0x00,
0x00,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x04,0x04,0x46,0x84,0x60,0x1F,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x01,0x06,0x0C,0x18,0x30,0x60,0x20,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x7F,0x00,0x00,0x07,0x02,0x02,0x02,0x07,0x20,0x40,0x3F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0x40,0x40,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x08,0x4A,0x4A,0xFE,0x4A,0x4A,0x7E,0x00,
0x09,0x4A,0x4C,0xF8,0x4C,0x4B,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,
0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,0x08,0x04,0x7F,0x22,0x22,0x22,0x7E,0x00,
0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

/***********************************************************************
函数: Put_Pixel
功能:在液晶屏上打印一个像素
参数说明:  坐标(x,y)(以左上角为坐标原点)x取值0~127。y的取值0~64
            flag = 0 将此点清零
                 = 1 将此点显示
                 = 2 将此点取反
***********************************************************************/
void Put_Pixel(unsigned char x , unsigned char y , unsigned char flag)
{
  if((x < 128) && (y < 64))
  {
    switch(flag)
    {
    case 1://置1
        gui_disp_buf[(x)+ 128 * ( y / 8)] |= ( 1 << (y % 8));  
        break;
    case 0://清零 
       gui_disp_buf[(x)+ 128 * ( y / 8)] &= ~( 1 << (y % 8)); 
        break;
    case 2://取反
       gui_disp_buf[(x)+ 128 * ( y / 8)] ^=  ( 1 << (y % 8)); 
        break;

    }
  }
}

//??
void Clc_Lcd(unsigned char flag)
{
  unsigned int i ;
  if(flag)
     for(i=0;i<1024;i++)
      gui_disp_buf[i]=1;
  else
    for(i=0;i<1024;i++)
       gui_disp_buf[i]=0;
}
/***********************************************************************
画一条 (x1,y1) 到 (x2,y2) 的直线
flag = 1; 画点 
flag = 0; 清点
***********************************************************************/
void Draw_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char flag)
{
  int dy ;
  int dx ;
  int stepx, stepy, fraction;
  dy = y2 - y1;
  dx = x2 - x1;
  if (dy < 0) 
  {
    dy = -dy;
    stepy = -1;
  }
  else 
  {
    stepy = 1;
  }
  if (dx < 0)
  {
    dx = -dx;
    stepx = -1;
  }
  else
  {
    stepx = 1;
  }
  dy <<= 1;
  dx <<= 1;
  Put_Pixel(x1,y1,flag);
  if (dx > dy)
  {
    fraction = dy - (dx >> 1); 
    while (x1 != x2)
    {
      if (fraction >= 0)
      {
        y1 += stepy;
        fraction -= dx;
      }
      x1 += stepx;
      fraction += dy;  
      Put_Pixel(x1,y1,flag);
    }
  }
  else
  {
    fraction = dx - (dy >> 1);
    while (y1 != y2)
    {
        if (fraction >= 0)
        {
           x1 += stepx;
           fraction -= dy;
        }
        y1 += stepy;
        fraction += dx;
        Put_Pixel(x1,y1,flag);
    }
  }
}



/****************************************************************************
*                    相关的GUI接口函数
****************************************************************************/

/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据(对于黑白色LCM,为0的点灭,为1的点显示)
* 出口参数:无
****************************************************************************/
void  GUI_FillSCR(unsigned char dat)
{
//  LCD_FillAll(dat);
}

unsigned char const  DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x		指定点所在列的位置
*            y		指定点所在行的位置
*            color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址超出有
*           效范围)
* 说明:用户根据LCM的实际情况编写此函数。对于单色,只有一个位有效,则要使用左移的方法
*      实现point_dat = (point_dat&MASK_TAB [i]) | (color<<n),其它位数的一样
*      处理。
****************************************************************************/
unsigned char  GUI_Point(unsigned char x, unsigned char y, unsigned char color)
{  
  Put_Pixel(x,y,color);

  //刷新显示
  //LCD_UpdatePoint(x, y);
  //LCD_UpdateAll();
  return(1);
}

/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。

* 入口参数: 
x0		水平线起点所在列的位置
y0		水平线起点所在行的位置
x1      水平线终点所在列的位置
color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)

* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char color) 
{  
  Draw_Line(x0, y0, x1, y0, color);
  //LCD_UpdateAll();
}

/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。

* 入口参数: 
x0		垂直线起点所在列的位置
y0		垂直线起点所在行的位置
y1      垂直线终点所在行的位置
color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)

* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_RLine(unsigned char x0, unsigned char y0, unsigned char y1, unsigned char color) 
{    
  Draw_Line(x0,y0,x0,y1,color);
}


/***********************************************************************
以x,y为圆心,以radius为半径画贺
(flag=1画点,flag=0清点)
***********************************************************************/
void glcd_circle(int x, int y, int radius, unsigned char flag)
{
    int xc = 0;
    int yc ;
    int p ;
    yc=radius;
    p = 3 - (radius<<1);
    while (xc <= yc)  
    {
        Put_Pixel(x + xc, y + yc, flag);
        Put_Pixel(x + xc, y - yc, flag);
        Put_Pixel(x - xc, y + yc, flag);
        Put_Pixel(x - xc, y - yc, flag);
        Put_Pixel(x + yc, y + xc, flag);
        Put_Pixel(x + yc, y - xc, flag);
        Put_Pixel(x - yc, y + xc, flag);
        Put_Pixel(x - yc, y - xc, flag);
        if (p < 0)
        p += (xc++ << 2) + 6;
        else
        p += ((xc++ - yc--)<<2) + 10;
    }
}
//画矩形
void glcd_box(int x1, int y1, int x2, int y2, unsigned char flag)
{
	Draw_Line(x1,y1,x2,y1,flag);  // up
	Draw_Line(x1,y2,x2,y2,flag);  // down
	Draw_Line(x2,y1,x2,y2,flag);  // right
	Draw_Line(x1,y1,x1,y2,flag);  // left
}
//***********************************************************************
//以x,y点为原点,以degree为角度,画一条从内径到外径之间的线段
//(flag=1画点,flag=0清点)
//***********************************************************************
void glcd_degree_line(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char flag)
{
  int fx,fy,tx,ty;

  fx = x + (int)(inner_radius * sin(degree * 3.14 / 180));    //  ???????????????
  fy = y - (int)(inner_radius * cos(degree * 3.14 / 180));
  tx = x + (int)(outer_radius * sin(degree * 3.14 / 180));
  ty = y - (int)(outer_radius * cos(degree * 3.14 / 180));
  Draw_Line(fx,fy,tx,ty,flag);
}

//画上函数线段的包括线
void glcd_degree_line_bold(int x, int y, int degree, int inner_radius, int outer_radius, unsigned char flag)
{
  int fx,fy,tx,ty;

  fx = x + (int)(inner_radius * sin(degree * 3.14 / 180));    //  ???????????????
  fy = y - (int)(inner_radius * cos(degree * 3.14 / 180));
  tx = x + (int)(outer_radius * sin(degree * 3.14 / 180));
  ty = y - (int)(outer_radius * cos(degree * 3.14 / 180));
  Draw_Line(fx,fy,tx,ty,flag);
  Draw_Line(fx+1,fy+1,tx+1,ty+1,flag);
  Draw_Line(fx-1,fy-1,tx-1,ty-1,flag);
}


//?????
void Lcd_Puts_8x6(unsigned char x,unsigned char y,char *str,unsigned char flag)
{
  unsigned char i;
  
  for(i = 0; *str !='\0' ;i++)
  { 
    if(x + i*8>120)
    {
      if(y > 40)
      {
        Clc_Lcd(0);
        y = x = i = 0;
      }
      else
      {
        y += 6;
        x = i= 0;
      }
    }
    if(*str=='\n')
    {
      if(x != 0)
      {
        y += 6;
        x = i= 0;}
        str++;
    }
    Lcd_Putc_8x6(x+i*8,y,*str++,flag);
  }
}

//????
int Lcd_Putc_8x6(unsigned char x,unsigned char y, char C,unsigned char flag)
{
  unsigned char i,j,tmp;
  
  for(i = 0 ; i < 6 ; i++)
  {
    tmp = font6x8[C-' '][i];   //  字库表; 
    for(j = 0; j<8; j++)
    {
       if((tmp >> j ) & 0x01)
       {
          Put_Pixel(x + i, y+j , flag);
       }
    }
  }
  return C;
}

// 单个 字符; 
int Lcd_Putc_8x16(unsigned char x,unsigned char y,char C,unsigned char flag)
{
  unsigned char i, j, tmp;
  
  for(i = 0;i < 16; i++)
  {
    tmp = font8x16[C-' '][i];	//  字库表; 
    for(j = 0;j < 8 ;j++)
    {
       if((tmp << j ) & 0x80)
       {
          Put_Pixel(x + j, y+i , flag);
       }
    }
  }
  return C;
}

// 电池图标; 
int Lcd_Putc_Bat_8x16(unsigned char x,unsigned char y,char c, unsigned char flag)
{
  unsigned char i, j, tmp;
  
  for(i = 0; i<16; i++)
  {
//    tmp = font8x16[C-' '][i];	//  字库表;
	tmp = BAT8x16[c][i] ;	//  字库表;
//    for(j = 0; j<8 ;j++)
//    {
//       if((tmp << j ) & 0x80)
//       {
//          Put_Pixel(x + j, y+i , flag);
//       }
//    }
    
    for(j = 0; j<8; j++)
    {
       if((tmp >> j ) & 0x01)
       {
          Put_Pixel(x+i, y+j , flag);
       }
    }
  }
  return c;
}

// PLAY 图标; 
int Lcd_Putc_PLAY_8x16(unsigned char x,unsigned char y,char c, unsigned char flag)
{
  	unsigned char i, j, tmp;
  
  	for(i = 0; i<8; i++)
  	{
		tmp = PLAY_8x16[c][i] ;	//  字库表;
	    for(j = 0; j<8; j++)
	    {
	       if((tmp >> j ) & 0x01)
	       {
	          Put_Pixel(x+i, y+j , flag);
	       }
	    }
	}
  
  return c;
}

// PLAY 图标; 


//字符串 
void Lcd_Puts_8x16(unsigned char x,unsigned char y,char *str,unsigned char flag)
{
  unsigned char i;
  
  for(i = 0; *str != '\0'; i++)
  { 
    if(x + i * 8 > 120)
    {
      if(y > 40)
      {
        Clc_Lcd(0);
        y = x = i = 0;
      }
      else
      {
        y += 16;
        x = i= 0;
      }
    }
    if(*str=='\n')
    {
      if(x != 0)
      {
        y += 16;
        x = i= 0;}
        str++;
    }
    Lcd_Putc_8x16(x+i*8, y, *str++, flag);
  }
}

//加载16x16的汉字
void LcdDispHz16(unsigned int x0, unsigned int y0, unsigned char ForeColor, unsigned char we)
{
  unsigned int j , x;
  char hzbuf0[16]/*,temp[2]*/;
  char hzbuf1[16]/*,temp[2]*/;
  unsigned char buffer;

  for (j = 0; j < 16; j++)
  {
   hzbuf0[j] = ymd[we][j];
  }
  
  for(j = 0; j < 16 ; j++)
  {
    buffer = hzbuf0[j];
    for(x = 0; x < 8 ; x++)
    {
      if(buffer & 0x01)
      {
        Put_Pixel(x0 + j , y0 + x, 1);
      }
      else
      {
        Put_Pixel(x0 + j , y0 + x, 0);
      }
      buffer >>= 1;
    }
  }
  
  for (j = 0; j < 16; j++)
  {
   hzbuf1[j] = ymd[we + 1][j];
  }
  
  for(j = 0; j < 16 ; j++)
  {
    buffer = hzbuf1[j];
    for(x = 0; x < 8 ; x++)
    {
      if(buffer & 0x01)
      {
        Put_Pixel(x0 + j , y0 + x + 8, 1);
      }
      else
      {
        Put_Pixel(x0 + j , y0 + x + 8, 0);
      }
      buffer >>= 1;
    }
  }
}

//void Delay_Nms(unsigned int ms)
//{
//  unsigned int x , y;
//  for(x = ms ; x > 0; x--)
//    for(y = 3000; y > 0; y--);
//}

void OLED_Port_Init()
{
  //OLED  D0
  PE_DDR_bit.DDR0 = 1;      //PE->0 OUTPUT
  PE_CR1_bit.C10 = 1;       //
  PE_CR2_bit.C20 = 1;       //
  
  //OLED D1
  PC_DDR_bit.DDR4 = 1;      //PC->4 OUTPUT
  PC_CR1_bit.C14 = 1;       //
  PC_CR2_bit.C24 = 1;       //
  
  //OLED RES
  PG_DDR_bit.DDR1 = 1;      //PG->1 OUTPUT
  PG_CR1_bit.C11 = 1;       //
  PG_CR2_bit.C21 = 1;       //
  
  //OLED DC
  PG_DDR_bit.DDR0 = 1;      //PG->0 OUTPUT
  PG_CR1_bit.C10 = 1;       //
  PG_CR2_bit.C20 = 1;       //
}

void SPIWrite(unsigned char data)
{
  unsigned char i;
  //SCLK_Set();
  for(i = 0 ; i < 8 ; i++)
  {
    SCLK_Reset();
    if(data & 0x80)
    {
      SDIN_Set();
    }
    else
    {
      SDIN_Reset();
    }
    SCLK_Set();
    data <<= 1;
  }
}


void OLED_WriteCommond(unsigned char commond)
{
  	unsigned char i;
  
  	DC_Reset();     //dc = 1
  	CS_Reset();     //cs = 0
 	// Delay_Nms(10);
 	// SPIWrite(commond);
  	for(i = 0 ; i < 8 ; i++)
  	{
    	SCLK_Reset();
    	if(commond & 0x80)
    	{
      		SDIN_Set();
    	}
	    else
	    {
	      	SDIN_Reset();
	    }
    	SCLK_Set();
    	commond <<= 1;
  	}
  	CS_Set();       //
  	DC_Set();     	//dc = 1
}


void OLED_WriteData(unsigned char dat)
{
  	DC_Set();    //dc = 0
  	CS_Reset();
  	SPIWrite(dat);
  	CS_Set();
  	DC_Set();     //dc = 1
}

void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
  OLED_WriteCommond(0xb0 + y);//OLED_WR_Byte(0xb0+y,OLED_CMD);
  OLED_WriteCommond(((x & 0xf0)>> 4) | 0x10);//OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  OLED_WriteCommond((x&0x0f)|0x01);//OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); 
}   	

//开启OLED显示    
void OLED_Display_On(void)
{
  OLED_WriteCommond(0x8d);//OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  OLED_WriteCommond(0x14);//OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  OLED_WriteCommond(0xaf);//OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}

//关闭OLED显示     
void OLED_Display_Off(void)
{
  OLED_WriteCommond(0x8d);	//OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  OLED_WriteCommond(0x10);	//OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  OLED_WriteCommond(0xae);	//OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}
	
void OLED_Clear(void)  
{  
  	unsigned char  i , n;		    
  	for(i = 0; i < 8 ;i++)  
  	{  
    	OLED_WriteCommond(0xb0 + i);	//OLED_WR_Byte (0xb0+i,OLED_CMD);     //设置页地址(0~7)
    	OLED_WriteCommond(0x00);		//OLED_WR_Byte (0x00,OLED_CMD);       //设置显示位置—列低地址
    	OLED_WriteCommond(0x10);		//OLED_WR_Byte (0x10,OLED_CMD);       //设置显示位置—列高地址   
    
		for(n = 0; n < 128 ; n++)
     		OLED_WriteData(0x00);
  	}
}

//开机界面;  
void OLED_Show_Startup(void) 
{
// 文字 描述; 
	OLED_ShowString(10, 0, "WELCOME TO");
	OLED_ShowString(10, 2, "EWOODPECKER");
	OLED_ShowString(10, 4, "WORLD !");
	Delay_Nms(1000);
	OLED_Clear();
	
// 猎人; 
    OLED_DrawBMP(0 , 0 , 128 , 8 , BMP_Shooting);
    Delay_Nms(1000);
    OLED_Clear();

// 实心字 + 图;
    OLED_DrawBMP(0 , 0 , 128 , 8 , BMP_DuckHunting);
    Delay_Nms(1000); 
    OLED_Clear();
	
//	OLED_DrawBMP(0 , 3, 16, 5, PLAY);
//	
//	OLED_ShowString(50,3,"abcdefg"); 
//	Delay_Nms(10000);
//	OLED_Clear();
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_100);
//	Delay_Nms(5000);
//	OLED_Clear();	
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_80);
//	Delay_Nms(5000);
//	OLED_Clear();
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_50);
//	Delay_Nms(5000);
//	OLED_Clear();
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_30);
//	Delay_Nms(5000);
//	OLED_Clear();
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_0);
//	Delay_Nms(5000);
//	OLED_Clear();
//	
//	OLED_DrawBMP(111 , 0, 127, 1, BAT_charge);
//	Delay_Nms(5000);
//	OLED_Clear();

}


void GUI_ClearSCR()       //清屏
{
  unsigned int i;
  for(i = 0; i < (X_WIDTH * Y_WIDTH / 8) ; i++)
  {
    gui_disp_buf[i] = 0x00;
  }
}

void OLED_DrawWindow(void)  
{  
  unsigned int j;
  unsigned char  i , n;		
  
  j = 0;
  for(i = 0; i < 8 ;i++)  
  {  
    OLED_WriteCommond(0xb0 + i);  //OLED_WR_Byte (0xb0+i,OLED_CMD);         //设置页地址(0~7)
    OLED_WriteCommond(0x00);      //OLED_WR_Byte (0x00,OLED_CMD);           //设置显示位置—列低地址
    OLED_WriteCommond(0x10);      //OLED_WR_Byte (0x10,OLED_CMD);           //设置显示位置—列高地址   
    for(n = 0; n < 128 ; n++)
      OLED_WriteData(gui_disp_buf[j++]);
  }
}

//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示				 
//size:选择字体 16/12 
void OLED_ShowChar_backup(unsigned char x , unsigned char y , unsigned char chr)
{      	
  unsigned char c = 0 , i = 0;	
  c = chr-' ';//得到偏移后的值			
  if(x > Max_Column - 1)
  {
    x = 0;
    y = y + 2;
  }
  if(SIZE == 16)
  {
    OLED_Set_Pos(x,y);	
    for(i=0; i<8; i++)
   		OLED_WriteData(F8X16[c * 16 + i]);
    
    OLED_Set_Pos(x , y + 1);
    
    for(i = 0;i < 8; i++)
    	OLED_WriteData(F8X16[c*16 + i + 8]);
  }
  else 
  {	
    OLED_Set_Pos(x,y+1);
    
    for(i=0;i<6;i++)
    	OLED_WriteData(F6x8[c][i]);          
  }
}

void OLED_ShowChar(unsigned char x , unsigned char y , unsigned char chr)
{      	
  unsigned char c = 0 , i = 0;	
  c = chr-' ';//得到偏移后的值			
  if(x > Max_Column - 1)
  {
    x = 0;
    y = y + 2;
  }
 	
    OLED_Set_Pos(x,y+1);
    
    for(i=0; i<6; i++)
    	OLED_WriteData(F6x8[c][i]);          

}

//m^n函数
unsigned int oled_pow(unsigned char m , unsigned char n)
{
  unsigned int result = 1;	 
  while(n--)result*=m;    
  return result;
}				  
//显示2个数字
//x,y :起点坐标	 
//len :数字的位数
//size:字体大小
//mode:模式	0,填充模式;1,叠加模式
//num:数值(0~4294967295);	 		  
void OLED_ShowNum(unsigned char x,unsigned char y , unsigned int num , unsigned char len , unsigned char size2)
{         	
    unsigned char t , temp;
    unsigned char enshow = 0;						   
    for(t = 0; t < len; t++)
    {
      temp = (num / oled_pow(10 , len - t - 1)) % 10;
      if(enshow == 0 && t <(len - 1))
      {
          if(temp == 0)
          {
            OLED_ShowChar(x + (size2 / 2) * t, y, ' ');
            continue;
          }
          else 
            enshow = 1; 
               
      }
      OLED_ShowChar( x + ( size2 / 2 ) * t, y, temp +'0'); 
    }
} 

//显示一个字符号串
void OLED_ShowString(unsigned char x , unsigned char y , unsigned char *chr)
{
  	unsigned char j = 0;
  	while(chr[j] != '\0')
  	{
    	OLED_ShowChar(x , y , chr[j]);
    	x += 8;
    	if(x > 120)
    	{
      		x = 0;
      		y += 2;
    	}
    	j++;
  	}
}

//显示汉字
void OLED_ShowCHinese(unsigned char x , unsigned char y , unsigned char no)
{      			    
  unsigned char t,adder=0;
  OLED_Set_Pos(x,y);	
  for(t = 0 ;t < 16; t++)
  {
    OLED_WriteData(Hzk[2 * no][t]);
    adder += 1;
  }	
  OLED_Set_Pos(x , y + 1);	
  for(t = 0 ; t < 16; t++)
  {	
    OLED_WriteData(Hzk[2*no+1][t]);
    adder += 1;
  }					
}

//显示 16 X 32 0-9数字
void OLED_ShowNum16X32(unsigned char x , unsigned char y , unsigned char no)
{      			    
  unsigned char t, adder = 0;
  
  OLED_Set_Pos(x,y);	
  for(t = 0 ;t < 16; t++)
  {
    OLED_WriteData( Num16x32[4 * no][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x , y + 1);	
  for(t = 0 ; t < 16; t++)
  {	
    OLED_WriteData(Num16x32[4*no + 1][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x,y + 2);	
  for(t = 0 ;t < 16; t++)
  {
    OLED_WriteData(Num16x32[4 * no + 2][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x , y + 3);	
  for(t = 0 ; t < 16; t++)
  {	
    OLED_WriteData(Num16x32[4*no + 3][t]);
    adder += 1;
  }
}

//显示 32 X 32 特殊符号
void OLED_ShowNum32X32(unsigned char x , unsigned char y , unsigned char no)
{      			    
  unsigned char t,adder = 0;
  
  OLED_Set_Pos(x,y);	
  for(t = 0 ;t < 32; t++)
  {
    OLED_WriteData( Num32x32[4 * no][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x , y + 1);	
  for(t = 0 ; t < 32; t++)
  {	
    OLED_WriteData(Num32x32[4*no + 1][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x,y + 2);	
  for(t = 0 ;t < 32; t++)
  {
    OLED_WriteData(Num32x32[4 * no + 2][t]);
    adder += 1;
  }	
  
  OLED_Set_Pos(x , y + 3);	
  for(t = 0 ; t < 32; t++)
  {	
    OLED_WriteData(Num32x32[4*no + 3][t]);
    adder += 1;
  }
}


/***********功能描述:显示显示BMP图片 128 ×64 起始点坐标(x,y), x 的范围 0~127, y 为页的范围 0~7 *****************/
//void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
//{ 	
// unsigned int j=0;
// unsigned char x,y;
//  
//  if(y1  %8 == 0) y = y1 / 8;      
//  else y = y1/8 + 1;
//  for(y=y0;y<y1;y++)
//  {
//    OLED_Set_Pos(x0,y);
//    for(x = x0; x < x1 ; x++)
//    {      
//      OLED_WriteData(BMP[j++]);	    	
//    }
//  }
//} 

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1, const unsigned char BMP[])
{ 	
 	unsigned int  j=0;
 	unsigned char x,y;
  
  	if(y1 % 8 == 0) 
  	{
  		y = y1 / 8;  
  	}    
  	else 
  	{
  		y = y1 / 8 + 1;
  	}
  	
  	for(y=y0; y<y1; y++)
  	{
      	OLED_Set_Pos(x0,y);
      	for(x = x0; x < x1; x++)
      	{      
       		OLED_WriteData(BMP[j++]);	    	
      	}
  	}
} 

void OLED_Reset()
{
  RES_Set();
  Delay_Nms(100);
  RES_Reset();
  Delay_Nms(100);
  RES_Set();
 // Delay_Nms(1000);
  
  OLED_WriteCommond(0xae);
  
  OLED_WriteCommond(0x00);
  OLED_WriteCommond(0x10);
  
  OLED_WriteCommond(0x40);
  OLED_WriteCommond(0x81);
  OLED_WriteCommond(0xcf);
  
  OLED_WriteCommond(0xa1);
  OLED_WriteCommond(0xc8);
  
  OLED_WriteCommond(0xa6);
  
  OLED_WriteCommond(0xa8);
  OLED_WriteCommond(0x3f);
  OLED_WriteCommond(0xd3);
 
  OLED_WriteCommond(0x00);
  
  OLED_WriteCommond(0xd5);
  OLED_WriteCommond(0x80);
  
  OLED_WriteCommond(0xd9);
  OLED_WriteCommond(0xf1);
  
  OLED_WriteCommond(0xda);
  OLED_WriteCommond(0x12);
  
  OLED_WriteCommond(0xdb);
  OLED_WriteCommond(0x40);
  OLED_WriteCommond(0x20);
  OLED_WriteCommond(0x02);
  OLED_WriteCommond(0x8d);
  OLED_WriteCommond(0x14);
  OLED_WriteCommond(0xa4);
  OLED_WriteCommond(0xa6);
  OLED_WriteCommond(0xaf);  
  
  OLED_Clear();
  OLED_Set_Pos(0 , 0);
  //OLED_Display_On();
  //OLED_ShowString(0 , 0 , "OLED Test!!");
  
}









联系我们

联系人:客服在线

手机:全工:13903011251

电话:李R:13530006400

邮箱:729986191@qq.com

地址: GUANGDONG PROVINCE

用手机扫描二维码关闭
二维码