原子哥 OLED显示实验笔记2

原子哥讲解的有1206 1608 2412三种字体

意思是:例如1206用12行6列的12*6个方格显示字体

以1206的字符%为例  在OLED显示字符%

{0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/

这里可以看到1206占用12个字节,这个12字节是如何体现出了的呢,第一列前八个点占一字节,紧接着一字节高四位占余下4个点(也就是四位),剩余低4位舍弃不用,后面几列同理。

应用到的函数如下  x表示%的行坐标 y表示%的列坐标位置

size为选择字体大小 12(1206),16(1608)24(2412)

mode为1为正常显示 为0则反白显示

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{      			    
	u8 temp,t,t1;
	u8 y0=y;
	u8 csize=(size/8+((size%8)?1:0))*(size/2);		//得到字体一个字符对应点阵集所占的字节数
	chr=chr-' ';//得到偏移后的值		 
    for(t=0;t<csize;t++)
    {   
		if(size==12)temp=asc2_1206[chr][t]; 	 	//调用1206字体
		else if(size==16)temp=asc2_1608[chr][t];	//调用1608字体
		else if(size==24)temp=asc2_2412[chr][t];	//调用2412字体
		else return;								//没有的字库
        for(t1=0;t1<8;t1++)
		{
			if(temp&0x80)OLED_DrawPoint(x,y,mode);//0x80 0100 0000 如果数字的第二位为1,则进行描点的颜色为字体颜色,如果不是1,则描点颜色为底色。
			else OLED_DrawPoint(x,y,!mode);
			temp<<=1;
			y++;
			if((y-y0)==size)
			{
				y=y0;
				x++;
				break;
			}
		}  	 
    }          
}

几个函数:

显示单个字符

void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)   x,y位坐标 chr为要显示的值 size为字体大小 mode为0是反白显示 1为正常显示

OLED_ShowChar(36,52,'a',12,1);    在(36,52)处显示字符a

显示两位数字

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)

OLED_ShowNum(94,52,8,3,12);    在(94,52)处显示数字8

显示字符串

void OLED_ShowString(u8 x,u8 y,const u8 *p,u8 size)

OLED_ShowString(0,0,"shengri",24);   在(0,0)处显示shengri

引脚和时钟设置

GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE );  
#if OLED_MODE==1    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //使能AFIO时钟

     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);    //JTAG-DP 失能 + SW-DP使能 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                 
    GPIO_Write(GPIOB,0XFFFF);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    GPIO_SetBits(GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);//如果每一位决定一个GPIO_Pin,则可以通过或的形式来初始化多个IO

疑问:为什么要使能AFIO时钟
因为 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);  设置JTAG失能 SW使能 重映射的设置所以要使能AFIO  因为OLED要用到PB3 PB4管脚 所以要将JTAG失能 (程序默认PB3 PB4为JTAG服务)

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值