xs128之OLED12864
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相关推荐
- 让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义
好吧,不得不承认,我使用飞思卡尔的XS128单片机已经非常之习惯了,结果一上手atmega8,最令我反感的就是atmega8不能对IO引脚进行操作,非要用些繁琐的位操作.我就不,我就要像飞思卡尔那样操 ...
- xs128 双定时器PIT0和PIT1
/***************************************************************** ** 函数说明:xs128 双定时器PIT0和PIT1 ** 版 ...
- 树莓派之OLED12864视频播放—BadApple
代码地址如下: http://www.demodashi.com/demo/13218.html 概述 本篇教程讲述了使用树莓派驱动OLED12864液晶屏,并在液晶屏上播放动画和视频. 硬件平台 树 ...
- 【XS128】Link error L1822 symbol _FADD / _FSUB/ _FDIV/ _FMUL.....错误解决的方法
转载请注明出处 因为阅历有限,篇幅不周之处还望指出,谢谢 假设方法确实奏效,请一定回复点赞哦,给后来人也是一种帮助,谢谢! 这是飞思卡尔 XS128平台比較常见的LINK错误. 可是要解决起来也比較头 ...
- 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库
[Proteus仿真]Arduino UNO+OLED12864 I2C接口跑图形库 Proteus仿真 基于VSM Studio代码 主程序代码 /************************* ...
- 0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍
0.96寸IIC接口ssd1306和ssd1315驱动oled12864屏幕介绍 图为中景园的0.96寸ssd1306屏幕,适合于PCB一体化设计.如果想分开,可以直接购买带焊接好转接的OLED屏幕. ...
- OLED12864播放视频
OLED12864播放视频 最近看了B站up@会飞的阿卡林做的一个主板小屏幕,可以在一块0.96寸的12864上播放视频,觉得十分不错,up还附上了上位机软件和NodeMCU单片机的代码.不过上位机代 ...
- SD卡驱动(基于XS128)
之前一直在做SD卡,一开始是基于8366的,但后面为了给同学方便,直接做成XS的了.现在可以进行SD卡的读写,TXT的创建与BMP的创建. 下面是SD卡的驱动程序(基于XS128). #include ...
- xs128 D-Flash读写
#include "includes.h" uint16 Buffer[]={0x1111,0x2222,0x3333,0x4444};//数据缓存区,只能一次写入四个数据 uin ...
最新文章
- Silverlight Analytics Framework(开源分析框架)
- Jquery元素判断是否存在
- python和java哪个好学、零基础-老男孩零基础学习|python和java那个更有发展前景?...
- CSS display: table-cell 用于水平垂直居中
- 经典卷积神经网络--LeNet-5的详解
- 2012服务器文件加密,Windows Server 2012安全方面的改变_服务器评测与技术-中关村在线...
- 编写你自己的单点登录(SSO)服务(转)
- C#10在List, Queue 以及Stack中使用EnsureCapacity方法来提升性能
- steelray project viewer
- 团队冲刺第二阶段-9
- 被骂垃圾货,却卖出8000万副,干翻国外大牌!这个产品杀手凭什么?
- 对于HTTP过程中POST内容加密的解决方案
- android中handler简单用法
- 华为USG防火墙配置
- react入门教程案例井字棋(包含改进代码)
- 在Arcscene绘制管线三维横断面(AE绘制三维点阵文字)
- google 文档翻译 html,快速将整篇中文文档翻译成全英文(史上最全总结)
- java 向word插入图片 调整图片位置
- Axure第一周学习日志
- 力扣(202.454)补9.18
热门文章
- android 仿微信通知栏
- hdu 6289 寻宝游戏
- Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`
- Linux 下C/C++实现发送ICMP和ICMPv6(报文分析)
- 图像处理学习笔记-05-图像复原与重建1
- 智能消息服务-数字短信使用FAQ简介: 数字短信是基于普通短信,通过一套编码技术实现的短信服务。它能把视频、音频、网页、GIF图、文字等多种表现形式通过多媒体短信形式触达用户。本文将带你了解阿里云通信
- 离线数仓-01-项目介绍和用户行为数据采集
- Maven——简介、下载安装与配置
- 计算机类SCI杂志排名
- 高效开发:你的项目有接口聚合服务吗?