前言:代码是最有力的解释,是最简洁的数学,废话不多说,直接上代码
/*
oled屏是128X64,我以左下角为坐标原点,
x范围是0~128,y是0~64,因此代入函数的坐标范围也需如此
*/
void OLED_DrawLine(int x0, int y0, int x1, int y1)//连接两点坐标的线
{
uint8_t temp=0;
float kk=(float)(y1-y0)/(x1-x0);//计算两点斜率,用浮点数避免斜率为零
int i,j,k;
OLED_SetCursor(0, 0);//坐标原点
for (j = 0; j <8; j++){//oled是一次性写入8bite数据点亮,所以只需循环64/8=8
for (i = x0; i < x1+1; i++)//在x0~x1之间区域作线
{
OLED_SetCursor(j, i);//即寻找y方向第j个8X1方阵(纵向点灯)
temp=0x00;//默认灯全灭
for (k = 0; k < 8; k++){
if((kk*(i-x0))<(64-(j*8+k)-y0+1)&&(kk*(i-x0))>(64-(j*8+k)-y0-1))//用的浮点数,所以设置误差范围+-1,由于零点设置,需要倒一下
temp|=1<<k;//即将8X1方阵中满足我建立的坐标系及斜率的点置1
}
OLED_WriteData(temp); //写入数据,点灯
}}
}
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include"math.h"
int main(void)
{
OLED_Init();
for(int i=1;i<128;i++)
//OLED_DrawLine(i-1, (i-1)*(i-1)/100, i, i*i/100);//y=x*x
OLED_DrawLine(i-1, 32*sin((i-1)/10.0)+32, i, 32*sin(i/10.0)+32);//y=sin(x)
while(1)
{
}
}
效果:
总结:工程取自b站自化协,函数为我C不到后的原创。