历史上的今天
今天是:2024年09月29日(星期日)
2018年09月29日 | STM32f4---OLCD显示实验代码(04)
2018-09-29 来源:eefocus
在知道了取模方式之后,我们就可以根据取模的方式来编写显示字符的代码了,这里我们针对以上取模方式的显示字符代码如下:
//在指定位置显示一个字符,包括部分字符
//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
{
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值。然后我们编译此工程,直到编译成功为止。
史海拾趣
|
整个手机产业目前的状况似乎已经陷入一种以价格竞争的阶段,有点像电视机市场。手机好像已经不属于我们印象中的高科技产品,几百块钱的手机就已经具备很丰富的功能,如音乐、拍照、摄像、手写输入、超大的触摸屏,真令人不可思议。用Intersil公司中 ...… 查看全部问答> |
|
我用的是2450,要在某些时刻屏蔽外部中断0,5~13一共10个外部中断中的部分中断。 我想可能有两种方法吧(不知道是不是): 1.对中断寄存器操作; 2.调用API 对于第一种方法,我参考了一下三星的使用手册,知道关键是操作INTMASK寄存 ...… 查看全部问答> |
|
各位高手,在shell中用spy可以查看各个任务以及总的cpu利用率,并用一个表列出结果,现在我只想取出空闲率这个数据,请问该怎样实现呢?… 查看全部问答> |
|
由于项目需要监测一些模拟量所以要用到ADC,这两天试了试LM3S8962的ADC功能,有一些收获,不敢独享和拿出来和大家分享。 ADC用于将连续变化的模拟电压转换成 ...… 查看全部问答> |
|
有没有兄弟遇到过相同的问题啊,jtag电路是和开发板上的一样,加了27欧电阻,TMS加了上拉电阻,其他信号线没上拉,h-jtag可以识别开发板的内核ID,但是无法识别自己做的板子的。后来在其他信号线上也加了上拉,还是无法识别。外部16M晶振起振,引脚 ...… 查看全部问答> |
|
能不能以CCSV4为例介绍一下如何计算一段代码的执行时间?CCSV4应该有自动计算某段代码执行时间的功能吧,但不知道怎么用,希望高手指点一下,最好给出截图,呵呵。… 查看全部问答> |
|
正点原子STM32战舰开发板(99新) 就上了几次电,我本人后面转fpga,dsp方向,就放置了,一直没有时间学习,最近看板子一直在吃灰,就拿来出了。 开发板*1,3.5寸液晶*1,JLINKV8*1,ENC28J60以太网络模块*1, 2.4G无线模块NRF24L01*2=========== ...… 查看全部问答> |




