我们今天将要画的内容直接丢进数组里,全画完后再丢进OLED.
昨天我们搞的这些代码今天用上.就是如下这些,我得重复一次.
哈哈,爽吧.如闪得不够爽,就将1000改成100.
#include "sys.h"
#include "usart.h"
#include "delay.h"
#define OLED_CS PCout(9)
//#define OLED_RST  

Bout(14)//在MINISTM32上直接接到了STM32的复位脚!
#define OLED_RS PCout(8)
#define OLED_WR PCout(7)
#define OLED_RD PCout(6)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
//PB0~7,作为数据线
#define DATAOUT(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF); //输出
u8 OLED_GRAM[128][8];
void OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
OLED_RS=cmd;
OLED_CS=0;
OLED_WR=0;
OLED_WR=1;
OLED_CS=1;
OLED_RS=1;
}
void OLED_Refresh_Gram(void)
{
u8 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(OLED_GRAM[n],OLED_DATA);
}
}
void OLED_Clear(void)
{
u8 i,n;
for(i=0;i<8;i++)for(n=0;n<128;n++)OLED_GRAM[n]=0X00;
OLED_Refresh_Gram();//更新显示
}
void IO_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
JTAG_Set(SWD_ENABLE);
GPIOB->CRL=0X33333333;
GPIOB->ODR|=0XFFFF;
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH|=0X00000033;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;
OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
OLED_WR_Byte(80,OLED_CMD); //[3:0],分频因子;[7:4],震荡频率
OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)
OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
OLED_WR_Byte(0X00,OLED_CMD); //默认为0
OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示
OLED_WR_Byte(0xAF,OLED_CMD); //开启显示
OLED_Clear();
}
//画点函数
void dot(u8 x,u8 y)
{
u8 Y_page,Y_data,temp;
Y_page = y/8; //将Y座标值变在页的的数值
temp = y%8; //所在点的位置
Y_data = 1<<temp; //得到这个点在这页里的Y坐标
//OLED_GRAM[128][8];
OLED_GRAM[x][Y_page] |= Y_data;
}
//画横线函数
void X_line(u8 x0,u8 x1,u8 y) // x0为从左到右的起始点x1为结束点 注意x1一定要比x0大 否则会出错 可以在代码里做成不论大小,但复杂会影响大家的学习热情
{
u8 i;
for (i=x0;i<x1;i++)
{
dot(i,y);
}
}
//画竖线函数
void Y_line(u8 x,u8 y0,u8 y1) // 原理同画横线
{
u8 i;
for (i=y0;i<y1;i++)
{
dot(x,i);
}
}
int main(void)
{
// u8 i,j;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
IO_Init();
while (1)
{
OLED_WR_Byte (0x81,OLED_CMD);
OLED_WR_Byte (0xff,OLED_CMD);
X_line(10,118,40);
X_line(10,118,0);
Y_line(10,0,40);
Y_line(118,0,40);
OLED_Refresh_Gram();
delay_ms(1000);
OLED_Clear();
delay_ms(1000);
}
}