TA的每日心情 | 开心 2017-6-17 09:42 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
|
本帖最后由 沙漠之风 于 2016-2-23 15:23 编辑
今天和大家分享下基于小红板(GD32F207)送餐机器人的液晶显示部分,该部分中我将用到硬件SPI来驱动OLED。
一、OLED
OLED,既有机发光二极管(Organic Light-Emitting Diode),有称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于绕曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴技术应用技术。
LCD都需要背光源,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还很难以大型化,但是分辨率确可以做到很高。我这次选用的OLED显示模块有以下特点:
1、模块有单色和双色两种可选,单色威威纯蓝色,而双色则为黄蓝双色。
2、尺寸小,显示尺寸为0.96寸,而模块的尺寸仅为27mm*26mm大小。
3、高分辨率,该模块的分辨率为128*64。
4、 多种接口方式,该模块提供了总共5种接口包括:6800、8080两种并行接口方式、3线或4线的串行SPI接口方式、IIC接口方式(只需要2跟线就可以控制OLED了!)。
5、不需要高压,直接接3.3V 就可以工作了。
这里要提醒大家的是,该模块不和5.0V接口兼容,所以请大家在使用的时候一定要小心,别直接接到5V的系统上面去,否则可能烧坏模块。以上5种模式通过模块的BS0~2设置,BS0~2的设置与模块接口模式的关系表如下
二、OLED四线串行(SPI)方式
CS:OLED片选信号
RST(RES):硬复位OLED
DC:命令/数据标志(0,读写命令;1,读写数据)。
SCLK:串行时钟线。在4线串行模式下,D0信号线作为串行时钟线SCLK.
SDIN: 串行数据线。在4线串行模式下,D1信号线作为串行数据线SDIN。
模块的D2需要悬空,其他引脚可以接到GND。在4线串行模式下,只能往模块写数据而不能读数据。
在4线SPI模式下,每个数据长度均为8位,在SCLK的上升沿,数据从SDIN移入到SSD1306,并且是高位在前的。DC线还是用作命令/数据的标志线。在4线SPI模式下,写操作的时序下图。
三、代码部分
1、 主程序部分我们初始了系统时钟,初始化了串口,LCD,然后在屏幕上显示四行文字。- int main(void)
- {
- SysTick_Configuration();
- USART1_GIPIO_CONFIG(115200);
- LCD_Init();
- fd4[0]=electrect_V;
- while (1)
- {
- LCD_CLS();
- LCD_P16x16Ch(4,0,7,fd1); //
- LCD_P8x16Str(8,2,"shamozhihuong");
- LCD_P16x16Ch(12,4,4,fd2);
- itoa(electrect_V, dis_STR1, 10);//此处将数值转换成字符串
- LCD_P8x16Str(78,4,dis_STR1);
- LCD_P8x16Str(96,4,"V");
- LCD_P6x8Str(12,7,"407550350@QQ.COM");
- Delay_1ms(3000); //延时
- }
- }
复制代码 2、LCD初始程序- /*********************12864初始化***********************/
- void LCD_Init(void)
- {
- OLEO_Int();
- OLED_RST_L;
- Delay_1ms(1000);
- OLED_RST_H;
- //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕
- LCD_WrCmd(0xae);//--turn off oled panel
- LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
- LCD_WrCmd(0x3f);//--1/64 duty
- LCD_WrCmd(0xd3);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
- LCD_WrCmd(0x00);//-not offset
- LCD_WrCmd(0x40);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
- //LCD_WrCmd(0xa0);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
- //LCD_WrCmd(0xc0);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
- LCD_WrCmd(0xa1);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常
- LCD_WrCmd(0xc8);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常
- LCD_WrCmd(0xda);//--set com pins hardware configuration
- LCD_WrCmd(0x12);
- LCD_WrCmd(0x81);//--set contrast control register
- LCD_WrCmd(0xcf); // Set SEG Output Current Brightness
- LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
- LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
- LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
- LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
- LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
- LCD_WrCmd(0x14);//--set(0x10) disable
- LCD_WrCmd(0xaf);//--turn on oled panel
- LCD_WrCmd(0xd9);//--set pre-charge period
- LCD_WrCmd(0xf8);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
- LCD_WrCmd(0xdb);//--set vcomh
- LCD_WrCmd(0x40);//Set VCOM Deselect Level
- }
复制代码 3、主意部分(整形数据转换成字符串数据)- /******************************************************
- 整形数据转字符串函数
- char *itoa(int value, char *string, int radix)
- radix=10 标示是10进制 非十进制,转换结果为0;
- 例:d=-379;
- 执行 itoa(d, buf, 10); 后
-
- buf="-379"
- **********************************************************/
- char *itoa(int value, char *string, int radix)
- {
- int i, d;
- int flag = 0;
- char *ptr = string;
- /* This implementation only works for decimal numbers. */
- if (radix != 10)
- {
- *ptr = 0;
- return string;
- }
- if (!value)
- {
- *ptr++ = 0x30;
- *ptr = 0;
- return string;
- }
- /* if this is a negative value insert the minus sign. */
- if (value < 0)
- {
- *ptr++ = '-';
- /* Make the value positive. */
- value *= -1;
- }
- for (i = 10000; i > 0; i /= 10)
- {
- d = value / i;
- if (d || flag)
- {
- *ptr++ = (char)(d + 0x30);
- value -= (d * i);
- flag = 1;
- }
- }
- /* Null terminate the string. */
- *ptr = 0;
- return string;
- } /* NCL_Itoa */
复制代码 四、试验验证
五、源代码
OLED液晶显示.zip
(59.05 KB, 下载次数: 10)
|
|