OLED12864

前言:

昨天晚上,我们组团购的龙丘OLED12864终于到了,我怀着激动的心情拿着比想象中要小的显示屏,真想一下子就把他点亮。

遗憾的是,买来时没有数据手册,手头上没有写好的程序,自己对它的操作也完全一头雾水。

各种百度无果后,登录论坛去淘资料,经过层层筛选,终于得到了一个比较好的资料。在此向智能车论坛的这位楼主致谢!

看了一遍后,还是一头雾水,果断回去睡觉。

第二天,已经有小伙伴点亮了他们的OLED,我却看着手册,根据上面的理论,开始写自己的代码。

我实在不愿做代码的搬运工,不愿去照搬别人写好的代码,那样虽然见效快,却没有太大意义,明白原理后自己写出来才是真正的学习。

中午前写了初始化和基本的显示,自觉可以测验了,结果却还是一片黑暗,然后就去吃饭吧。

吃饭回来后,我决定对比着网上已有的例程去稍作更改自己不好的地方,就是这个过程中,我发现了我写的一个致命的错误!把时钟错当为了复位!!!

而在程序中,复位是绝对关键的部分。

下面开始具体分析过程:

看到大多程序初始化全是”惊人“一致地有好多语句,其实好多语句是没有多大用处的,因为好多语句是在默认情况下就已成立的,直接复位采取默认就好了。

复位操作:

当 RES 输入低电平时,芯片将执行以下的初始化步骤:
1、关闭显示
2、128*64 显示模式
3、正常列地址以及行地址映射(SEG0 映射至列地址 00H,COM0 映射至行地址 00H)
4、串行移位寄存器数据清零
5、将 RAM 存储区的 0 地址设为显示的起始行
6、列地址计数器设为 0
7、设置行正常扫描方向
8、对比度寄存器设置为 0x7F

9、正常显示模式

由于在上电后 RES 低电平使芯片内部相关寄存器已经复位,所以只需要设置电荷泵和 开启显示就可以了

软件初始化步骤:

1、设置 RES 低电平,延时一段时间。经过测试这个只要很短时间即可。

2、设置 RES 高电平,正常操作芯片时 RES 需要保持高电平。

3、设置段地址重映射 0xA0/0xA1。如果图像反了修改此命令即可。

4、设置行扫描方向 0xC0/0xC8。行输出反了修改此处命令。

5、允许电荷泵 0x8D,0x14。(这个是手册上说明的,没弄懂什么意思。)

6、开启显示 0xAF。

经过以上步骤就可以对显示屏 RAM 区写入数据操作了,其他的保持默认配置即可

写指令与写数据:

串行数据 SDIN(D1)接口的数据在时钟信号 SCLK(D0)的每个上升沿移位到内部寄存器,8 位数据以 D7,D6...D0 高位在前低位在后的顺序转移。
  数据/命令 DC 在每第 8 个时钟周期 采样判断输入的是数据还是命令。在串行总线模式下,只允许对芯片进行写操作。

为LED写指令

**八位指令,从高到低逐字节写入**
    1.选择写指令 DC=0
    2.时钟拉低 SCLK=0
    3.循环右移写入各个字节

注意写字节后拉高时钟,稍微延时后拉低,这是因为数据在时钟信号 SCLK 的每个上升沿移位到内部寄存器

为LED写数据:

选择写数据 DC=1  其他同写指令

简易代码参考:

/********************************
*     XS128OLED12864
*     by Quex
*     2014/7/10
********************************/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */#define LED_SCL PTT_PTT0 // 时钟定义
#define LED_SDA PTT_PTT1  //数据口D1
#define LED_RST PTT_PTT2 //复位低能电平
#define LED_DC  PTT_PTT3 //偏置常低
#define WIDTH 128
#define HEIGHT 64//写指令:
void Write_Cmd(byte cmd){uchar cycle;  //循环量LED_DC=0;     //写命令LED_SCL=0;    //拉低时钟for(cycle=0;cycle<8;cycle++){if(cmd&0x80)LED_SDA=1;elseLED_SDA=0;// asm("nop"); LED_SCL=1;asm("nop");asm("nop");LED_SCL=0;cmd<<=1;}
}//写数据
void Write_Data(byte data){uchar cycle;  //循环量LED_DC=1;     //写命令LED_SCL=0;    //拉低时钟for(cycle=0;cycle<8;cycle++){if(data&0x80)LED_SDA=1;elseLED_SDA=0;// asm("nop");LED_SCL=1;asm("nop");asm("nop");LED_SCL=0;data<<=1;}
}//初始化
void OLED_Init(){DDRT=0xff;  //T口作为输出LED_SCL=1;LED_RST=0;asm("nop");asm("nop");LED_RST=1;Write_Cmd(0xa0); //写命令Write_Cmd(0xc0);//写命令Write_Cmd(0x8d); //写命令Write_Cmd(0x14);Write_Cmd(0xaf); //开显示
}//填充数据
void OLED_Fill(byte data)
{byte y,x;for(y=0;y<8;y++){Write_Cmd(0xb0+y);//设置页地址Write_Cmd(0x01); //设置列低四位Write_Cmd(0x10); //设置列高四位for(x=0;x<WIDTH;x++)Write_Data(data);}
}//毫秒级延时
void Delay_ms(int ms)
{int i,j;if (ms<1) ms=1;for(i=0;i<ms;i++)for(j=0;j<1335;j++);  //16MHz--1ms
}void main(void) {OLED_Init();
//  EnableInterrupts;for(;;) {OLED_Fill(0xf0);Delay_ms(1000); OLED_Fill(0x01);Delay_ms(1000);_FEED_COP(); }
}

效果是这样子的:

先这样,其他的还有待研究,替我加油吧,我会尽快更新剩下内容。



xs128之OLED12864相关推荐

  1. 让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义

    好吧,不得不承认,我使用飞思卡尔的XS128单片机已经非常之习惯了,结果一上手atmega8,最令我反感的就是atmega8不能对IO引脚进行操作,非要用些繁琐的位操作.我就不,我就要像飞思卡尔那样操 ...

  2. xs128 双定时器PIT0和PIT1

    /***************************************************************** ** 函数说明:xs128 双定时器PIT0和PIT1 ** 版 ...

  3. 树莓派之OLED12864视频播放—BadApple

    代码地址如下: http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树 ...

  4. 【XS128】Link error L1822 symbol _FADD / _FSUB/ _FDIV/ _FMUL.....错误解决的方法

    转载请注明出处 因为阅历有限,篇幅不周之处还望指出,谢谢 假设方法确实奏效,请一定回复点赞哦,给后来人也是一种帮助,谢谢! 这是飞思卡尔 XS128平台比較常见的LINK错误. 可是要解决起来也比較头 ...

  5. 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库

    [Proteus仿真]Arduino UNO+OLED12864 I2C接口跑图形库 Proteus仿真 基于VSM Studio代码 主程序代码 /************************* ...

  6. 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍

    0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍 图为中景园的0.96寸ssd1306屏幕,适合于PCB一体化设计.如果想分开,可以直接购买带焊接好转接的OLED屏幕. ...

  7. OLED12864播放视频

    OLED12864播放视频 最近看了B站up@会飞的阿卡林做的一个主板小屏幕,可以在一块0.96寸的12864上播放视频,觉得十分不错,up还附上了上位机软件和NodeMCU单片机的代码.不过上位机代 ...

  8. SD卡驱动(基于XS128)

    之前一直在做SD卡,一开始是基于8366的,但后面为了给同学方便,直接做成XS的了.现在可以进行SD卡的读写,TXT的创建与BMP的创建. 下面是SD卡的驱动程序(基于XS128). #include ...

  9. xs128 D-Flash读写

    #include "includes.h" uint16 Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据 uin ...

最新文章

  1. Silverlight Analytics Framework(开源分析框架)
  2. Jquery元素判断是否存在
  3. python和java哪个好学、零基础-老男孩零基础学习|python和java那个更有发展前景?...
  4. CSS display: table-cell 用于水平垂直居中
  5. 经典卷积神经网络--LeNet-5的详解
  6. 2012服务器文件加密,Windows Server 2012安全方面的改变_服务器评测与技术-中关村在线...
  7. 编写你自己的单点登录(SSO)服务(转)
  8. C#10在List, Queue 以及Stack中使用EnsureCapacity方法来提升性能
  9. steelray project viewer
  10. 团队冲刺第二阶段-9
  11. 被骂垃圾货,却卖出8000万副,干翻国外大牌!这个产品杀手凭什么?
  12. 对于HTTP过程中POST内容加密的解决方案
  13. android中handler简单用法
  14. 华为USG防火墙配置
  15. react入门教程案例井字棋(包含改进代码)
  16. 在Arcscene绘制管线三维横断面(AE绘制三维点阵文字)
  17. google 文档翻译 html,快速将整篇中文文档翻译成全英文(史上最全总结)
  18. java 向word插入图片 调整图片位置
  19. Axure第一周学习日志
  20. 力扣(202.454)补9.18

热门文章

  1. android 仿微信通知栏
  2. hdu 6289 寻宝游戏
  3. Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`
  4. Linux 下C/C++实现发送ICMP和ICMPv6(报文分析)
  5. 图像处理学习笔记-05-图像复原与重建1
  6. 智能消息服务-数字短信使用FAQ简介: 数字短信是基于普通短信,通过一套编码技术实现的短信服务。它能把视频、音频、网页、GIF图、文字等多种表现形式通过多媒体短信形式触达用户。本文将带你了解阿里云通信
  7. 离线数仓-01-项目介绍和用户行为数据采集
  8. Maven——简介、下载安装与配置
  9. 计算机类SCI杂志排名
  10. 高效开发:你的项目有接口聚合服务吗?