小弟刚接触OLED,自己写了个显示字符的小程序练练手,显示一个字符'A',但是老是调不好,说明书看了又看,郁闷。。。。求助大侠啊
部分程序贴出:
待显示字符A分开了
主函数
#include<stm32f10x_lib.h>
#include"delay.h"
#include"sys.h"
#include"oled.h"int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
OLED_GPIO_Init();
OLED_Set_Init();
while(1)
{
write_zifu_1608(0,0,'A');
OLED_Refresh_Gram();
delay_ms(600);
OLED_Clear();
}
}
OLED显示函数
#include"oled.h"
#include"fount.h"
u8 OLED_GRAM[128][8];
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
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 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_GPIO_Init(void)
{
RCC->APB2ENR|=1<<3; //使能PORTB的时钟,数据位0-7
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;
}
void OLED_Set_Init(void)
{
OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
OLED_WR_Byte(0x80,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 OLED_WR_Byte(u8 dat,u8 cmd)
{
DATAOUT(dat);
OLED_DC=cmd;
OLED_CS=0;
OLED_WR=0;
OLED_WR=1;
OLED_CS=1;
OLED_DC=1;
}
void write_zifu_1608(u8 x,u8 y,u8 chr)
{
u8 i;
chr=chr-' ';
for(i=0;i<16;i=i+2)
{
OLED_GRAM[x+i][y]|=asc2_1608[chr];
OLED_GRAM[x+i][y-1]|=asc2_1608[chr][i+1];
}
}
|