這樣技術才能有新發展,每個人思路不一樣說不定調出的代碼會更好。這是買屏的時候附帶的資料分享給需要的人他們家的屏質量不錯哦不知道能不能買屏自己把電路設計到板子上,單片機用的是STM32F103C8T6
單片機源程序如下:
- #include "oled.h"
- #include "stdlib.h"
- #include "oledfont.h"
- #include "delay.h"
- u8 OLED_GRAM[144][8];
- //反顯函數
- void OLED_ColorTurn(u8 i)
- {
- if(i==0)
- {
- OLED_WR_Byte(0xA6,OLED_CMD);//正常顯示
- }
- if(i==1)
- {
- OLED_WR_Byte(0xA7,OLED_CMD);//反色顯示
- }
- }
- //屏幕旋轉180度
- void OLED_DisplayTurn(u8 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 IIC_delay(void)
- {
- u8 t=3;
- while(t--);
- }
- //起始信號
- void I2C_Start(void)
- {
- OLED_SDA_Set();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SDA_Clr();
- IIC_delay();
- OLED_SCL_Clr();
- IIC_delay();
- }
- //結束信號
- void I2C_Stop(void)
- {
- OLED_SDA_Clr();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SDA_Set();
- }
- //等待信號響應
- void I2C_WaitAck(void) //測數據信號的電平
- {
- OLED_SDA_Set();
- IIC_delay();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SCL_Clr();
- IIC_delay();
- }
- //寫入一個字節
- void Send_Byte(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- if(dat&0x80)//將dat的8位從最高位依次寫入
- {
- OLED_SDA_Set();
- }
- else
- {
- OLED_SDA_Clr();
- }
- IIC_delay();
- OLED_SCL_Set();
- IIC_delay();
- OLED_SCL_Clr();//將時鐘信號設置為低電平
- dat<<=1;
- }
- }
- //發送一個字節
- //mode:數據/命令標志 0,表示命令;1,表示數據;
- void OLED_WR_Byte(u8 dat,u8 mode)
- {
- I2C_Start();
- Send_Byte(0x78);
- I2C_WaitAck();
- if(mode){Send_Byte(0x40);}
- else{Send_Byte(0x00);}
- I2C_WaitAck();
- Send_Byte(dat);
- I2C_WaitAck();
- I2C_Stop();
- }
- //開啟OLED顯示
- void OLED_DisPlay_On(void)
- {
- OLED_WR_Byte(0x8D,OLED_CMD);//電荷泵使能
- OLED_WR_Byte(0x14,OLED_CMD);//開啟電荷泵
- OLED_WR_Byte(0xAF,OLED_CMD);//點亮屏幕
- }
- //關閉OLED顯示
- void OLED_DisPlay_Off(void)
- {
- OLED_WR_Byte(0x8D,OLED_CMD);//電荷泵使能
- OLED_WR_Byte(0x10,OLED_CMD);//關閉電荷泵
- OLED_WR_Byte(0xAE,OLED_CMD);//關閉屏幕
- }
- //更新顯存到OLED
- void OLED_Refresh(void)
- {
- u8 i,n;
- for(i=0;i<8;i++)
- {
- OLED_WR_Byte(0xb0+i,OLED_CMD); //設置行起始地址
- OLED_WR_Byte(0x00,OLED_CMD); //設置低列起始地址
- OLED_WR_Byte(0x10,OLED_CMD); //設置高列起始地址
- I2C_Start();
- Send_Byte(0x78);
- I2C_WaitAck();
- Send_Byte(0x40);
- I2C_WaitAck();
- for(n=0;n<128;n++)
- {
- Send_Byte(OLED_GRAM[n][i]);
- I2C_WaitAck();
- }
- I2C_Stop();
- }
- }
- //清屏函數
- void OLED_Clear(void)
- {
- u8 i,n;
- for(i=0;i<8;i++)
- {
- for(n=0;n<128;n++)
- {
- OLED_GRAM[n][i]=0;//清除所有數據
- }
- }
- OLED_Refresh();//更新顯示
- }
- //畫點
- //x:0~127
- //y:0~63
- //t:1 填充 0,清空
- void OLED_DrawPoint(u8 x,u8 y,u8 t)
- {
- u8 i,m,n;
- i=y/8;
- m=y%8;
- n=1<<m;
- if(t){OLED_GRAM[x][i]|=n;}
- else
- {
- OLED_GRAM[x][i]=~OLED_GRAM[x][i];
- OLED_GRAM[x][i]|=n;
- OLED_GRAM[x][i]=~OLED_GRAM[x][i];
- }
- }
- //畫線
- //x1,y1:起點坐標
- //x2,y2:結束坐標
- void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode)
- {
- u16 t;
- int xerr=0,yerr=0,delta_x,delta_y,distance;
- int incx,incy,uRow,uCol;
- delta_x=x2-x1; //計算坐標增量
- delta_y=y2-y1;
- uRow=x1;//畫線起點坐標
- uCol=y1;
- if(delta_x>0)incx=1; //設置單步方向
- else if (delta_x==0)incx=0;//垂直線
- else {incx=-1;delta_x=-delta_x;}
- if(delta_y>0)incy=1;
- else if (delta_y==0)incy=0;//水平線
- else {incy=-1;delta_y=-delta_x;}
- if(delta_x>delta_y)distance=delta_x; //選取基本增量坐標軸
- else distance=delta_y;
- for(t=0;t<distance+1;t++)
- {
- OLED_DrawPoint(uRow,uCol,mode);//畫點
- xerr+=delta_x;
- yerr+=delta_y;
- if(xerr>distance)
- {
- xerr-=distance;
- uRow+=incx;
- }
- if(yerr>distance)
- {
- yerr-=distance;
- uCol+=incy;
- }
- }
- }
- //x,y:圓心坐標
- //r:圓的半徑
- void OLED_DrawCircle(u8 x,u8 y,u8 r)
- {
- int a, b,num;
- a = 0;
- b = r;
- while(2 * b * b >= r * r)
- {
- OLED_DrawPoint(x + a, y - b,1);
- OLED_DrawPoint(x - a, y - b,1);
- OLED_DrawPoint(x - a, y + b,1);
- OLED_DrawPoint(x + a, y + b,1);
-
- OLED_DrawPoint(x + b, y + a,1);
- OLED_DrawPoint(x + b, y - a,1);
- OLED_DrawPoint(x - b, y - a,1);
- OLED_DrawPoint(x - b, y + a,1);
-
- a++;
- num = (a * a + b * b) - r*r;//計算畫的點離圓心的距離
- if(num > 0)
- {
- b--;
- a--;
- }
- }
- }
復制代碼
Keil代碼下載:
Keil代碼.7z
(196.81 KB, 下載次數: 110)
2023-3-14 00:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|