目录
注意重点:
一、SDK代码开发部分:
显示所需的字符编码:
1.用于显示8x16的字符函数:
2.绘制图片:
3.清楚给定两个坐标之间的显示:
4.显示16*32的阿拉伯数字字符:
5.显示16*32的整型数字,最大显示到万位:
Debug运行
二、取模显示图片
三、调试效果:
注意重点:
1.我们运行代码,注意,DEBUG配置需勾选烧写FLASH,具体配置参考《03arm开发之 ARM使用AXI_GPIO》
2.重要的几个函数
字符编码oled_code_tab.c
初始化OLED的GPIO函数:GPIO_OLED_INIT()
OLED初始化函数,LCD_init()
显示8x16的字符函数LCD_P8x16Str()
绘制图片Draw_BMP()
清楚给定两个坐标之间的显示:clear_display_area()
显示闪烁的8*16字符串display_blk_str()
显示16*32的阿拉伯数字字符LCD_P16x32
显示16*32的整型数字dis_int16_num()
一、SDK代码开发部分:
根据oled显示代码
显示功能的代码由oled_display.c部分实现
显示三个图像Draw_BMP(0,0,128,8,test_bmp);
sleep(1):延时0.5s;
dis_int16_num(0,0,count);
count++;//显示图像翻动次数
代码提供了三种显示,图片,大数字和字符串
图片:Draw_BMP(0,0,128,8,test_bmp);
大数字:
字符串
显示所需的字符编码:
位于oled_code_tab.c 里面,是一些数组编码。其中F8X16[]是我们的普通小字符号编码:
以及我们自己取模,16*32大小分辨率的数字0-9编码F16X32[]:
上面的字符编码也就是我们显示的基础字符库。我们这里展示的是显示数字和字符。 后面我们在讲解一下如何自己取模,显示简单的图形图片等等。
回到我们oled096_driver.c。这个是我们的驱动代码。首先看一下我们一些宏定义:
XGpio sdaInst;
XGpio sclInst;
XGpio dcInst;
XGpio rstInst;
#define SCL_L XGpio_DiscreteWrite(&sclInst, 1, 0)
#define SCL_H XGpio_DiscreteWrite(&sclInst, 1, 1)
#define SDA_L XGpio_DiscreteWrite(&sdaInst, 1, 0)
#define SDA_H XGpio_DiscreteWrite(&sdaInst, 1, 1)
#define DC_L XGpio_DiscreteWrite(&dcInst, 1, 0)
#define DC_H XGpio_DiscreteWrite(&dcInst, 1, 1)
#define RST_L XGpio_DiscreteWrite(&rstInst, 1, 0)
#define RST_H XGpio_DiscreteWrite(&rstInst, 1, 1)
#define XLevelL 0x00
#define XLevelH 0x10
#define XLevel ((XLevelH&0x0F)*16+XLevelL)
#define Max_Column 128
#define Max_Row 64
#define Brightness 0xCF
#define X_WIDTH 128
#define Y_WIDTH 64
代码中,首先是GPIO初始化的几个引脚结构体,然后是我们操作几个引脚电平高低的函数宏定 义。接着是OLED一些参数,比如level定义,最大行列数,以及宽度,高度等等。可以看出我们OLED 的宽度和高度是128和64.也就是这个分辨率。接着我们讲解一下几个主要的初始化函数。
接着我们看一下初始化OLED的GPIO函数:
void GPIO_OLED_INIT()
{
int status;
status = XGpio_Initialize(&sdaInst, OLED_SDA_DEVICE_ID); // initial KEY
if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&sclInst, OLED_SCL_DEVICE_ID); // initial KEY
if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&dcInst, OLED_DC_DEVICE_ID); // initial KEY
if(status != XST_SUCCESS) return XST_FAILURE;
status = XGpio_Initialize(&rstInst, OLED_RST_DEVICE_ID); // initial KEY
if(status != XST_SUCCESS) return XST_FAILURE;
XGpio_SetDataDirection(&sdaInst, 1, 0); // set output
XGpio_SetDataDirection(&sclInst, 1, 0); // set output
XGpio_SetDataDirection(&dcInst, 1, 0); // set output
XGpio_SetDataDirection(&rstInst, 1, 0); // set output
XGpio_DiscreteWrite(&sdaInst, 1, 0x0);
XGpio_DiscreteWrite(&sclInst, 1, 0x0);
XGpio_DiscreteWrite(&dcInst, 1, 0x0);
XGpio_DiscreteWrite(&rstInst, 1, 0x0);
}
函数中,初始化了几个结构体对应的GPIO引脚,然后设置IO方向输出。最后全部输出设置为 0。关于GPIO的初始化,其设备ID我们在oled096_driver.h中有定义:
这几个ID还可以追溯到我们的xparameters.h头文件中:
我们的OLED初始化函数,LCD_init(),这个函数负责初始化GPIO调用,复位OLED,配 置初始化显示屏基本参数:
void LCD_Init(void)
{
GPIO_OLED_INIT();
SCL_H;
delay_oled(100);
RST_L;
delay_oled(50000);
RST_H; //
delay_oled(100);
LCD_WrCmd(0xae);//--turn off oled panel
LCD_WrCmd(0x00);//---set low column address
LCD_WrCmd(0x10);//---set high column address
LCD_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line
(0x00~0x3F)
LCD_WrCmd(0xB0);//--set contrast control register
LCD_WrCmd(0x81); // Set SEG Output Current Brightness
LCD_WrCmd(0xFF);//--Set SEG/Column Mapping 0xa0鈩呰粖杌婅景锕炩埄?? 0xa1?y3銖�
LCD_WrCmd(0xA1);//Set COM/Row Scan Direction 0xc0璋�???锕炩埄?? 0xc8?y3銖�
LCD_WrCmd(0xa6);//--set normal display
LCD_WrCmd(0xA8);//--set multiplex ratio(1 to 64)
LCD_WrCmd(0x3f);//--1/64 duty 璞�?閭�?128*32 LCD_WrCmd(0x1F);
LCD_WrCmd(0xC8);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
LCD_WrCmd(0xD3);//-not offset
LCD_WrCmd(0x00);//--set display clock divide ratio/oscillator frequency
LCD_WrCmd(0xD5);//--set divide ratio, Set Clock as 100 Frames/Sec
LCD_WrCmd(0x80);//--set pre-charge period
LCD_WrCmd(0xD8);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
LCD_WrCmd(0x05);//--set com pins hardware configuration
LCD_WrCmd(0xD9);
LCD_WrCmd(0xF1);//--set vcomh
LCD_WrCmd(0xDA);//Set VCOM Deselect Level
LCD_WrCmd(0x12);//-Set Page Addressing Mode (0x00/0x01/0x02) 璞�?閭�?128*32
LCD_WrCmd(0x02);*/
LCD_WrCmd(0xDB);//
LCD_WrCmd(0x30);//--set Charge Pump enable/disable
LCD_WrCmd(0x8D);//--set(0x10) disable
LCD_WrCmd(0x14);// Disable Entire Display On (0xa4/0xa5)
LCD_WrCmd(0xaf);//--turn on oled panel
LCD_Fill(0x00); //3?閭�????鑺�
}
以上函数调用之后我们就可以使用显示函数进行显示。 我们显示函数有如下几种,字符显示相关函数,其中x,y为显示起点坐标。x左边1为单位,增量 一个像素;y为8个增量单位,每加1,y增加8。
1.用于显示8x16的字符函数:
void LCD_P8x16Str(unsigned char x, unsigned char y,unsigned char ch[]);
绘制图片,图片x0 y0为起点,x1,y1为终点,bmp为要绘制的指针。大家注意,绘制图片, 坐标之间像素点要和取模的bmp数组对得上。
2.绘制图片:
void Draw_BMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char
y1,const unsigned char bmp[]);
3.清楚给定两个坐标之间的显示:
void clear_display_area(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1);
显示闪烁的8*16字符串,period为周期,此参数越长,闪烁越慢。周期跟物理时间不对应,跟 次函数调用快慢周期数对应:
void display_blk_str(unsigned char x,unsigned char y,unsigned char *data,short period);
4.显示16*32的阿拉伯数字字符:
void LCD_P16x32(unsigned char x, unsigned char y, unsigned char N)
5.显示16*32的整型数字,最大显示到万位:
void dis_int16_num(int x,int y,unsigned int num);
我们配置好DEBUG,勾选烧写FPGA,然后开发板连接JTAG到电脑,通电启动,然后开始 DEBUG运行。可以看到,三种显示轮流切换演示。如何配置DEBUG请参考ARM部分教程《arm开发之 ARM使用AXI_GPIO》。
Debug运行
二、取模显示图片
回到我们的oled096_driver.c ,我们如果要显示图片怎么取模呢?资料中的《01硬件资料目录 下的OLED模块和工具》中,我们给大家网盘例程里面提供类一个取模工具和oled的厂家指南,大家可 以按照文档说明深入了解这个OLED,包括取模。文件名:《中景园电子0.96寸OLED使用文档新手必 看V2.0.pdf》。这里要说明一下,这个取模工具不太好用。打开之后把工具窗口最大化再打开图片。大 家根据刚提到的文档来操作就可以了。
我们提供了几张一张12864单位bmp图,以(12864_demo_picture.Bmp)为例。记 住,只能是单色BMP,尺寸小于等于我们的分辨率的图片才可以使用!!软件配置如下:
配置好后,回到主界面可以点击生成,就可以在下方窗口看到我们生成的数组,我们 复制到自己代码中就可以使用了。
我们代码oled096_driver.c里面函数:
void Draw_BMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,const unsigned char bmp[])
就是我们图片显示的函数,首先是x0 y0 x1 y1,这几个参数是我们图片起始坐标和终点坐标, 一般x以像素为单位,横向有0-128取值范围;y为垂直坐标,只能是以0-8。
三、调试效果:
我们运行代码,注意,DEBUG配置需勾选烧写FLASH,具体配置参考《03arm开发之 ARM使用AXI_GPIO》,这里不再重复。运行后,可以看到oled轮训显示图片,大数字,字符 串等: