Nokia5110液晶屏完全新手学习笔记(二)
2011-11-17 15:51
281 查看
四、时序图
没错,要向液晶屏写入数据,我们需要通过模拟一个串行总线协议来写入数据。
先来看看传送一个字节(指令)的时序图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/58345d32697e2c15c2043c976e11ca1a.png)
如果能看懂时这些序图的兄弟,就不要听我废话啦。请飘过~~
从时序图1看出:
1. SCE片选为0时开始发送数据。
2. 时钟信号SCLK仅在SCE片选为0时有效。
3. SDIN数据输入,需要在时钟信号SCLK有效时开始发送数据,且在SCLK的正边缘取样, 注意,数据是从高位开始发送的。
知道了传送数据的时序,我们需要使用程序来模拟这个时序,从而发送指令控制液晶屏。
接下来,看看实例。
五、程序实例
代码一:
代码分析:
这个是一个写入一个字节数据的模拟时序函数,具有两个参数,dt为要写入的字节,command为数据/命令选择。
首先,需要sce拉低电平,开始发送数据。
i循环8次,写入8位数据,现以“设置扩展指令集”(即写入0x21)全过程如下:
i = 0:dt = 0x21 = 0010 0001 b
dt & 0x80:
0010 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB7),
dt左移1位,dt<<1 = 0100 0010 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 1: dt = 0100 0010b
dt & 0x80:
0100 0010
1000 0000 &
0000 0000 = 0, 则sdin = 0 (DB6),
dt左移1位,dt<<1 = 1000 0100 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 2: dt = 1000 0100b
dt & 0x80:
1000 0100
1000 0000 &
1000 0000 != 0,则sdin = 1 (DB5),
dt左移1位,dt<<1 = 0000 1000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 3:dt = 0000 1000b
dt & 0x80:
0000 1000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB4),
dt左移1位,dt<<1 = 0001 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 4:dt = 0001 0000b
dt & 0x80:
0001 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB3),
dt左移1位,dt<<1 = 0010 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 5:dt = 0010 0000b
dt & 0x80:
0010 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB2),
dt左移1位,dt<<1 = 0100 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 6:dt = 0100 0000b
dt & 0x80:
0100 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB1),
dt左移1位,dt<<1 = 1000 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 7:dt = 1000 0000b
dt & 0x80:
1000 0000
1000 0000 &
1000 0000 != 0,则sdin = 1 (DB0),
dt左移1位,dt<<1 = 0000 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
过程很罗嗦,不过很简单,呵呵~~
可见,这样循环8次,写入了8位数,DB7~DB0 = 0010 0001b = 0x20,正是“扩展指令集”的指令值。
代码二:
代码分析:
初始化步骤可以参照芯片手册中的编程示例:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/4786e49b1a19a5c77c90b2a9334753f8.png)
代码三:
代码分析:
我们可以使用字模软件,求出一个6*8大小的字符“A”,该组值为:
unsigned char A[6] = {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C};
这些很容易理解,还原看一下:
![](http://my.oschina.net/uploads/space/2010/1122/072632_IGQG_105484.png)
上面的矩阵,就是一个字母"A",可见只要把这组值写入即可以显示“A”。
最后,到这里,我们已经学会了Nokia 5110液晶屏的原理和基本控制。是不是觉得很简单。呵呵~~~希望帮到大家,写得不好,请见谅,写的不对,望指正!
小Jay累了。
没错,要向液晶屏写入数据,我们需要通过模拟一个串行总线协议来写入数据。
先来看看传送一个字节(指令)的时序图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/58345d32697e2c15c2043c976e11ca1a.png)
如果能看懂时这些序图的兄弟,就不要听我废话啦。请飘过~~
从时序图1看出:
1. SCE片选为0时开始发送数据。
2. 时钟信号SCLK仅在SCE片选为0时有效。
3. SDIN数据输入,需要在时钟信号SCLK有效时开始发送数据,且在SCLK的正边缘取样, 注意,数据是从高位开始发送的。
知道了传送数据的时序,我们需要使用程序来模拟这个时序,从而发送指令控制液晶屏。
接下来,看看实例。
五、程序实例
代码一:
/*-------------------------------------------- LCD_write_byte: 使用SPI接口写数据到LCD 输入参数:dt:写入的数据; command :写数据/命令选择; 编写日期:20080918 ----------------------------------------------*/ void LCD_write_byte(unsigned char dt, unsigned char command) { unsigned char i; sce=0; dc=command; for(i=0;i<8;i++) { if(dt&0x80) sdin=1; else sdin=0; dt=dt<<1; sclk=0; sclk=1; } dc=1; sce=1; sdin=1; }
代码分析:
这个是一个写入一个字节数据的模拟时序函数,具有两个参数,dt为要写入的字节,command为数据/命令选择。
首先,需要sce拉低电平,开始发送数据。
i循环8次,写入8位数据,现以“设置扩展指令集”(即写入0x21)全过程如下:
i = 0:dt = 0x21 = 0010 0001 b
dt & 0x80:
0010 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB7),
dt左移1位,dt<<1 = 0100 0010 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 1: dt = 0100 0010b
dt & 0x80:
0100 0010
1000 0000 &
0000 0000 = 0, 则sdin = 0 (DB6),
dt左移1位,dt<<1 = 1000 0100 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 2: dt = 1000 0100b
dt & 0x80:
1000 0100
1000 0000 &
1000 0000 != 0,则sdin = 1 (DB5),
dt左移1位,dt<<1 = 0000 1000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 3:dt = 0000 1000b
dt & 0x80:
0000 1000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB4),
dt左移1位,dt<<1 = 0001 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 4:dt = 0001 0000b
dt & 0x80:
0001 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB3),
dt左移1位,dt<<1 = 0010 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 5:dt = 0010 0000b
dt & 0x80:
0010 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB2),
dt左移1位,dt<<1 = 0100 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 6:dt = 0100 0000b
dt & 0x80:
0100 0000
1000 0000 &
0000 0000 = 0,则sdin = 0 (DB1),
dt左移1位,dt<<1 = 1000 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
i = 7:dt = 1000 0000b
dt & 0x80:
1000 0000
1000 0000 &
1000 0000 != 0,则sdin = 1 (DB0),
dt左移1位,dt<<1 = 0000 0000 b,
模拟时钟信号sclk = 0, sclk = 1,以使采样
过程很罗嗦,不过很简单,呵呵~~
可见,这样循环8次,写入了8位数,DB7~DB0 = 0010 0001b = 0x20,正是“扩展指令集”的指令值。
代码二:
/*-------------------------------------------- LCD_init: 初始化LCD_init 输入参数:无 编写日期:20080918 ----------------------------------------------*/ void LCD_init(void) { res=0; delayms(10); res=1; LCD_write_byte(0x21,0);//1、初始化Lcd,功能设定使用扩充指令 LCD_write_byte(0xd0,0);//2、设定液晶偏置电压 LCD_write_byte(0x20,0);//3、使用基本指令 LCD_write_byte(0x0C,0);//4、设定显示模式,正常显示 }
代码分析:
初始化步骤可以参照芯片手册中的编程示例:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/4786e49b1a19a5c77c90b2a9334753f8.png)
代码三:
/*----------------------------------------------------------------------- LCD_write_char : 显示英文字符 输入参数:c :显示的字符; 编写日期 :2004-8-10 最后修改日期 :2004-8-10 -----------------------------------------------------------------------*/ void LCD_write_char_my(unsigned char *font) { unsigned char i; for (i=0; i<6; i++) LCD_write_byte(font[i], 1); }
代码分析:
我们可以使用字模软件,求出一个6*8大小的字符“A”,该组值为:
unsigned char A[6] = {0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C};
这些很容易理解,还原看一下:
![](http://my.oschina.net/uploads/space/2010/1122/072632_IGQG_105484.png)
上面的矩阵,就是一个字母"A",可见只要把这组值写入即可以显示“A”。
最后,到这里,我们已经学会了Nokia 5110液晶屏的原理和基本控制。是不是觉得很简单。呵呵~~~希望帮到大家,写得不好,请见谅,写的不对,望指正!
小Jay累了。
相关文章推荐
- Nokia5110液晶屏完全新手学习笔记(一)
- Nokia5110液晶屏新手学习笔…
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(三)
- hadoop学习笔记之-hbase完全分布模式安装-5
- 《Excel 2010 SQL完全应用》学习笔记之一:SQL常见函数的使用
- Pomelo 新手学习笔记(一)
- java新手web开发学习笔记--环境的配置
- linux新手学习笔记6
- 【unity学习笔记】【新手】unity的两种旋转命令
- 新手一定要看的学习笔记 -ARM开发
- 《嵌入式linux应用程序开发完全手册》系统时钟和定时器学习笔记
- Cocos2d-x学习笔记(五)—— 常见UI界面(未完全)
- Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
- [Android新手学习笔记27]-Fragment碎片生存周期
- android 新手学习笔记 点击事件
- linux内核完全剖析 学习笔记 打字太累 截图 持续更新
- 【Android开发新手的学习笔记】使用LruCache对ListView进行优化
- C语言学习笔记之基础篇_Format格式完全攻略(格式化字符)
- [Android新手学习笔记01]-如何手动创建Activity
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(二)