原贴链接:http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=22504&highlight=u8glib
第一部分,u8glib标准语法格式:
本文使用的是DFRobot出品的LCD12864 Shield V1.0
端口占用情况:
SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
背光控制占用数字口7
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
setup(){
}
void
loop(){
u8g.firstPage();
do
{
//display
}
while
(u8g.nextPage());
}
//u8g.firstPage() 表示图像循环的开始
//u8g.nextPage() 表示图像循环的结束
|
第二部分,画出几何图形
首先是画点。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawPixel(unit8_t x, unit8_t y)
//参数为:(x:点的横坐标 y:点的纵坐标)
|
例子: u8g.drawPixel(14, 23);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawPixel(14, 23);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后是画线。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawLine(u8g_uint_t x1, u8g_uint_t y1, u8g_uint_t x2, u8g_uint_t y2)
//参数为: (x1:线段起始点横坐标 y1:线段起始点纵坐标 x2:线段结束点横坐标 y2:线段结束点纵坐标)
|
例子: u8g.drawLine(7, 10, 40, 55);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//画一个V
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawLine(7, 10, 40, 55);
u8g.drawLine(40, 55, 73, 10);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后是画连续点(线段)(水平线段或垂直线段)
函数语法:
[C]
纯文本查看
复制代码
1
2
3
|
void
U8GLIB::drawHLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w)
//水平线段
void
U8GLIB::drawVLine(u8g_uint_t x, u8g_uint_t y, u8g_uint_t h)
//垂直线段
//参数为: (x:线段起始点 y:线段结束点 w:水平宽度 h:垂直高度)(高度单位为像素点)
|
例子: u8g.drawHLine(60,12, 30); u8g.drawVLine(10,20, 20);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//画一个方形
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawHLine(40,15, 30);
u8g.drawVLine(70,15, 30);
u8g.drawHLine(40,45, 30);
u8g.drawVLine(40,15, 30);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后是画出实心的三角形
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
//参数为:(x0:一个角的横坐标 y0:一个角的纵坐标 x1:另一个角的横坐标 y1:另一个角的纵坐标 x2:最后一个角的横坐标 y2:最后一个角的纵坐标)
|
例子: u8g.drawTriangle(14,9, 45,32, 9,42);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个实心三角形
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawTriangle(14,9, 45,32, 9,42);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后是画出空心矩形,刚才我们用画线段的方式实现了画空心矩形,现在用更简单的方法就可以画出空心矩形。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h)
//参数是:(x:矩形左上角横坐标 y:矩形左上角纵坐标 w:矩形的宽 h:矩形的高)(高和宽的单位都是像素)
|
例子: u8g.drawFrame(10, 12, 30, 20);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个空心矩形
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawFrame(10, 12, 30, 20);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后是画圆角空心矩形
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawRFrame(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r)
//参数是: (x:圆角矩形左上角横坐标 y:圆角矩形左上角纵坐标 w:圆角矩形宽度 h:圆角矩形高度 r:圆角弧度的半径)
|
注意:最好要满足两个公式,使用时最好加上if来判断是否符合要求
w > = 2 * x * ( r + 1 )
h > = 2 * x * ( r + 1 )
例子: u8g.drawRFrame(10 ,12 ,30 ,20 ,5);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个圆角空心矩形
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawRFrame(10,12, 30,20, 5);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后画实心矩形,和画空心的一样。注意语法区别!!!
函数语法:
[C]
纯文本查看
复制代码
1
|
void
U8GLIB::drawBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h)
|
例子: u8g.drawBox(10,12,20,30);
然后画出圆角实心矩形,和画圆角空心矩形一样,但注意语法区别!!!
函数语法:
[C]
纯文本查看
复制代码
1
|
void
U8GLIB::drawRBox(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h, u8g_uint_t r)
|
例子: u8g.drawRBox(10 ,12 ,30 ,20 ,5);
然后画出空心圆
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawCircle(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL)
//参数是:(x0:圆心的横坐标 y0:圆心的纵坐标 rad:圆的半径 opt:见下表)
|
- U8G_DRAW_UPPER_RIGHT 上部右侧 1/4 圆弧
- U8G_DRAW_UPPER_LEFT 上部左侧 1/4 圆弧
- U8G_DRAW_LOWER_LEFT 下部左侧 1/4 圆弧
- U8G_DRAW_LOWER_RIGHT 下部右侧 1/4 圆弧
- U8G_DRAW_ALL 整圆(默认)
例子: u8g.drawCircle(20,20, 14); //整圆
u8g.drawCircle(20,20, 14, U8G_DRAW_UPPER_RIGHT); //1/4圆
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个空心圆
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawCircle(20,20, 14);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后画出实心圆
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawDisc(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rad, uint8_t opt = U8G_DRAW_ALL)
//参数是:(x0:圆心的横坐标 y0:圆心的纵坐标 rad:圆的半径 opt:见下表)
|
- U8G_DRAW_UPPER_RIGHT 上部右侧 1/4 扇形
- U8G_DRAW_UPPER_LEFT 上部左侧 1/4 扇形
- U8G_DRAW_LOWER_LEFT 下部左侧 1/4 扇形
- U8G_DRAW_LOWER_RIGHT 下部右侧 1/4 扇形
- U8G_DRAW_ALL 整圆(默认)
例子: u8g.drawDisc(20,20, 14); //整圆
u8g.drawDisc(20,20, 14, U8G_DRAW_UPPER_RIGHT); //1/4圆
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个实心圆
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawDisc(20,20, 14);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后画出椭圆(空心)
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
drawEllipse(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rx, u8g_uint_t ry, uint8_t opt)
//参数是:(x0:椭圆圆心的横坐标 y0:椭圆圆心的纵坐标 rx:水平方向半径 ry:垂直方向半径 rad:圆的半径 opt:见下表)
|
- U8G_DRAW_UPPER_RIGHT 上部右侧 1/4 椭圆弧
- U8G_DRAW_UPPER_LEFT 上部左侧 1/4 椭圆弧
- U8G_DRAW_LOWER_LEFT 下部左侧 1/4 椭圆弧
- U8G_DRAW_LOWER_RIGHT 下部右侧 1/4 椭圆弧
- U8G_DRAW_ALL 整圆(默认)
例子: u8g.drawEllipse(20,20, 14,17);
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//画一个椭圆
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.drawEllipse(20,20, 14,17);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
然后画出椭圆(空心),和画空心椭圆是一样的,但注意语法格式区别
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
drawFilledEllipse(u8g_uint_t x0, u8g_uint_t y0, u8g_uint_t rx, u8g_uint_t ry, uint8_t opt)
//参数是:(x0:椭圆圆心的横坐标 y0:椭圆圆心的纵坐标 rx:水平方向半径 ry:垂直方向半径 rad:圆的半径 opt:见下表)
|
- U8G_DRAW_UPPER_RIGHT 上部右侧 1/4 椭圆弧
- U8G_DRAW_UPPER_LEFT 上部左侧 1/4 椭圆弧
- U8G_DRAW_LOWER_LEFT 下部左侧 1/4 椭圆弧
- U8G_DRAW_LOWER_RIGHT 下部右侧 1/4 椭圆弧
- U8G_DRAW_ALL 整圆(默认)
例子: u8g.drawFilledEllipse(20,20, 14,17);
以上就是使用u8glib库画出几何图形。 整理一下:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
u8g.drawPixel(14, 23);
//画点
u8g.drawLine(7, 10, 40, 55);
//画线
u8g.drawHLine(60,12, 30);
//画水平线段
u8g.drawVLine(10,20, 20);
//画垂直线段
u8g.drawTriangle(14,9, 45,32, 9,42);
//画实心三角形
u8g.drawFrame(10, 12, 30, 20);
//画空心矩形
u8g.drawRFrame(10 ,12 ,30 ,20 ,5);
//画空心圆角矩形
u8g.drawBox(10,12,20,30);
//画实心矩形
u8g.drawRBox(10 ,12 ,30 ,20 ,5);
//画实心圆角矩形
u8g.drawCircle(20,20, 14);
//整空心圆
u8g.drawCircle(20,20, 14, U8G_DRAW_UPPER_RIGHT);
//1/4空心圆
u8g.drawDisc(20,20, 14);
//整实心圆
u8g.drawDisc(20,20, 14, U8G_DRAW_UPPER_RIGHT);
//1/4扇形
u8g.drawEllipse(20,20, 14,17);
//空心椭圆
u8g.drawFilledEllipse(20,20, 14,17);
//实心椭圆
|
第三部分,打印字符,字符串
继续上一次的u8glib自学笔记,整理过了有关打印几何图像的函数,下一步就是学习一下如何打印字符。
首先是画出字符。
函数语法:
例子:
完整代码:
另一种打印字符,字符串的方法就是用print。
print()函数可以打印字符,字符串,变量值等。但是用以前需要用setPrintPos()来设置位置
函数语法:
例子:
完整代码:
第四部分,画出图像
首先是显示一个位图。
函数语法:
例子:
完整代码:
另一种打印位图的方法是:drawBitmapP()函数
函数语法:
例子:
完整代码:
第五部分,获取内容信息
首先是获取屏幕的宽和高。
函数语法:
LCD12864的高度64,宽度是128
例子:
返回:w=128, h=64
然后是获得所显示字符串的宽度
函数语法:
例子:
w=54
第六部分,设置字体,位置等
首先是设置字体
函数语法:
有关u8glib提供的字体样式,请移步至 点我 (可能需要翻墙)
因为之前已经使用过此函数,此处就不做过多描述,
例子:
然后是设置print()函数的显示位置。
函数语法:
因为之前已经使用过此函数,此处就不做过多描述,
例子:
然后是设置是否显示对象,透明还是不透明。对于单色OLED来说,此函数就是设置对象是否为透明。对于有灰度值的屏幕来说则是一个设置灰度值。
函数语法:
例子:
然后是将显示结果旋转90°,180°或者270°
函数语法:
例子:
最后一个是修改显示字符的坐标标准。默认标准是字符的左下角坐标,可以通过函数setFontPosTop()函数来修改为字符的左上角坐标。
函数语法:
例子:
继续上一次的u8glib自学笔记,整理过了有关打印几何图像的函数,下一步就是学习一下如何打印字符。
首先是画出字符。
函数语法:
[C]
纯文本查看
复制代码
1
2
3
4
5
6
7
|
u8g_uint_t U8GLIB::drawStr(u8g_uint_t x, u8g_uint_t y,
const
char
*s)
//参数为:(x:字符左下角的横坐标 y:字符左下角的纵坐标 s:要画出的字符)
//注意:使用drawStr函数之前,需要使用setFont函数来设置一下要画出的字符的显示字体。
//同时drawStr函数还有三种变形:
drawStr90();
//字符顺时针旋转响应90°
drawStr180();
//字符顺时针旋转响应180°
drawStr270();
//字符顺时针旋转响应270°
|
例子:
[C]
纯文本查看
复制代码
1
2
|
u8g.setFont(u8g_font_osb18);
//设置字体
u8g.drawStr(0, 20,
"ABC"
);
//画出字符在(0,20)的位置
|
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.setFont(u8g_font_osb18);
u8g.drawStr(0, 20,
"ABC"
);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
另一种打印字符,字符串的方法就是用print。
print()函数可以打印字符,字符串,变量值等。但是用以前需要用setPrintPos()来设置位置
函数语法:
[C]
纯文本查看
复制代码
1
2
|
U8GLIB::print(...)
//参数为要打印的内容
|
例子:
[C]
纯文本查看
复制代码
1
2
|
u8g.setPrintPos(0,15);
//设置位置
u8g.print(
"Error Code: "
);
//打印内容
|
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
void
draw(){
u8g.setPrintPos(0,15);
u8g.print(
"Error Code: "
);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
第四部分,画出图像
首先是显示一个位图。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawXBMP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t w, u8g_uint_t h,
const
u8g_pgm_uint8_t *bitmap)
//参数为:(x:位图左上角的横坐标 y:位图左上角的纵坐标 w:位图的宽 h:位图的高 *bitmap:位图对象)
|
例子:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
|
static
unsigned
char
u8g_logo_bits[] U8G_PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0xe0, 0xff, 0xff, 0x3f,
0xe3, 0xe1, 0xff, 0xff, 0x3f, 0xf3, 0xf1, 0xff, 0xff, 0x3f, 0xf3, 0xf1, 0xfe, 0xbf, 0x37,
0xf3, 0x11, 0x1c, 0x1f, 0x30, 0xf3, 0x01, 0x08, 0x8c, 0x20, 0xf3, 0x01, 0x00, 0xc0, 0x39,
0xf3, 0x81, 0xc7, 0xc1, 0x39, 0xf3, 0xc1, 0xc7, 0xc9, 0x38, 0xf3, 0xc1, 0xc3, 0x19, 0x3c,
0xe3, 0x89, 0x01, 0x98, 0x3f, 0xc7, 0x18, 0x00, 0x08, 0x3e, 0x0f, 0x3c, 0x70, 0x1c, 0x30,
0x3f, 0xff, 0xfc, 0x87, 0x31, 0xff, 0xff, 0xbf, 0xc7, 0x23, 0x01, 0x00, 0x00, 0xc6, 0x23,
0x03, 0x00, 0x00, 0x0e, 0x30, 0xff, 0xff, 0x3f, 0x1f, 0x3c, 0xff, 0xff, 0x3f, 0xff, 0x3f,
0xff, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f
};
u8g.drawXBMP( 0, 0, 38, 24, u8g_logo_bits);
|
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
static
unsigned
char
u8g_logo_bits[] U8G_PROGMEM = {
0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0xe0, 0xff, 0xff, 0x3f,
0xe3, 0xe1, 0xff, 0xff, 0x3f, 0xf3, 0xf1, 0xff, 0xff, 0x3f, 0xf3, 0xf1, 0xfe, 0xbf, 0x37,
0xf3, 0x11, 0x1c, 0x1f, 0x30, 0xf3, 0x01, 0x08, 0x8c, 0x20, 0xf3, 0x01, 0x00, 0xc0, 0x39,
0xf3, 0x81, 0xc7, 0xc1, 0x39, 0xf3, 0xc1, 0xc7, 0xc9, 0x38, 0xf3, 0xc1, 0xc3, 0x19, 0x3c,
0xe3, 0x89, 0x01, 0x98, 0x3f, 0xc7, 0x18, 0x00, 0x08, 0x3e, 0x0f, 0x3c, 0x70, 0x1c, 0x30,
0x3f, 0xff, 0xfc, 0x87, 0x31, 0xff, 0xff, 0xbf, 0xc7, 0x23, 0x01, 0x00, 0x00, 0xc6, 0x23,
0x03, 0x00, 0x00, 0x0e, 0x30, 0xff, 0xff, 0x3f, 0x1f, 0x3c, 0xff, 0xff, 0x3f, 0xff, 0x3f,
0xff, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x3f
};
void
draw(){
u8g.drawXBMP( 0, 0, 38, 24, u8g_logo_bits);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
另一种打印位图的方法是:drawBitmapP()函数
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::drawBitmapP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h,
const
u8g_pgm_uint8_t *bitmap)
//参数为:(x:位图左上角的横坐标 y:位图左上角的纵坐标 cnt:在水平方向上位图的字节数 h:位图的高 *bitmap:位图对象),所以位图的宽,就是(cnt * 8),1字节=8位。
|
例子:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
|
const
uint8_t rook_bitmap[] U8G_PROGMEM = {
0x00,
// 00000000
0x55,
// 01010101
0x7f,
// 01111111
0x3e,
// 00111110
0x3e,
// 00111110
0x3e,
// 00111110
0x3e,
// 00111110
0x7f
// 01111111
};
u8g.drawBitmapP(0,0, 1, 8, rook_bitmap);
|
完整代码:
[C]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
//调用u8glib库
#include "U8glib.h"
//创建一个LCD对象
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);
const
uint8_t rook_bitmap[] U8G_PROGMEM = {
0x00,
// 00000000
0x55,
// 01010101
0x7f,
// 01111111
0x3e,
// 00111110
0x3e,
// 00111110
0x3e,
// 00111110
0x3e,
// 00111110
0x7f
// 01111111
};
void
draw(){
u8g.drawBitmapP(0,0, 1, 8, rook_bitmap);
}
void
setup() {
// put your setup code here, to run once:
//旋转屏幕180°
u8g.setRot180();
// rotate screen
}
void
loop() {
// put your main code here, to run repeatedly:
u8g.firstPage();
do
{
draw();
}
while
(u8g.nextPage());
}
|
第五部分,获取内容信息
首先是获取屏幕的宽和高。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
u8g_uint_t U8GLIB::getHeight(
void
)
//返回屏幕的高度
u8g_uint_t U8GLIB::getWidth(
void
)
//返回屏幕的宽度
|
LCD12864的高度64,宽度是128
例子:
[C]
纯文本查看
复制代码
1
2
3
4
|
int
w;
int
h;
w = u8g.getWidth();
h = u8g.getHeight();
|
返回:w=128, h=64
然后是获得所显示字符串的宽度
函数语法:
[C]
纯文本查看
复制代码
1
2
|
u8g_uint_t U8GLIB::getStrWidth(
const
char
*s)
//参数是:(*s: 字符串的内容)
|
例子:
[C]
纯文本查看
复制代码
1
2
3
4
5
6
|
int
w;
u8g.setFont(u8g_font_osb18);
//设置字体
u8g.drawStr(0,20,
"ABC"
);
w = u8g.getStrWidth(
"ABC"
);
//获得显示的字符串宽度
u8g.drawFrame(0,10, w,11);
//画一个以获得的字符串宽度为宽度的方框
|
w=54
第六部分,设置字体,位置等
首先是设置字体
函数语法:
[C]
纯文本查看
复制代码
1
2
|
U8GLIB::setFont(
const
u8g_fntpgm_uint8_t *font)
//参数为:(*font: 要显示字符的字体)
|
有关u8glib提供的字体样式,请移步至 点我 (可能需要翻墙)
因为之前已经使用过此函数,此处就不做过多描述,
例子:
[C]
纯文本查看
复制代码
1
|
u8g.setFont(u8g_font_osb18);
|
然后是设置print()函数的显示位置。
函数语法:
[C]
纯文本查看
复制代码
1
2
|
void
U8GLIB::setPrintPos(u8g_uint_t x, u8g_uint_t y)
//参数为:(x:显示内容的横坐标 y:显示内容的纵坐标)
|
因为之前已经使用过此函数,此处就不做过多描述,
例子:
[C]
纯文本查看
复制代码
1
|
u8g.setPrintPos(10,20);
|
然后是设置是否显示对象,透明还是不透明。对于单色OLED来说,此函数就是设置对象是否为透明。对于有灰度值的屏幕来说则是一个设置灰度值。
函数语法:
[C]
纯文本查看
复制代码
1
2
3
4
|
void
U8GLIB::setColorIndex(uint8_t color_index)
//参数为:(color_index:0和1)
//0为不显示,透明
//1为显示,不透明
|
例子:
[C]
纯文本查看
复制代码
1
2
3
4
|
u8g.setColorIndex(1);
//不透明,显示内容
u8g.drawBox(10, 12, 20, 30);
u8g.setColorIndex(0);
//透明,不显示内容
u8g.drawPixel(28, 14);
|
然后是将显示结果旋转90°,180°或者270°
函数语法:
[C]
纯文本查看
复制代码
1
2
3
|
void
U8GLIB::setRot90()
void
U8GLIB::setRot180()
void
U8GLIB::setRot270()
|
例子:
[C]
纯文本查看
复制代码
1
2
3
4
5
6
7
8
|
//正常显示
u8g.setFont(u8g_font_osb18);
u8g.drawStr(0,20,
"ABC"
);
//旋转显示
u8g.setRot90();
//旋转90°
u8g.setFont(u8g_font_osb18);
u8g.drawStr(0,20,
"ABC"
);
|
最后一个是修改显示字符的坐标标准。默认标准是字符的左下角坐标,可以通过函数setFontPosTop()函数来修改为字符的左上角坐标。
函数语法:
[C]
纯文本查看
复制代码
1
|
void
U8GLIB::setFontPosTop(
void
)
|
例子:
[C]
纯文本查看
复制代码
1
2
3
|
u8g.setFont(u8g_font_osb18);
u8g.setFontPosTop();
u8g.drawStr(0, 20,
"ABC"
);
|