STM32f4————OLCD显示实验代码(04)
/*******************************************************/
在知道了取模方式之后,我们就可以根据取模的方式来编写显示字符的代码了,这里我们针对以上取模方式的显示字符代码如下:
//在指定位置显示一个字符,包括部分字符
//x:0~127 y:0~63
//mode:0,反白显示;1,正常显示
//size:选择字体 12/16/24
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)
{
u8 temp,t,t1,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);
else OLED_DrawPoint(x,y,!mode);
temp<<=1;y++;
if((y-y0)==size)
{
y=y0; x++;break;
}
}
}
}
该函数为字符以及字符串显示的核心部分,函数中 chr=chr-' ';这句是要得到在字符点阵数据里面的实际地址,因为我们的取模是从空格键开始的,例如oled_asc2_1206[0][0],代表的是空格符开始的点阵码。在接下来的代码,我们也是按照从上到小(先 y++),从左到右(再 x++)的取模方式来编写的,先得到最高位,然后判断是写 1 还是 0,画点;接着读第二位,如此循环,直到一个字符的点阵全部取完为止。这其中涉及到列地址和行地址的自增,根据取模方式来理解,就不难了。
oled.c的内容就为大家介绍到这里,接下来我们看看oled.h 代码:
#ifndef __OLED_H
#define __OLED_H
#include "sys.h"
#include "stdlib.h"
//OLED 模式设置
//0: 4线串行模式 (模块的BS1,BS2 均接GND)
//1: 并行8080 模式 (模块的BS1,BS2均接VCC)
#define OLED_MODE 1
//-----------------OLED 端口定义----------------
#define OLED_CS PBout(7)
#define OLED_RST PGout(15)
#define OLED_RS PDout(6)
#define OLED_WR PAout(4)
#define OLED_RD PDout(7)
//使用4 线串行接口时使用
#define OLED_SCLK PCout(6)
#define OLED_SDIN PCout(7)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
//OLED 控制用函数
void OLED_WR_Byte(u8 dat,u8 cmd);
…… //忽略部分函数声明
void OLED_ShowString(u8 x,u8 y,const u8 *p);
#endif
该部分比较简单,OLED_MODE 的定义也在这个文件里面,我们必须根据自己 OLED 模块 BS1和 BS2的设置(目前代码仅支持 8080和4线SPI)来确定OLED_MODE的值。
最后我们来看看主函数代码:
int main(void)
{
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为 115200
LED_Init(); //初始化 LED
OLED_Init(); //初始化OLED
OLED_ShowString(0,0,"ALIENTEK",24);
OLED_ShowString(0,24, "0.96' OLED TEST",16);
OLED_ShowString(0,40,"ATOM 2014/5/4",12);
OLED_ShowString(0,52,"ASCII:",12);
OLED_ShowString(64,52,"CODE:",12);
OLED_Refresh_Gram();//更新显示到OLED
t=' ';
while(1)
{
OLED_ShowChar(36,52,t,12,1);//显示 ASCII字符
OLED_ShowNum(94,52,t,3,12); //显示 ASCII字符的码值
OLED_Refresh_Gram();//更新显示到OLED
t++;
if(t>'~')t=' ';
delay_ms(500); LED0=!LED0;
}
}
该部分代码用于在OLED上显示一些字符,然后从空格键开始不停的循环显示 ASCII字符集,并显示该字符的ASCII值。然后我们编译此工程,直到编译成功为止。
/*******************************************************/
【立创商城】STM32F103CBT6 托盘 https://item.szlcsc.com/8796.html |