AN205510 F²MC-8FX Family MB95200 Series Keyboard Development using Matrix (Chinese).pdf

Spansion® 模拟和微控制器产品
本文档包含有关 Spansion 模拟和微控制器产品的信息。尽管本文档内有原来开发该产品规格的公司名称
“富士通”或 “Fujitsu”, 该产品将由 Spansion 提供给现有客户和新客户。
规格的延续
本文档内容并不因产品供应商的改变而有任何修改。文档内容的其他更新,均为改善文档而进行,并已记录在文档
更改摘要。日后如有需要更改文档,其更改内容也将记录在文档更改摘要。
型号的延续
Spansion 将继续提供型号以“MB”开始的现有产品。如欲订购该类产品,敬请使用本文档内列出的产品型号。
查询更多信息
如欲查询更多关于 Spansion 存储器、模拟产品和微控制器产品及其解决方案的信息,请联系您当地的销售办事
处。
书末出版说明
本文档介绍的产品,其设计、开发和制造均基于一般用途,包括但不限于普通工业使用、普通办公使用、个人使用及家庭使用,不应用于:(1)
存在严重风险或危险,除非能够保证极高的安全性,否则可能对公众造成严重影响,甚至可能直接造成死亡、人员伤害、物品损坏或其他损失
的用途(如核设施的核反应控制、飞机飞行控制、空中交通控制、公共交通控制、医学生命支持系统、武器系统的导弹发射控制),或者(2) 不
允许出现故障的用途(如潜艇中继器和人造卫星)。请注意,对于您和 / 或任何第三方由于将产品用于上述用途而造成的任何索赔和损失,
Spansion 不承担任何责任。任何半导体设备都可能发生故障。您必须在自己的设施和装置中加入安全设计措施,如冗余、防火、防止电流过
载及其他异常运行情形等,以防由于此类故障而造成伤害、损坏或损失。如果根据日本 Foreign Exchange and Foreign Trade Law、美国US Export
Administration Regulations 或其他国家(地区)的适用法律的规定,本文档中介绍的任何产品是在出口方面受到特别限制的商品或技术,则这
些产品的出口必须预先得到相关政府的许可。
商标和声明
本文档的内容如有变更,恕不另行通知。本文档可能包含Spansion 正在开发的 Spansion 产品的相关信息。 Spansion 保留变更任何产品或停
止其相关工作的权利,恕不另行通知。本文档中的信息 “ 按原样 ” 提供,对于其精确性、完整性、可操作性、对特定用途的适用性、适销性、
不侵犯第三方权利等不提供任何担保或保证,也不提供任何明确的、隐含的或法定的其他担保。对于因使用本文档中的信息而造成的任何形式
的任何损失,Spansion 不承担任何责任。
版权所有© 2013 Spansion Inc. 保留所有权利。Spansion®、Spansion 标识、MirrorBit®、MirrorBit® Eclipse™、ORNAND™ 以及它们的组合,
是Spansion LLC 在美国和其他国家(地区)的商标和注册商标。使用的其他名称只是一般性参考信息,可能是其各自所有者的商标。
富士通半导体(上海)有限公司
应用笔记
MCU-AN-500038-Z-10
F²MC-8FX 家族
8 位微型控制器
MB95200 系列
使用矩阵的键盘开发
应用笔记
使用矩阵的键盘开发 V1.0
修改记录
修改记录
版本
日期
作者
修改记录
1.0
3/5/2009
Benjamin. Yang
初稿
本手册包含19页。
1. 本文档记载的产品信息及规格说明如有变动,恕不预先通知。如需最新产品信息和/或规格说明,联系富士
通销售代表或富士通授权经销商。
2. 基于本文档记载信息或示意图的使用引起的对著作权、工业产权或第三方的其他权利的侵害,富士通不承
担任何责任。
3. 未经富士通明文批准,不得对本文档的记载内容进行转让、拷贝。
4. 本文档所介绍的产品并不旨在以下用途: 需要极高可靠性的设备,诸如航空航天装置、海底中继器、核控制
系统或维系生命的医用设施。
5. 本文档介绍的部分产品可能是“外汇及外贸管理法”规定的战略物资(或专门技术),出口该产品或其中部分
元件前,应根据该法获得正式批准。
版权©2009 富士通半导体(上海)有限公司
MCU-AN-500038-Z-10- 第2页
使用矩阵的键盘开发 V1.0
目录
目录
修改记录 ....................................................................................................................................... 2 目录 ............................................................................................................................................... 3 1 概要 .......................................................................................................................................... 5 2 硬件设计 .................................................................................................................................. 6 3 键盘开发 .................................................................................................................................. 7 3.1 矩阵电路的功能 ..................................................................................................................... 7 3.2 抖动消除 ................................................................................................................................. 7 3.3 抖动消除示例 ......................................................................................................................... 7 4 资源使用 .................................................................................................................................. 8 4.1 寄存器介绍 ............................................................................................................................. 8 4.1.1 端口数据寄存器(PDR) ..................................................................................... 8 4.1.2 数据方向寄存器(DDR) ..................................................................................... 8 4.1.3 上拉控制寄存器(PUL) ...................................................................................... 8 4.1.4 输入电平选择寄存器(ILSR) ............................................................................. 9 4.2 简介 .................................................................................................................................. 9 4.2.1 如何设置输入引脚 .................................................................................................. 9 4.2.2 如何设置输出引脚 .................................................................................................. 9 4.2.3 上拉寄存器 ............................................................................................................ 10 5 软件设计 ................................................................................................................................. 11 5.1 软件设计 ............................................................................................................................... 11 6 代码示例 ................................................................................................................................. 13 7 性能评估 ................................................................................................................................. 17 8 更多信息 ................................................................................................................................. 18 MCU-AN-500038-Z-10 - 第3页
使用矩阵的键盘开发 V1.0
目录
9 附录 ......................................................................................................................................... 19 MCU-AN-500038-Z-10- 第4页
使用矩阵的键盘开发 V1.0
第 1 章 概要
1 概要
使用 MB95200 系列 MCU 设计键盘功能的方法一共有三种:外部中断,AD 以及矩阵。
本文档描述了如何使用矩阵法设计键盘功能,并以实例阐述了该方法。
MCU-AN-500038-Z-10 - 第5页
使用矩阵的键盘开发 V1.0
第 2 章 硬件设计
2 硬件设计
本章介绍了如何运用矩阵法使用硬件电路设计键盘功能。
目前有两种方法可用于消除抖动:软件法和硬件法。要使用硬件法,必须在电路中增加一个电
容。
图 2-1: 使用矩阵设计键盘的电路
如上图所示,P04~P07 用作输出引脚,P00~P03 用作输入引脚,用于扫描键盘状态。
MCU-AN-500038-Z-10- 第6页
使用矩阵的键盘开发 V1.0
第 3 章 键盘开发
3 键盘开发
本章介绍了如何使用矩阵开发键盘。
3.1
矩阵电路的功能
键盘是输入系统的一个重要工具。本设计指出如何用精简的 I/O。
本设计采用了检测键盘状态的实时监控法。检测周期是一个固定值,这意味着任何比该值慢的
动作都将被监控软件捕捉,从而确保了键盘的高响应性。
3.2
抖动消除
抖动是键盘设计中存在的一个问题,有二种方法可以解决这个问题。一种是在硬件电路中增加
一个电容,另一种是通过使用 8/16 位多功能定时器增加延时。
3.3
抖动消除示例
以下时序图是消除抖动的一个示例。该示例采用矩阵法设计一个 4x4 的键盘。X0、 X1、 X2
和 X3 依次扫描键盘 50ms,扫描整个键盘需要大约 200ms。
图3-1: 抖动消除的时序图
MCU-AN-500038-Z-10 - 第7页
使用矩阵的键盘开发 V1.0
第 4 章 资源使用
4 资源使用
本章介绍了正常运行状态下的评估步骤。
要监控键盘状态,必须使用 I/O 引脚。本章将介绍 I/O 端口的使用。参见 MB95200 系列硬件
手册的第 9 章了解关于寄存器设置的更多信息
4.1
寄存器介绍
4.1.1 端口数据寄存器(PDR)
该寄存器包含对应输入或输出引脚的位信息。如果端口方向寄存器设置为输出模式,则输出该
寄值。
注意:资源输出控制位重写 PDR 位值。
Pin 功能
PDRx_yz
0
Pin state low (VSS)
1
Pin state high (VDD)
4.1.2 数据方向寄存器(DDR)
如果引脚用作输入或输出,该寄存器包含对应引脚的位信息。
外围功能输出
DDRx_yz
引脚功能
0
禁用
端口输入
1
禁用
端口输出
invalid
启用
外围功能输出
4.1.3 上拉控制寄存器(PUL)
该寄存器连接一个内部上拉电阻至端口引脚。
PULx_yz
上拉电阻
0
禁用
1
启用
参见数据表了解关于电阻值的更多信息。
MCU-AN-500038-Z-10- 第8页
使用矩阵的键盘开发 V1.0
第 4 章 资源使用
4.1.4 输入电平选择寄存器(ILSR)
该寄存器可以选择以下输入电平。
ILSR
输入电平
0x04
CMOS
0x00
迟滞
VIL
VIH
0.3 VCC
0.7 VCC
0.3 VCC
0.7 VCC
注意:只有 PDR0_P04 有此功能。
简介
4.2
本系统的 I/O 引脚可以分为两类:输出引脚和输入引脚。输出引脚用于输出高电压,输入引脚
用于扫描键盘状态。
4.2.1 如何设置输入引脚
如果引脚用作输入端口,数据方向寄存器的对应位应设置为“0”。
要设置外部连接源至高 Z 状态,请使用外部上拉或下拉电阻器或者设置上拉寄存器的对应
位。
输入模式有三种类型:数字输入、ADC 输入以及外围功能输入。
ƒ
数字输入表示该端口用作通用 I/O。
ƒ
ADC 输入表示该端口仅用作模拟输入。
ƒ
外围功能输入表示该端口被外围功能用作输入,例如外部中断输入。
4.2.2 如何设置输出引脚
输出模式有两种类型:数字输出和外围功能输出。
ƒ
数字输出表示该端口用作通用 I/O。
ƒ
外围功能输出表示该端口用作外围资源输出,例如 8/16 位多功能定时器的输出。
MCU-AN-500038-Z-10 - 第9页
使用矩阵的键盘开发 V1.0
第 4 章 资源使用
4.2.3 上拉寄存器
在输入模式下,P0 和 PG 端口可通过编程上拉寄存器(2.2.3)启用内部上拉电阻(大约
50KΩ,参见数据表了解其具体取值)。
初始值“0”断开与内部上拉电阻的连接。 烧写“1”至 PULx 寄存器的对应位启用电阻。
如果端口用作输出端口,寄存器位的值没有意义,上拉电阻被禁用。(例外:对于 I2C 引脚
SDA 和 SCL,设置保留。对于 UART 输出 SOT,如果不是由线路驱动器提供,则可以使用内
部上拉电阻。)
微型控制器处于停止或定时器模式下时,上拉电阻被禁用。
如果引脚用作 ADC 输入,电阻也被禁用。
如果外部引脚被外部总线接口使用,则不能使用内部上拉寄存器。
MCU-AN-500038-Z-10- 第10页
使用矩阵的键盘开发 V1.0
第 5 章 软件设计
5 软件设计
本章描述了如何使用矩阵设计键盘。
5.1
软件设计
要实现此功能,首先初始化 I/O 寄存器,并禁用 AD 输入,然后启用定时器中断消除抖动。 输
出 I/O 引脚输出高电压,MCU 等待输入信号。参见硬件电路,如果按键被按下,MCU 将扫描
该信息,并执行对应的按键功能。
流程图如下所示。
MCU-AN-500038-Z-10 - 第11页
使用矩阵的键盘开发 V1.0
第 5 章 软件设计
图 5-1: 使用矩阵设计键盘的流程图
MCU-AN-500038-Z-10- 第12页
使用矩阵的键盘开发 V1.0
第 6 章 代码示例
6 代码示例
本章描述了使用矩阵开发键盘的代码示例。
以下代码基于 MB2146-410-01 说明了如何使用 I/O 端口开发键盘功能。端口 0 用于检测按键
状态。输入默认级别为高。
/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS.
/* FUJITSU SEMICONDUCTOR ACCEPTS NO RESPONSIBILITY OR LIABILITY
/* FOR ANY ERRORS OR ELIGIBILITY FOR ANY PURPOSES.
/* (C) Fujitsu Semiconductor (Shanghai) Co., LTD.
/*-------------------------------------------------------------------/* Give a example for basic I/O matrix */
#include "../MB95200_IO/mb95200.h"
void timer_init(void)
{
T01DR = 0x13;
// 5000us
T00DR = 0x88;
TMCR0 = 0x10;
// 16-bit
T00CR0 = 0x81;
// interval timer with continuous mode
T00CR1 = 0xA0;
// disable output, start timer
}
/*P04 SCAN*/
void IO_restart(void)
// PDR0 restart
{
PDR0 = 0xFF;
}
void P04_low(void)
// Pin P04 begin to scan
{
PDR0_P04 = 0;
}
void Port_Value1(void)
// Read and store PDR0 in value 1
{
port_value1 = PDR0;
}
void Row_one_process(void) // key judge
{
port_value2 = PDR0; // Read and store PDR0 in value 2
if(port_value2 == port_value1)
{
switch(port_value2)
{
case 0xEE: SW1();
break;
case 0xED: SW2();
break;
case 0xEB: SW3();
break;
case 0xE7: SW4();
break;
}
}
}
/* P05 scan*/
void P05_low(void)
// Pin P05 begin to scan
{
PDR0_P05=0;
}
MCU-AN-500038-Z-10 - 第13页
*/
*/
*/
*/
*/
使用矩阵的键盘开发 V1.0
第 6 章 代码示例
void Row_two_process(void)
// key judge
{
port_value2 = PDR0;
if(port_value2 == port_value1)
{
switch(port_value2)
{
case 0xDE: SW5();
break;
case 0xDD: SW6();
break;
case 0xDB: SW7();
break;
case 0xD7: SW8();
break;
}
}
}
/* P06 scan*/
void P06_low(void)
// Pin P06 begin to scan
{
PDR0_P06=0;
}
void Row_three_process(void)
// key judge
{
port_value2 = PDR0;
if(port_value2 == port_value1)
{
switch(port_value2)
{
case 0xBE: SW9();
break;
case 0xBD: SW10();
break;
case 0xBB: SW11();
break;
case 0xB7: SW12();
break;
}
}
}
/* P07 scan*/
void P07_low(void)
// Pin P07 begin to scan
{
PDR0_P07=0;
}
void Row_four_process(void)
// key judge
{
port_value2 = PDR0;
if(port_value2 ==port_value1)
{
switch(port_value2)
{
case 0x7E: SW13();
break;
case 0x7D: SW14();
break;
case 0x7B: SW15();
break;
case 0x77: SW16();
break;
}
}
MCU-AN-500038-Z-10- 第14页
使用矩阵的键盘开发 V1.0
第 6 章 代码示例
void SW1(void)
// Key Process
{
. . .
}
. . .
. . .
void SW16(void)
{
. . .
}
. . .
__interrupt void Timer_Interrupt (void) //key scan process
{
T00CR1_IF=0;
timer_counter++;
if(timer_counter==0)
// PDR0 restart
{
IO_restart();
}
if(timer_counter==4)
// P04 begin to scan
{
P04_low();
}
if(timer_counter==5)
// Read and store PDR0
{
Port_Value1();
}
if(timer_counter ==9)
// Read and store PDR0 and judge keypressed
{
Row_one_process();
}
if(timer_counter==10)
// PDR0 restart
{
IO_restart();
}
if(timer_counter==14)
// P05 begin to scan
{
P05_low();
}
if(timer_counter==15)
// Read and store PDR0
{
Port_Value1();
}
if(timer_counter==19)
// Read and store PDR0 and judge keypressed
{
Row_two_process();
}
if(timer_counter==20)
// PDR0 restart
{
IO_restart();
}
if(timer_counter==24)
// P06 begin to scan
{
P06_low();
}
if(timer_counter==25)
// Read and store PDR0
{
Port_Value1();
}
MCU-AN-500038-Z-10 - 第15页
使用矩阵的键盘开发 V1.0
第 6 章 代码示例
if(timer_counter==29) // Read and store PDR0 and judge keypressed
{
Row_three_process();
}
if(timer_counter==30) // PDR0 restart
{
IO_restart();
}
if(timer_counter==34) // P07 begin to scan
{
P07_low();
}
if(timer_counter==35) // Read and store PDR0
{
Port_Value1();
}
if(timer_counter==39) // Read and store PDR0 and judge keypressed
{
Row_four_process();
}
if(timer_counter==40) // PDR0 restart
{
IO_restart();
}
if(timer_counter>=41) // Timer_counter restart
{
timer_counter=0;
}
}
void clock_Select(void)
{
SYCC = 0x00;
WATR = 0x00;
STBC = 0x01;
SYCC2= 0xF4;
}
void main(void)
{
InitIrqLevels();
__EI();
timer_counter =0;
DDR0 = 0xF0;
AIDRL = 0xFF;
clock_Select();
timer_init();
while(1);
//P00~P03= in P04~P07=out
//Port input enable
//Main clock select
//Timer initialize
}
MCU-AN-500038-Z-10- 第16页
使用矩阵的键盘开发 V1.0
第 7 章 性能评估
7 性能评估
如上所述,消除抖动的方法有两种:硬件法和软件法。尽管硬件法的代码非常简单,仅使用定
时器计时器的效果并不好,因为系统不能扫描沿。比较起来,软件方法更加有用。
MCU-AN-500038-Z-10 - 第17页
使用矩阵的键盘开发 V1.0
第 8 章 更多信息
8 更多信息
关于富士通半导体更多的产品信息,请访问以下网站:
英文版本地址:
http://www.fujitsu.com/cn/fsp/services/mcu/mb95/application_notes.html
中文版本地址:
http://www.fujitsu.com/cn/fss/services/mcu/mb95/application_notes.html
MCU-AN-500038-Z-10- 第18页
使用矩阵的键盘开发 V1.0
第 9 章 附录
9 附录
图 2-1: 使用矩阵设计键盘的电路 ........................................................................................... 6
图 3-1: 抖动消除的时序图 ...................................................................................................... 7
图 5-1: 使用矩阵设计键盘的流程图 ..................................................................................... 12
MCU-AN-500038-Z-10 - 第19页