Presentation is loading. Please wait.

Presentation is loading. Please wait.

第11章 人机交互接口.

Similar presentations


Presentation on theme: "第11章 人机交互接口."— Presentation transcript:

1 第11章 人机交互接口

2 任课教师:刘忠国 山东大学课程中心网站: 宏晶官方网站: STC单片机编译(汇编)/编程(烧录)/仿真工具说明 书; stc15系列单片机器件手册等 keil μvision软件下载及指导手册(Help→μvision Help) OCMJ4X8C:C系列中文液晶显示模块使用说明书 ST7920:中文图形液晶屏(LCD)的控制器/驱动器

3 第11章 人机交互接口 本章学习目标 掌握键盘接口技术 掌握数码、液晶显示技术
第11章 人机交互接口 本章学习目标 掌握键盘接口技术 掌握数码、液晶显示技术 人机交互接口是指人与计算机之间建立联系、交换 信息的输入/输出设备的接口,设备包括键盘、显示 器、打印机、鼠标器等。 主要介绍键盘输入接口设计、显示原理及接口技术。

4 第11章 人机交互接口 11.1 键盘接口技术 简易键盘接口的实现 矩阵键盘接口的实现 11.2 显示技术 数码LED显示技术 液晶显示技术

5 §11.1 键盘接口技术 非编码键盘和编码键盘 非编码键盘:直接利用口线连接按键开关或开关型 传感器来实现,通过程序判断口线的电平就能够确 定输入的键值。 优缺点:设计简单,使用方便,且因为具有共用端, 容易直接同开关电路或开关型传感器连接。但是这 种方式的口线利用率较低,受单片机口线数量的限 制,其键盘规模无法做大。 IAP15W4K58S4

6 §11.1 键盘接口技术 非编码键盘和编码键盘 编码键盘:将口线与按键开关连接成矩阵电路, 通过软 件扫描, 识别I/O口上的编码, 按编码规则识别输入键值。 优点:口线利用率高,键盘规模可以做得较大。 具体用哪一种形式键盘可根据控制系统规模及用途决定。 IAP15W4K58S4 4输入与门 300Ω×8

7 11.1.1 简易键盘接口的实现 简易键盘接口采用非编码形式, 典型电路如图示。 图11-1 简易键盘接口电路 确定按键用 查询方式
简易键盘接口的实现 简易键盘接口采用非编码形式, 典型电路如图示。 确定按键用 查询方式 或中断方式 IAP15W4K58S4 A 1 B K C D 13 E J F G H 8 Input NAND/AND Gate 下降沿触发 INT0中断 8 输入与非/与门 图11-1 简易键盘接口电路

8 简易键盘接口的实现 键盘在使用中考虑到人员操作或机械特性在接触时 产生的抖动问题,即按键开关在接通或断开瞬间并 非完全可靠接触,而是存在一个抖动期,在此期间 的电平变化波形如图所示。 图11-2 按键闭合时的电平变化波形

9 简易键盘接口的实现 抖动期一般不超过10 ms。在口线电平抖动期间, 单片 机无法准确检测出口线电平的正确值, 必须采取一定 的措施进行鉴别。 常用的方法是延时消抖法, 例如遇到由高向低的电平 转换后先不急于读取口线键值, 而是在中断服务程序 的开始执行一段5~10 ms的延时程序。 若延时程序后再次判断口线仍为低电平则进入口线的 键值读取程序,否则放弃键值读取操作。

10 11.1.1 简易键盘接口的实现 示例代码如下: ORG 0000H LJMP MAIN ORG 0003H ; INT0外部中断0入口地址
简易键盘接口的实现 示例代码如下: ORG 0000H LJMP MAIN ORG 0003H ; INT0外部中断0入口地址 LJMP  KRD ORG 0100H MAIN: MOV SP, #70H SETB IT ; 设置INT0下降沿触发 SETB EX ; 开放INT0中断 SETB EA ; 开放总中断 … ;其他初始化代码 MAINLOOP: ;主循环 LJMP MAINLOOP

11 (弱上拉I/O口输入前先将输出锁存器置1)
简易键盘接口的实现 KRD: LCALL DELAY10 ;调10 ms延时子程序,消除抖动 MOV A,P2 ;读P2口键值 JNB ACC.0, KPR0 ;判断P2.0~P2.7是否有键按下, 按下则转键处理子程 JNB ACC.1, KPR1 JNB ACC.2, KPR2 JNB ACC.3, KPR3 JNB ACC.4, KPR4 JNB ACC.5, KPR5 JNB ACC.6, KPR6 JNB ACC.7, KPR7 RETI (弱上拉I/O口输入前先将输出锁存器置1) 这里P2口输出锁存器复位值即为0FFh IAP15W4K58S4 下降沿触发 INT0中断 KPR0: ;P2.0口线按键0处理程序 MOV A,P ;再读P2口键值 JNB ACC.0, KPR0 ;判P2.0口线电平是否变高 (即按键是否松开) … ;按键0处理程序。由低电平变为高电平认为按键松开 RETI KPR1: … ;P2.1口线按键处理程序 KPR7: … ;P2.7口线按键处理程序 DELAY10:… ;10 ms延时子程序 RET END 按键没松开则继续等待

12 简易键盘接口的实现 KPR0: ;P2.0口线按键处理程序 MOV A,P2 ;读P2口键值 JNB ACC.0, KPR0 ;判P2.0口线电平是否变高(即按键是否松开) … ;按键处理程序。由低电平变为高电平认为按键松开 RETI KPR1: … ;P2.1口线按键处理程序 … KPR7: … ;P2.7口线按键处理程序 DELAY10:… ;10 ms延时子程序 RET END 按键没松开则继续等待

13 简易键盘电路每一按键用一根I/O口线, 口线利用率低。 若将口线按行列排成矩阵形式, 则可在相同口线数量下增大键盘规模。
矩阵键盘接口的实现 1、电路结构及设计思路 简易键盘电路每一按键用一根I/O口线, 口线利用率低。 若将口线按行列排成矩阵形式, 则可在相同口线数量下增大键盘规模。 有键按下时,行列线短路 可将P2口的8根I/O线 排列成4×4矩阵形式, 连接16只按键。 IAP15W4K58S4 为行线 输出 P2.0 P2.3 行线特定的4位数据输 出和列线对应的4位数 据输入可组成一个8位 的特征字, 该特征字即 为键值, 代表了按下的 键所在的位置。 为列线 输入 P2.4 P2.7 300Ω×8 CD4082 双4输入端与门

14 以行线作为扫描输出, 以列线作为接收输入, 依次将各行 线置为低电平, 并在列线上逐次接收数据。
2、键值产生的原理 1)扫描法产生键值 以行线作为扫描输出, 以列线作为接收输入, 依次将各行 线置为低电平, 并在列线上逐次接收数据。 扫描完成后, 若发现接收到的某一列线有低电平, 则表示 该列线与行线连接的按键已经闭合。 在接收到低电平的那次扫描中, 行线数据与列线数据的 组合便是所期望键值, 由该键值可确定闭合键在矩阵连 接中的位置。 IAP15W4K58S4 为行线 P2.0 P2.3 为列线 P2.4 P2.7

15 2、键值产生的原理 2)线反转识别法产生键值 先将行线全部置低电平,列线全部置高电平(弱上拉I/O口 输入前先将输出锁存器置1), 从列线对应I/O口线接收数 据, 若有有口线变低, 则表示该列线上对应按键闭合。 再将列线全部置低电平,行线全部置高电平, 从行线对应 I/O口线接收数据, 若有口线变低, 则表示该行线上对应 按键闭合。 IAP15W4K58S4 上述两次操作可 得2个8位数据, 对其综合分析, 便可确定闭合按 键所在位置。 为行线 P2.0 P2.3 为列线 P2.4 P2.7

16 3、键盘识别原理 在键盘扫描产生键值前, 为避免无键按下的空扫描, 浪费 CPU时间, 应先进行一次键盘识别, 有两种方法。
1)硬件中断识别法 1)硬件中断识别法 ; )软件查询识别法 将矩阵式键盘电路的所有列线连接至“与”门电路的输 入端, “与”门电路的输出端与单片机外部中断连接。 把全部行线置为低电平, 全部列线置为高电平, 当 有键按下时列线上出现低 电平, 对应“与”门的输 出电平出现由高向低的跳 变, 经引脚进入单片机产 生中断, 在中断服务程序 中开始扫描键盘。 IAP15W4K58S4 为行线 P2.0 P2.3 为列线 P2.4 P2.7 CD4082 双4输入端与门

17 3、键盘识别原理 2)软件查询识别法 全部行线置为低电平, 全部列线置为高电平, 定时从列 线对应的I/O口线读输入数据, 若接收的数据中有低电 平, 则说明有按键按下, 开始执行键盘扫描程序。此法 无需在矩阵键盘中连接“与” 门电路, 硬件电路简洁。 上述两种识别方法中, 用硬件中断识别法可随时响应键 盘动作, 具有较强实时性, 而采用软件查询法则可简化 电路。 IAP15W4K58S4 为行线 P2.0 P2.3 为列线 P2.4 P2.7

18 4、按键操作的抖动处理 与简易键盘电路相同,矩阵键盘同样要考虑按键 触点闭合或断开时存在的抖动期,一般在取回键 值后进行5~10 ms的延时,判断原键值是否存在, 以决定是否存在按键的误动作。

19 5、矩阵键盘处理程序 下面是可供调用的键盘扫描子程序: 可读入4×4键盘状 态, 然后将键值送往内部RAM的 30H~33H单元。
具体方法: 利用单片机P2口的P2.0~P2.3口线轮流向行 扫描线送低电平, 将每次扫描中由P2.4~P2.7返回的数 据与当时行扫描送出的数据组合后作为键值送内部 RAM的30H~33H单元。 键值内容为8位, 低4位中的 “0”对应于行扫描输出线, 高4位中的“0”对应于闭合按键连接的列线。 IAP15W4K58S4 为行线 P2.0 P2.3 为列线 P2.4 P2.7

20 (加) SETB C ;用RLC使扫描指向下行
内部RAM的 30H~33H单元 5、矩阵键盘处理程序 键盘扫描程序清单如下: KEY-SCAN: MOV R0, #30H ; R0键值存储单元地址指针 MOV A, #0FEH ;设置行扫描初始状态 (加) SETB C ;用RLC使扫描指向下行 SCAN: MOV P2, A ; 输出至行扫描线, P2 . 0低电平 (加)ANL A, #0FH ;只保留行扫描线(P2.0~P2.3)状态 MOV R1, A ;保存行扫描线状态(R1低4位), R1高4位为0 MOV A, P ;读回列线数据(P2.4~P2.7) ANL A, #0F0H ;保留读回数据的高4位 ORL A, R ;组合键值, R1低4位扫描线状态,高4位为0 MOV @R0, A ;键值送存储单元 RET MOV R3, #0FEH 内部RAM的 30H~33H单元 MOV R0, #30H ; R0键值存储单元地址指针 MOV A, #0FEH ;设置行扫描初始状态 (加) SETB C ;用RLC使扫描指向下行 , 列线输出高电平 INC R0; 指向下行键值单元 MOV A, R3;准备扫描下行 RLC A; 扫描指向下行 MOV R3, A;保存扫描行 JB ACC.4, SCAN; ;判断是否已经完成扫描4行 为行线 P2.0 P2.3 为列线 P2.4 P2.7 IAP15W4K58S4

21 【例11-1】编程实现学习平台上矩阵键盘的按键扫描并在数码LED上显示。矩阵键盘的电路连接如图11-4所示。
图11-4 矩阵键盘连接电路原理图

22 [例8-7]编程实现在学习平台的数码LED上显示"01234567"
硬件连接如图所示 SI SI 9 QH’ 图8-36 数码LED显示电路原理图

23 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
404页C程序 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。 #include "stc15.h" #include <intrins.h> //_nop_()函数在此库文件中 unsigned char code t_display[]={ //标准字模库 // A B C D E F 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C, 0x39, 0x5E,0x79,0x71, //black H J K L N o P U t G Q r M y 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78, 0x3d, 0x67,0x50,0x37,0x6e, // 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; unsigned char code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码 sbit HC595_RCK = P5^4; //74HC595的12脚控制(存储或锁存时钟) unsigned char display_index; //显示位索引(指示8个LED管的其一显示) unsigned char LED8[8]; //显示缓冲 void Timer0Init(void); void Send_595(unsigned char spidata); void DisplayScan(void); LED显示电路参考292页例8-7, 显示程序也可参340页例9-3 LED8的值是t_display字模库序号值

24 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
#define DIS_DOT 0x20 //’0.’ 字模0xBF在字模库中的序号 #define DIS_BLACK 0x10 //全黑消隐不显示字模0x00在字模库中的序号 #define DIS_ 0x11 //’-’字符字模0x40在字模库中的序号 unsigned char KeyCode; //给用户使用的键码, 17~32有效 unsigned char IO_KeyState, IO_KeyState1, IO_KeyHoldCnt; //行列键盘变量 unsigned char cnt50ms; //软件计数器变量, 在T0中服中对T0定时1毫秒计数 void IO_KeyScan(void); //键盘扫描子函数声明 void main(void) { unsigned char i; //for循环控制变量 display_index = 0; //显示位索引0(指示8个LED管的第1个显示) // 初始化SPI AUXR1=0x08; //将SPI切换到[P5.4,P4.0,P4.1,P4.3] SPCTL=0xde; SPSTAT=0xc0; //写1清SPIF,WCOL标志位 Timer0Init(); //T0初始化 cnt50ms = 0; ET0 = 1; //T0中断允许 EA = 1; //打开总中断 for(i=0; i<8; i++) LED8[i] = 0x10; //上电消隐 //SPI通信控制, 主机模式数据字的最高位先传送, CPOL=1, CPHA=1, //时钟频率CPU_CLK /16

25 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
KeyCode = 0; //给用户使用的键码: 键盘代表数字码值, 17~32(图中是0~F) IO_KeyState = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态 IO_KeyState1 = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态 IO_KeyHoldCnt = 0; //用来计数重复按键持续时间是否>1秒 while(1) { if(cnt50ms >= 50) //50ms扫描一次行列键盘 cnt50ms = 0; IO_KeyScan(); } if(KeyCode > 0) //有键按下, 只要KeyCode非0就输出显示 LED8[6] = KeyCode / 10; //显示键码 LED8[7] = KeyCode % 10; //显示键码 KeyCode = 0; cnt50ms在T0的 1ms中断函数 中加1 键码17~32, 或修改KeyCode的计算, 使显示0~F LED8每隔1ms在T0的 1ms中断函数 中调用DisplayScan()显示

26 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
// 行列键扫描相关子函数 unsigned char code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; void IO_KeyDelay(void) { unsigned char i; i = 60; while(--i); } void IO_KeyScan(void) //按键扫描子函数 {unsigned char j; j = IO_KeyState1; //保存上一次键码状态 P0=0xf0; //X低(列线P0. 0~P0.3输出低), 读Y(读行线P0.4~P0.7前需先输出高电平) IO_KeyDelay(); IO_KeyState1=P0 & 0xf0; //因列线输出, 从P0读进的值只用行线口高4位值 P0 = 0x0f; //Y低(行线P0.4~P0.7输出低),读X(列线P0.0~P0.3)前先输出高电平 IO_KeyState1 |= (P0 & 0x0f); //行线输出低, 取列线读进的值 IO_KeyState1 ^= 0xff; //合成键码取反, 则没键按下时其值为0 if(j == IO_KeyState1) //连续两次读相等(包括无键按下j=0和有键按下j≠0) { j = IO_KeyState; //j保存上次读的键码状态 IO_KeyState = IO_KeyState1; //保存本次读的键码状态 T_KeyTable[16]与行列键扫描程序的查找4x4键方法有关, 其值含义参考下页键值KeyCode的计算方法, 可理解为:按键只支持单键按下, 不支持多键同时按下,否则按多键时使KeyCode=0, 即按多键时不显示没反应。   低4位与行线口读进高4位值合成键码 IO_KeyState1 = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态 IO_KeyState = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态

27 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
unsigned char code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0}; [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。 void IO_KeyScan(void) //(续)按键扫描子函数 ... if(j == IO_KeyState1) //连续两次读相等(包括j=0和有键按下j≠0) {j = IO_KeyState; //j保存上次读的键码状态 IO_KeyState = IO_KeyState1; //保存本次读的键码状态 if(IO_KeyState != 0) //本次读的键码值不为0,即有键按下 { F0 = 0; //标志位F0, F0=0表示是重复按键持续时间<1秒 if(j == 0) F0 = 1; //若上次读的键码值为0, 表示第一次有键按下 else if(j == IO_KeyState) //连续2次读相等 {if(++IO_KeyHoldCnt >= 20) //若重复按键持续时间>1秒 { IO_KeyHoldCnt = 18; //>1秒的重键, 每100ms输出KeyCode F0 = 1; } } if(F0) //重复按键持续时间<1秒的按键不需计算键盘代表的数字码值 { j = T_KeyTable[IO_KeyState >> 4]; //高4位表示第j行,1,2,3,4 if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) //第几列 KeyCode = (j-1)*4+T_KeyTable[IO_KeyState & 0x0f]+16 ; //计算键盘代表数字码值, 17~32(图中是0~F) } else IO_KeyHoldCnt = 0; //用来计数重复按键持续时间是否>1秒 P0 = 0xff; 为方便阅读重复写出上页程序最后的3行 行列键扫描程序:查找4x4键的方法, 按键只支持单键按下, 不支持多键同时按下,否则出错, 在本程序中按多键时没反应。 行列扫描按键键码为17~32 (图中是0~F)。  键按下超过1秒后, 将以10键/秒的速度提供重键输出。用户只需要检测KeyCode是否非0来判断键是否按下。 sbit F0=PSW^5 因50ms扫描一次键盘 -1 IO_KeyState的高4位值即读进的行线口P0.4~P0.7的值,高4位值1表示第1行, 2表示第2行, 4表示第3行, 8表示第4行。低4位值即读进的列线口P0.0~P0.3的值,低4位值1表示第1列, 2表示第2列, 4表示第3列, 8表示第4列。 KeyCode = 0; //给用户使用的键码: 键盘代表数字码值, 17~32(图中是0~F) IO_KeyState = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态 IO_KeyState1 = 0; //存本(上) 次从行列线口P0.0~P0.7读的值,表示按键状态 IO_KeyHoldCnt = 0; //用来计数重复按键持续时间是否>1秒

28 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
// 显示数据发送 void Send_595(unsigned char spidata) { unsigned char spi_status=0; SPDAT=spidata; while(spi_status==0) //等传输完毕 spi_status=SPSTAT; spi_status=spi_status&0x80; } SPSTAT=0xc0; //写1清SPIF标志位 // 显示扫描函数 void DisplayScan(void) Send_595(~T_COM[display_index]); //输出位码 Send_595(t_display[LED8[display_index]]); //输出段码 HC595_RCK = 1; HC595_RCK = 0; //锁存输出数据 if(++display_index >= 8) display_index = 0; //8位结束回0

29 [例11-1] 编程实现矩阵键盘的按键扫描并在数码LED上显示。
void Timer0Init(void) { AUXR |= 0x80; //T0工作于1T模式 TMOD &= 0xF0; //设置T0模式0 TL0 = 0xcd; //设置定时初值 TH0 = 0xd4; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //T0开始计时 } // T0 的1ms中断函数 void T0_ISR(void) interrupt T0_VECTOR DisplayScan(); //1ms扫描显示一位 cnt50ms++;

30 程序请见教材。 思考:多键同时按下时,会有什么现象?

31 §11.2 显示技术 11.2.1 数码LED显示技术 1、显示元件概述
主要显示元件:LED(发光二极管显示器、数码管) 或 LCD(液晶显示器)。 显示形式:笔画式和点阵式。 笔画式显示元件大多为LED数码管, 用于显示数字 或简单字母信息, 适合于规模较小的单片机系统。 若考虑到单片机系统功耗因素, 也有笔画式LCD数 码管可供选用,但在控制和连接上要稍微复杂一些。

32 1、显示元件概述 本节主要介绍笔画式LED和点阵式LCD的应用。
用点阵式LCD显示器最好采用内置控制器模块形 式 (LCD Module, 或LCM), 这种情况下, 单片机与 点阵式LCD的接口实际上变成了单片机与单片机 之间的数据通信。 本节主要介绍笔画式LED和点阵式LCD的应用。

33 11.2.1 数码LED显示技术 h g f e d c b a 2、七段码LED显示器
LED数码管由8只LED发光二极管构成, 8只LED发光 二极管分别代表组成数码的笔画(称为段)和该位数码 的小数点。由于显示的数字由7个显示段组合而成, 所以也称为七段码。 h g f e d c b a D7 D6 D5 D4 D3 D2 D1 D0 h g f e d c b a

34 2、七段码LED显示器 共阴极 高电平驱动 共阳极 低电平驱动 图11-5 LED七段数码管显示器结构 七段数码管显示器中为简化电路引出线,通常将8只 发光二极管的阴极或阳极连接在一起作为电路公共端, 由此分成了共阴极或共阳极显示器,采用高电平或低 电平驱动。 注意: 七段数码管的驱动电流应限制,在保证不超过 单片机或其他驱动芯片功耗前提下维持正常发光亮度。

35 3、七段码LED显示器的显示方式及接口 七段码LED显示器可采用静态显示和动态显示两种 形式。
静态显示是指在显示时段内对组成字型的发光二 极管保持恒定的导通或截止; 动态显示是指在显示时段内对组成字形的发光二 极管实行间断或轮流(多字符显示)点亮。 其中前一种形式程序操作简单,CPU送出字形码后 可以不再管理。而后一种显示形式则可最大限度地 降低显示功耗,但是占用了CPU的执行程序时间。

36 由单片机串行口与移位寄存器芯片CD4094组成的共阴 极七段码LED静态显示接口电路如图所示。
1)静态显示接口 图11-6 LED静态显示接口电路 由单片机串行口与移位寄存器芯片CD4094组成的共阴 极七段码LED静态显示接口电路如图所示。 8 位同步移位寄存器输出方式 IAP15W4K58S4 D7 D6 D5 D4 D3 D2 D1 D0 串口用方式 0 CD4094是8位移位寄存器 / 三态并行锁存器输出, QS移位输出可级联; EN=0锁存器输出高阻, EN=1锁存器并行输出; ST=0锁存器不随移位寄存器变化, ST=1锁存器随移位寄存器变化而变化;

37 2)动态显示接口 采用多位LED数码管显示时,可逐位点亮数码管, 虽然在显示过程中有些数码管有熄灭时间,但是利 用人眼的视觉暂留效应和LED发光二极管的余辉, 只要点亮与熄灭时间分配适当,仍能够感觉到所有 数码管始终处于显示状态。 动态显示时CPU需要经常执行相关程序进行显示刷 新,这可能占用较多的CPU执行时间,对需要快速 运算或实时控制的用途会增加编程难度。

38 2)动态显示接口 LED动态显示接口的具体电路如图所示。 共阳极端 图11-7 LED动态显示接口电路 IAP15W4K58S4
输出低电平,数码管显示 共阳极端 三态八缓冲器/线驱动器 图11-7 LED动态显示接口电路

39 设需显示4位16进制数的数字放在60H开始的4单元中:
例题: 要求显示4位16进制的数 动态扫描显示子程序如下: 设需显示4位16进制数的数字放在60H开始的4单元中: SDIS: MOV R0, #60H ;使指针R0指向显示数据存储区首址 MOV DPTR, # DSEG ;设置七段码字模表首地址 MOV R7, #0FEH ;设置数码管显示位指针,指向最左边一位P2.0 MOV A, R ;显示位指针内容送累加器 (加) SETB C ;下面用RLC使扫描指向下行 LD0: MOV P2, A  ;选通显示位P2.0 RLC  A   ;显示位指向下一位 MOV R7, A   ;保存下一显示位指针内容 MOV R ;取显示数据(每个存储单元值0~F)内容 MOVC ;查显示内容(0~F)字形码(字模) MOV P0, A ;送出显示字形码(0~F) (字模) CALL DEL ;调延时子程序使数码管显示一定时间 INC R ;指向下一个显示的存储单元 MOV A,R ;取下一显示位指针内容 JB ACC.4, LD ;未扫描完4位 (P2.4还没显示), 继续循环 RET

40 2)动态显示接口 h g f e d c b a 1 1 ;下面是0~9, A~F共阳极字形七段码
DSEG: DB C0H, F9H, A4H, B0H, 99H, 92H, 82H, F8H, 80H; DSEG2: DB 90H, 88H, 83H, C6H, A1H, 86H, 8EH (A)= 0, 1, , , 4, , 6, , 字模值 (A)= 9, A, B, C, D, E, F 请自行补充完 整其中的延时 子程序和对应 的C语言程序。 h g f e d c b a 1 C0H 9 1 90H

41 2)动态显示接口 8位LED数码管显示驱动还可以使用两片74HC595进 行控制,具体参考例8-7。 数码管显示驱动和键盘扫描控制专用芯片 在单片机应用系统中, 为节省I/O口资源, 提高CPU效 率, 设计键盘和显示接口时, 常用数码管显示驱动和 键盘扫描专用芯片 (键盘/显示扩展芯片)。 常见键盘/显示扩展芯片有CH451/CH452、HD7279、 AZLG7289A等。

42 LCD1602字符型液晶屏, 能够同时显示16x02即32个字符(非中文)
液晶显示技术 液晶显示器件(LCD显示器)因有显示信息丰富、功耗 低、体积小、无辐射等优点,得到了广泛应用。 LCD显示器有笔画分段、分割显示、字符点阵显示和 图形点阵LCD显示形式之分,对于比较丰富的显示内 容通常采用图形点阵显示形式,但是这种显示形式的 电路结构及控制方式比较复杂。 为便于使用, LCD图形点阵显示器常以LCM (LCD Module)形式出现, 模块中封装了显示器、驱动电路、 控制电路及背光调节电路等。(如12864, 1602液晶屏) 以OCMJ4X8C为例介绍图形点阵LCD显示接口应用。 金鹏电子有限公司, OCMJ(奥可拉中文集成模块)C系列液晶显示模块 LCD1602字符型液晶屏, 能够同时显示16x02即32个字符(非中文) 12864参考资料: FYD12864液晶中文显示模块(46页).doc OCMJ4X8C: C系列中文液晶显示模块使用说明书(金鹏电子) (23页) 亚斌ST7920系列中文图形液晶模块使用说明书(35页).pdf 中文字库型液晶显示模块使用说明书 (北京博研佳信电子科技发展有限公司) (72页) ST7920:中文图形液晶屏(LCD)的控制器/驱动器说明书

43 1、OCMJ4X8C液晶显示模块概述 OCMJ4X8C液晶显示屏(统称12864液晶屏)为128×64点 阵, 可显示4行、 每行8个汉字。OCMJ4X8C可实现汉字、 ASCII码、点阵图形、自造字体的同屏显示。 该模块具有2MB的中文字形CGROM(Custom Glyph RAM), 其中含有8192个16×16点阵中文字库; 16K-位(128×16×8 点阵)半宽字型ROM (HCGROM) 总 共提供128 个符号字型(16x8 点阵) ASCII字符库; 64×16-位的字型产生RAM (CGRAM)提供了4组16×16 点阵的图象定义(造字功能)空间 。 (字形) (国标码GB2312的汉字机内码)

44 1、OCMJ4X8C液晶显示模块概述 12864液晶屏为128×64点阵, 可显示4行、 每行8个汉字。 可实现汉字CGROM、ASCII码 (HCGROM)、点阵图形、 自造字体(CGRAM)的同屏显示。

45 1、OCMJ4X8C液晶显示模块概述 128×16×8半宽字型符号表 12864液晶屏为128×64点阵, 可显示4行、 每行8个汉字。 可实现汉字CGROM、ASCII码 (HCGROM)、点阵图形、 自造字体(CGRAM)的同屏显示。

46 1、OCMJ4X8C液晶显示模块概述 显示数据RAM(DDRAM, display data RAM): 模块内部 显示数据RAM提供64×2个字节的空间, 最多可控制4行 16字(64个字)的中文字型显示 (汉字国标码2个字节) ; 当写入DDRAM时, 可显示三种字型:半角英文数字型(16*8) HCGROM型、CGROM中文字型与CGRAM自定义字型; 三种字型的选择, 由在DDRAM中写入的编码选择, 在 0000H—0006H的编码中(其代码分别是0000、0002、0004、 0006共4个)将选择CGRAM的自定义字型; 02H—7FH的编码将选择半角英文数字的字型; 至于A1以上的编码将自动结合下一个字节, 组成两个字 节的编码形成中文字型的编码BIG5(A140—D75F), GB(A1A0-F7FFH)。 (BIG5(A140繁体规范,GB是简体规范)

47 1、OCMJ4X8C液晶显示模块概述 可显示4行、 每行8个汉字。实现汉字CGROM、ASCII码 (HCGROM)、自造字体(CGRAM)、点阵图形的同屏显示。 GDRAM 地址计数器(AC, address counter) : 地址计数器是用来贮存DDRAM/CGRAM之一的地址, 它可由设定指令暂存器来改变,之后只要读取或是写 入DDRAM/CGRAM的值时,地址计数器的值就会自 动加一,当RS为“0”时而R/W为“1”时,地址计数 器的值会被读取到DB6 ~ DB0 (字节的低7位)中。 提供64×256点阵GDRAM(Graphic Display Ram)绘图区域。 IRAM(ICON RAM):15×16 位点阵总共 240 点的图标RAM, 存 储将被显示的图标数据(应用中少见)。

48 1、OCMJ4X8C液晶显示模块概述 为了便于和多种微处理器、单片机接口,模块提供了 8位并行、2线串行、3线串行三种接口方式。
OCMJ4X8C的2线串行接口方式符合SPI时序标准, 大 大简化了液晶显示模块与单片机之间的接口设计。 OCMJ4X8C模块的工作电压为4.5~5.5V, 具有睡眠、 正常及低功耗工作模式, 可满足系统各种工作电压及 便携式仪器低功耗的要求。 ST7920: 液晶屏的控制器/驱动器 12864参考资料: FYD12864液晶中文显示模块(46页).doc OCMJ4X8C: C系列中文液晶显示模块使用说明书(金鹏电子) (23页) 亚斌ST7920系列中文图形液晶模块使用说明书(35页).pdf 中文字库型液晶显示模块使用说明书 (北京博研佳信电子科技发展有限公司) (72页) ST7920:中文图形液晶屏(LCD)的控制器/驱动器说明书

49 2、OCMJ4X8C模块引脚 表11-1 OCMJ4X8C模块引脚及对应说明 SID 引脚 名称 方向 说明 1 VSS - GND(0V)
VDD 逻辑电源(+5v) 3 VO LCD电源(悬空) 4 RS(CS) H/L:I 并行:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙标志,地址计数器; 串行:片选,高电平有效 5 R/W(STD) 并行: H(高电平):读, L:写; 串行:串行输入数据 6 E(SCLK) 并行:使能; 串行:时钟 7 DB0 I/O 数据0 8 DB1 数据1 9 DB2 数据2 10 DB3 数据3 引脚 名称 方向 说明 11 DB4 I/O 数据4 12 DB5 数据5 13 DB6 数据6 14 DB7 数据7 15 PSB H/L:I H: 并行模式 L: 串行模式 16 NC - 空脚 17 /RST 复位(低电平有效) 18 19 LEDA 背光源正极(LED+5V) 20 LEDK 背光源负极(LED-OV) 对比度(亮度)调整 例11-2是2线SPI串行接口方式 (Serial Input Data) SID

50 3、信息传输与接口时序 (1)并行接口方式 当PSB脚接高电位时, 模块进入并行传输模式, 单片机 与液晶模块通过RS, RW, E, D7~D0完成信息传输。 并行接口方式时, 单片机写数据到模块时序图如图示。 RS:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙标志,地址计数器; 引 脚 (a)单片机写数据到模块时序图 图11-8 并行接口方式的时序图

51 (1)并行接口方式 并行接口方式时, 单片机从模块中读取数据时序图。 读 (b)单片机从模块读取数据时序图 图11-8 并行接口方式的时序图
RS:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙标志,地址计数器; 引 脚 (b)单片机从模块读取数据时序图 图11-8 并行接口方式的时序图

52 (2)串行接口方式 当PSB脚接低电位时,模块将进入串行模式。 串行传输流程: 首先传输起始字节(含五个连续“1”, 即同步字符串)。
SID 书STD 串行时RW、RS是数据位 (2)串行接口方式 当PSB脚接低电位时,模块将进入串行模式。 串行传输流程: 首先传输起始字节(含五个连续“1”, 即同步字符串)。 传输起始字节时, 传输计数被重置且串行传输将被同 步, 再跟随的两个位分别指定传输方向位(RW)及寄存 器选择位(RS), 最后第八位为 “0”。 在接收到同步位及RW和RS的起始字节后, 每一个8位 指令将被分为两个字节接收到: 高4位(D7~D4)的指令被放在第一个字节的LMSB高四 位部分, 而低4位(D3~D0)的指令资料则被放在第二个 字节的LMSB高四位部分,至于相关的另四位则都为0。

53 4、编程指令集 表11-2 OCMJ4X8C模块的基本编程指令集 (RE=0) : 指令 控制信号 指令码 执行时间 RS R/W D7
清除显示 1 1.6ms 地址归位 × 72us 进入点设定 I/D S 显示状态开/关 D C B 游标或显示移位控制 S/C R/L 功能设定 DL 0/RE 设定CGRAM地址 A5 A4 A3 A2 A1 A0 设定DDRAM地址 A6 读取忙碌标志BF和地址 BF 写资料到RAM 读出RAM的值 并行时是引脚 串行是数据位 11条指令具体指令介绍见后。

54 4、编程指令集 表11-3 OCMJ4X8C模块的扩展编程指令集(RE=1) : 7条指令具体指令介绍见后。 指令 控制信号 指令码
执行时间 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 待机模式 1 72us 卷动地址或IRAM地址选择 SR 反白选择 R1 R0 睡眠模式 SL × 扩充功能设置 1/RE G 设定IRAM地址或卷动地址 A5 A4 A3 A2 A1 A0 设定绘图GDRAM地址 A6 7条指令具体指令介绍见后。

55 功能:把DDRAM 地址计数器调整为“00”, 光标回原 点, 该功能不影响显示DDRAM。
SID R/W(STD) 并行: H:读, L:写;串行:输入数据 RS(CS) 并行:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙标志,地址计数器; 串行:片选,高电平有效 4、编程指令集 引脚 (1)清除显示(指令代码为01H) 串行时RW, RS为数据位, 下同 RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 功能:将DDRAM 填满 “20H” (ASCII码表的空格), 把 DDRAM地址计数器 (AC)调整为 “00”, 重新进入点设 定将I/D设为 “1”: (光标右移, AC加1)。 (2) 地址归位(指令代码为02H) 串行时RW, RS为数据位, 下同 RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 X 功能:把DDRAM 地址计数器调整为“00”, 光标回原 点, 该功能不影响显示DDRAM。

56 address counter Increase / Decrease
(3)点设定(指令代码为07H/04H/05H/06H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 I/D SH 功能:设定光标移动方向并指定整体显示是否移动。 I/D=1光标右移,AC自动加1; I/D=0光标左移,AC自动减1。 SH=1且DDRAM为写状态: 整体显示移动,方向由 I/D决定 (I/D=1整体显示左移, I/D=0整体显示右移)。 SH=0或DDRAM为读状态:整体显示不移动。 address counter Increase / Decrease 也称Entry Mode Set, 当设定了点设定的内容时,写入的每一个内容都会按照这个设定方式移动。而“ (5)光标或显示移位控制” 只在写入一条命令时移动一次。

57 (4) 显示状态开/关(指令代码为08H/0C0H/0E0H/0F0H)
4、编程指令集 (4) 显示状态开/关(指令代码为08H/0C0H/0E0H/0F0H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 D C B 功能: D=1:整体显示ON;D=0:整体显示OFF。 C=1:光标显示ON;C=0:光标显示OFF。 B=1: 光标位置反白且闪烁; B=0: 光标位置不反白闪烁。

58 (5)光标或显示移位控制(指令代码为10H/14H/18H/1CH)
RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 S/C R/L X 功能: 10H/14H:光标左/右移动,AC减/加1 18H/1CH: 整体显示左/右移动,光标跟随移动,AC值不变。 S/C R/L Description AC Value Cursor moves left by 1 AC=AC-1 1 Cursor moves right by 1 AC=AC+1 1 Display shift left by 1, cursor also follows to shift. AC=AC Display shift right by 1, cursor also follows to shift. 与“ (3)点设定”区别: 当设定了点设定的内容时,写入的每一个内容都会按照这个设定方式移动。而“ (5)光标或显示移位控制” 只在写入一条命令时移动一次。

59 4、编程指令集 (6) 功能设定(指令代码为36H/30H/34H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 DL
1 DL X RE 功能: DL=1:并口的8-BIT控制接口; DL=0:并口的4-BIT控制接口。 RE=1:扩充指令集动作; RE=0:基本指令集动作。 DL和RE不能在一 条指令中同时改变, 先变DL,再变RE

60 (7)设定CGRAM地址(指令代码为40H-7FH)
4、编程指令集 (7)设定CGRAM地址(指令代码为40H-7FH) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 AC5 AC4 AC3 AC2 AC1 AC0 功能: 设定CGRAM地址到地址计数器(AC), 需确定扩充 指令中SR=0 (选择CGRAM地址) (或 SR=1:卷动地址)。 64×16位的字型产生RAM (CGRAM) 4组16×16点阵的 图象定义(造字功能)空间 。

61 (8)设定DDRAM地址(指令代码为80H-9FH)
4、编程指令集 (8)设定DDRAM地址(指令代码为80H-9FH) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 应为0 功能:设定DDRAM地址到地址计数器(AC) 模块内部显示数据RAM(DDRAM)提供64×2个字节的 空间, 最多可控制4行×16字(64个字)的中文字型显示 。 液晶显示(32个字)位置地址: 第1行 第3行 First line AC range is: H, ... ,87H, 88H,... ,8FH Second line AC range is: 90H, ... ,97H, 98H,... , 9FH Third line AC range is: A0H , ... , AFH Fourth line AC range is: B0H , ... , BFH note: only 2 lines can be display at a time. 第2行 第4行 液晶只显示4行× 8字 (32个字)

62 4、编程指令集 (9)读取忙碌状态(BF)和地址 功能:读取忙碌状态(BF)可确认内部动作是否完成, 同时可读出地址计数器(AC)的值。
串行时为数据位 RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:读取忙碌状态(BF)可确认内部动作是否完成, 同时可读出地址计数器(AC)的值。 BF=1时,表示内部忙碌中,此时不可写入指令. BF=0 才可写入新指令。 SID R/W(STD) 并行: H:读, L:写;串行:输入数据 RS(CS) 并行:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙碌标志与地址计数器; 串行:片选,高电平有效 引脚

63 4、编程指令集 (10)写数据到RAM RW RS D7 D6 D5 D4 D3 D2 D1 D0 1
1 功能:写入数据到内部的RAM(DDRAM/ CGRAM /IRAM /GDRAM),每个RAM 地址都要连续写入 两个字节的数据。 SID R/W(STD) 并行: H:读, L:写;串行:输入数据 RS(CS) 并行:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙碌标志与地址计数器; 串行:片选,高电平有效

64 4、编程指令集 以上指令集(含本页)是基本指令集, 必须功能设定指令中的RE=0 (11)读出RAM的值
RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 功能:从内部RAM读取数据(DDRAM /CGRAM /GDRAM),当设定地址指令后,若需读取数据时, 需先执行一次空的读数据,才会读取到正确数据,第 二次读取时则不需要,除非又使用设定地址指令。 R/W(STD) 并行: H:读, L:写;串行:输入数据 RS(CS) 并行:选择寄存器, H:(读/写)数据, L:(写)指令码,或读忙碌标志与地址计数器; 串行:片选,高电平有效

65 4、编程指令集 以下指令集(含本页)是扩充指令集, 必须功能设定指令中的RE=1 (12)待机模式(指令代码为01H)
RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 功能:进入待命模式,执行其他命令都可终止待机模式。 (13)垂直卷动地址或RAM地址选择(指令代码为02H/03H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 H SR 功能: SR=1: 允许输入垂直卷动地址; SR=0: 允许设定IRAM 地址(扩充指令集) 或CGRAM地址(基本指令集)。

66 4、编程指令集 (14)反白选择(指令代码为04H-07H)
RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 R1 R0 功能: 选4行中任一行(R1和R0的组合决定)作反白显示, 并可决定反白与否。R1,R0初始化值为0,0;第一次设定 为反白显示,再次设定变回正常。4行中只能显示2行。 (15)睡眠模式(指令代码为08H/0CH) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 SL X 功能:SL=1:脱离睡眠模式; SL=0:进入睡眠模式。

67 (16) 扩充功能设定(指令: 20H/24H/26H/30H/34H/36H)
4、编程指令集 (16) 扩充功能设定(指令: 20H/24H/26H/30H/34H/36H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 DL X RE G L 功能: DL=1: 8-BIT控制接口; DL=0: 4-BIT控制接口。 RE=1: 扩充指令集动作; RE=0: 基本指令集动作。 G=1: 绘图显示ON; G=0: 绘图显示OFF。 在一条指令中不能同时改变DL、G和RE,先变 DL或G,再变RE

68 4、编程指令集 (17)设定卷动地址(指令代码为40H~7FH)
RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 AC5 AC4 AC3 AC2 AC1 AC0 功能:SR=1:AC5~AC0为垂直卷动地址; SR=0:AC3~AC0写ICON RAM地址。 (18)设定绘图RAM地址(指令代码为80H~FFH) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:设定GDRAM地址到地址计数器(AC)。

69 5、显示步骤 (1)显示数据RAM(DDRAM)
显示数据RAM提供64×2字节的空间, 最多可控制4行 16字(64个字)中文字型显示。当写入显示数据RAM时, 可分别显示CGROM、HCGROM与CGRAM字型。 ST7920A(中文图形液晶显示器控制/驱动器)可以显示 三种字型: 半宽的HCGROM字型 CGRAM字型 中文CGROM字型。

70 (1)显示数据RAM(DDRAM) 三种字型的选择, 由在DDRAM中写入的编码选择,
1) 0000H~0006H的编码中将选择CGRAM的自定字型; 2) 02H~7FH 的编码中将选择半宽英文数字的字型; 3) A1H以上的编码将自动结合下一个字节, 组成两个字 节的中文字型编码: BIG5(A140H~D75FH) (大五码, 通 行于台湾、香港地区的繁体字编码方案) 、GB ( A1A0H~F7FFH) (国标码GB2312的汉字机内码)。

71 5、显示步骤 (2)绘图RAM(GDRAM) 绘图显示RAM提供64×32位的存储空间,最多可 以控制64×256点的二维绘图缓冲空间。
在更改绘图RAM内容时,由扩充指令设定绘图 GDRAM地址,先设垂直地址,再设水平地址(连 续写入两个字节的数据到绘图RAM),地址计数器 (AC)会自动加一。在写入绘图RAM期间,绘图显 示必须关闭。

72 5、显示步骤 (2)绘图RAM(GDRAM) 绘图显示RAM提供64×32位的存储空间,最多可 以控制256×64点的二维绘图缓冲空间。
在更改绘图RAM内容时,由扩充指令设定绘图 GDRAM地址,先设垂直地址,再设水平地址(连 续写入两个字节的数据到绘图RAM),地址计数器 (AC)会自动加一。在写入绘图RAM期间,绘图显 示必须关闭。 64×256点的二维绘图GDRAM空间示意图

73 (2)绘图RAM(GDRAM) 写入绘图RAM的步骤如下: 关闭绘图显示功能; 先将垂直的坐标(Y)写入绘图RAM地址;
再将水平的坐标(X)写入绘图RAM地址; 将D15~D8写入到RAM中(写入第一个字节); 将D7~D0写入到RAM中(写入第二个字节); 打开绘图显示功能。

74 图11-10 字符显示的RAM地址与32个字符显示区域的对应关系
5、显示步骤 ——(3)光标/闪烁控制 ST7920A提供硬件光标及闪烁控制电路, 由地址计数 器(address counter)的值来指定DDRAM中的光标或 闪烁位置。 汉字字符显示坐标在液晶模块中的地址: 80H~9FH。 字符显示的RAM地址与32个字符显示区域有着一一 对应关系,如下: X 坐标 Line1 80H 81H 82H 83H 84H 85H 86H 87H Line2 90H 91H 92H 93H 94H 95H 96H 97H Line3 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH Line4 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH 图11-10 字符显示的RAM地址与32个字符显示区域的对应关系

75 使用OCMJ4X8C显示模块时应注意以下几点:
①欲在某一位置显示中文字符时, 应先设定显示字符 位置, 即先设定显示地址, 再写入中文字符编码。 ②显示ASCII字符过程与显示中文字符过程相同。不 过在显示连续字符时,只须设定一次显示地址,由 模块自动对地址加1指向下一个字符位置,否则, 显示的字符中将会有一个空ASCII字符位置。 ③当字符编码为2字节时,应先写入高位字节,再写 入低位字节。

76 使用OCMJ4X8C显示模块时应注意以下几点:
④模块在接收指令前,处理器必须先确认模块内部 处于非忙状态(BF=0),方可接受新的指令。若 在送出指令前不检查BF标志,则在送出本指令之 前必须等待前一个指令执行完成。指令执行时间 请参考指令表中的指令执行时间说明。 ⑤“RE”为基本指令集与扩充指令集的选择控制位。 当改变“RE”后,以后的指令集将维持在最后的 状态,除非再次改变“RE”位,否则使用相同指 令集时,无需每次均重设“RE”位。

77 [例11-2]以SPI接口连接为例, 说明LCD模块使用方法。
当液晶模块的PSB引脚接低电平时,即进入串行接 口模式。串行模式使用串行数据线SID和串行时钟 线SCLK来传送数据,即构成2线串行模式。 OCMJ4X8C还允许同时接入多个液晶显示模块以完 成多路信息显示功能。此时,要利用片选信号CS (与RS共用引脚)构成3线串行接口方式。 当CS接高电平时,模块可正常接收并显示数据,否 则,模块将被禁止。当系统仅使用一个液晶显示模 块时,CS引脚可以接固定的高电平。

78 [例11-2]以SPI接口连接为例, 说明LCD模块使用方法
读写信号RW及数据(命令)寄存器的选择信号RS以数据位的形式通过串行方式传输到液晶模块进行相应控制。 IAP15W4K58S4 电 路 连 接 如 图 所 示。 引脚R/W 串行时用作片选 PSB脚接低电平,串行方式 背光负电源 P2.2高电平T1导通, 背光电源接通LED显示出来 图 OCMJ4X8C液晶模块与单片机的连接电路图

79 [例11-2] LCD模块使用方法: 示例程序如下:
#include"stc15.h" typedef unsigned char BYTE; //用BYTE 代替unsigned char sbit BLED=P2^2; //背光控制 void spi_init(void); //SPI初始化(2版含在main函数中) void delay(unsigned int us10); //延时子程序 void sendspi(BYTE spidata, BYTE RS_FLAG); //显示数据发送子程序 void lcd_init_usual(void); //液晶初始化子程序 void set_position(BYTE position); //确定光标位置子程序 void char_disp (BYTE chartodisp); //显示单个字符子程序 void string_disp(BYTE *stringtodisp); //显示字符串子程序

80 [例11-2] LCD模块使用方法: 示例程序如下:
void main (void) { spi_init(); //SPI初始化(2版没独立为子程) lcd_init_usual(); //液晶初始化 BLED=0; //背光控制 set_position(0x81); //确定光标位置 string_disp(“我爱单片机"); //显示汉字字符串 char_disp('!'); //显示单个字符 while(1); }

81 [例11-2] LCD模块使用方法: 示例程序如下:
void spi_init(void) //SPI初始化子程序 { AUXR1=0x04; //将SPI转移到P2口 , SPI初始化 SPCTL=0xd3; //SPI使能,主机模式, /SS无关,先发高位 SPSTAT=0xC0; //清传输完成标志和写冲突标志 } void delay(unsigned int us10) //延时子程序 while(us10--); //SPI状态寄存器, 对其SPIF标志通过向其写入1而清0 0:数据在SCLK的后时钟沿被改变,在前时钟沿被采样 0:SPI空闲时SCK=0,SCLK的前时钟沿为上升沿而后沿为下降沿。 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 只能1主模式 1:忽略 /SS引脚 1:使能SPI CPU_CLK/128 0: 最高位(MSB)最先传送

82 void sendspi(BYTE spidata,BYTE RS_FLAG) {BYTE cmdByte;
RS_FLAG控制起始命令字中(RW=0) RS的值(0:写指令码;1:写数据) [例11-2] LCD模块使用方法: RS_FLAG=0, spidata是指令码; RS_FLAG=0, spidata是显示数据 //显示数据发送子程序 void sendspi(BYTE spidata,BYTE RS_FLAG) {BYTE cmdByte; cmdByte=(0xf8 | (RS_FLAG<<1)); //形成命令字 SPDAT=cmdByte; while((SPSTAT&0x80)==0); //等起始命令传输完毕 SPSTAT=0xC0; //写1 到SPI状态寄存器的SPIF标志位, 使清0 SPDAT=spidata&0xf0; //一个字节需发送2次, 先发送高半字节 while((SPSTAT&0x80)==0); //等起始命令传输完毕 SPSTAT=0xc0; //写1清SPIF标志位 SPDAT=(spidata<<4)&0xf0; //一个字节需发送2次, 后发送低半字节 SPSTAT=0xc0; //写1清SPIF标志位 } //起始命令 (f8)1111 1,RW(0),RS(0),0 //命令字送SPI数据寄存器,即启动发送 即写指令码(数据)寄存器 ,读SPI状态寄存器

83 [例11-2] LCD模块使用方法: 示例程序如下:
void lcd_init_usual(void) //液晶初始化子程序 { sendspi(0x30,0); //DL=1(8位接口), RE=0(基本指令集) sendspi(0x01,0); //清除显示, 地址复位到0 delay(2000); sendspi(0x0e,0); //整体显示,光标显示,光标位置不反白闪烁 sendspi(0x06,0); //I/D=1光标右移,AC自动加1;S=0整体显示不移动 } 点设定:以后写入的每一个内容都会按照这个设定方式移动. (6) 功能设定(指令代码为36H/30H/34H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 DL X RE (1)清除显示(指令代码为01H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 (3)点设定(指令代码为07H/04H/05H/06H) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 I/D S

84 [例11-2] LCD模块使用方法: 示例程序如下:
void set_position(BYTE position) //确定光标位置子程序 { sendspi(position,0); } void char_disp(BYTE chartodisp) //显示单个字符子程序 { sendspi(chartodisp,1); void string_disp(BYTE *stringtodisp) //显示汉字字符串子程 { for(stringtodisp; * stringtodisp!=0; stringtodisp ++) sendspi (chartodisp,1); //如set_position(0x82) //起始命令(fa)11111,RW(0),RS(0),0 设置地址寄存器AC 即写数据到显示寄存器(DDRAM) //起始命令(fa)11111,RW(0),RS(1),0 即写数据到显示寄存器(DDRAM) (8)设定DDRAM地址(指令代码为80H-9FH) RW RS D7 D6 D5 D4 D3 D2 D1 D0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0


Download ppt "第11章 人机交互接口."

Similar presentations


Ads by Google