智能键盘设计方案.docx
《智能键盘设计方案.docx》由会员分享,可在线阅读,更多相关《智能键盘设计方案.docx(47页珍藏版)》请在冰豆网上搜索。
智能键盘设计方案
1.引言
随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展,犹如雨后春笋般的变化。
电子产品的更新速度快就不足惊奇了。
计算器在人们的日常中是比较的常见的电子产品之一。
可是它还在发展之中,以后必将出现功能更加强大的计算器,基于这样的理念,本次设计是用单片机来设计的四位数计算器。
该设计系统是以spce061A为单片机,外接4X4的键盘,通过键盘扫描来对输入数的控制,在IOA0-IOA7口,驱动电路。
用来保证LED的工作正常。
键盘按其接线方法有:
直接式键盘、行列式键盘(又称矩阵键盘)、串转并键盘等;在本设计中,采用4X4的行列式键盘,即键盘排列为4行、4列,共16个按键。
2.智能键盘简介
行列式键盘又叫矩阵式键盘。
用i/o口线组成行、列结构,按键设置在行列的交点上。
4×4行列结构可构成16个键的键盘。
因此,在按键数量较多时,可以节省i/o口线。
本设计将介绍4×4行列式键盘的扩展输入,并且通过单片机的端口输出驱动发光极管进行显示,另外还会介绍通用可编程的键盘。
本设计的主要功能模块如下:
·单片机系统:
实现61单片机对4×4行列式键盘的控制,查看按键状态的变化,判断是否有按键按下,并由按下的键来控制led显示:
·外围电路:
实现单片机与4×4行列式键盘的电路接口;
·61程序:
编写61单片机和4×4行列式键盘的接口程序,实现对按下的键的识别和显示。
4×4行列式键盘的扩展和可编程的键盘、单片机spce061A芯片的原理和使用方法比较复杂。
本设计将体现其原理和应用。
·了解4×4行列式键盘的结构及原理;
·掌握4×4行列式键盘的电路及应用
2.2智能键盘开发意义
智能键盘要想走向实用,必须拥有能胜任的智能系统、可靠的按键系统、精确的确认能力,并具有既方便又实用的与人一起工作的能力。
智能键盘的职能指标为自主性、适应性和交互性。
自主性是指键盘能根据工作任务和周围环境情况,自觉确定工作步骤和工作方式;适应性是指键盘具有适应复杂工作环境的能力,不但能确切认为的物体,还有理解周围环境和所要执行任务的能力,并做出正确的判断及操作的能力;交互性智能产生的基础,交互包括智能键盘与环境、智能键盘与人以及按键之间的信息交互,主要涉及信息的获取、处理和理解。
2.3智能键盘发展趋势
现今单片机所制作的键盘可以实用于多个方面,就拿制作的运用于电脑方面的键盘来看看其发展的趋势。
目前传统的台式机键盘仍然是市场上的主流,但无论是外观还是技术,它同数年前的产品比起来,并没有本质的区别。
随着生活品质的提高,厚重的台式机键盘与时尚而又健康的液晶显示器、灵巧而又舒适的光电鼠标显得越来越格格不入。
传统台式机键盘采用的是轨道直滑式构架,虽然按键的键程比较长,按键的手感比较好,但是由于构架本身的缺陷,输入文字时声音比较大。
我们以罗技易上手键盘为例,它的按键手感不错,并采用了静音设计,不过用户输入文字时的声音仍然稍微有些大,长时间使用后,比较容易感到手指疲劳。
它的外观虽然增加了一些曲线,仍然不够时尚。
现在越来越多的用户已经不满足于传统台式机键盘,他们开始将目光转向其它类型键盘。
笔记本架构键盘虽然不是2003年才出现的,但是却在2003年大大的风光了一把。
这类键盘的一致特点就是轻薄小巧、外观时尚。
不少用户都选择笔记本架构键盘来搭配上液晶显示器,这样整个桌面会显得简洁而又时尚。
在按键方面,它们采用了笔记本键盘的构架。
按键不会因为敲击力度不均或敲击位置不对而导致键帽倾斜,更不会出现卡键的现象,同时按键的力度比较小,用户长时间输入也不容易感到疲劳。
在静音方面,笔记本架构键盘设计得相当不错,用户输入文字时的声音要比传统台式键盘小得多。
以爱国者的8231笔记本架构键盘来说,它以轻薄时尚的外观吸引了不少消费者,输入文字时的声音很小,适合用户长时间输入也都是它吸引消费者的亮点。
为了缩小体积,这类键盘去掉了数字小键盘,不过好在笔记本架构键盘通常都配备了一个PS/2接口,用户可以连接一个专门的数字小键盘,但是笔记本键盘的布局也与传统台式机键盘布局有些区别,用户最初使用时可能会感到很不习惯。
另外笔记本架构键盘的键程都很短,敲击时远没有传统台式键盘有手感。
不过随着笔记本的普及,越来越多的用户会更加适应笔记本架构键盘的布局和键程,所以我们相信笔记本架构键盘也会越来越受欢迎。
这里笔者提醒一下,部分厂商推出的笔记本架构键盘仍然采用传统台式机键盘的轨道直滑式构架,这种键盘除了外观稍微小巧一点以外,没有任何技术上的优势,所以用户在选择笔记本架构键盘时,最好选择名牌大厂的产品。
除了笔记本架构键盘以外,X构架键盘也开始受到越来越多用户的关注。
这类键盘采用了类似于笔记本键盘的构架,但是增加了按键键程,并采用了标准的台式机键盘布局。
按键在增加键程以后,形成一个明显的“X”形,这也就是它得名的原由。
这种X构架综合了笔记本架构键盘和传统台式机键盘的优势,相信会成为未来市场上的一个热点。
我们这里以明基的X构架黑色海湾为例,它相比传统台式机键盘要薄得多,按键的键程介于传统台式机键盘和笔记本架构键盘之间,但是使用起来和传统台式机键盘的手感一样棒。
尤其值得一提的是,基于X构架的按键不会像传统台式机键盘一样容易松动,更不会出现卡键的情况。
这款键盘采用了传统台式机键盘的布局,台式机用户能很快适应,但是这也带来另一个问题就是键盘体积较大。
好在明基采用了精巧的流线形设计,整个键盘丝毫不显得笨重。
无论是搭配液晶显示器还是CRT显示器,都是一个不错的选择。
随着个人电脑的普及,越来越多的用户开始追求时尚与健康,大家对键盘的选择也越来越挑剔。
我们相信在2004年里,越来越多的用户会选择更时尚也更健康的笔记本架构键盘或X构架的键盘,而放弃笨重的传统台式机键盘,我们也期待在2004年能看到更多更有新意的键盘上市。
3智能键盘的制作
3.1智能键盘方案的论证及选择
车体的方案有两个,一是1x8的按键体,二是4x4的按键体。
由于对1x8键盘过于简单性,其占用的接口资源过与浪费,还有其实用性不是很强。
所以我选择了4x4的键盘,这占用的接口资源合理,而且可以适用于多方面的应用。
3.2智能键盘体
我将按照所设计的电路图,在一块万用板分别焊接spce061A芯片及其相应的外围电路、按键体的连接、电源模块、输出模块,其中所运用的原件较为简单,芯片相对复杂,在焊接的时候是特别小心的在进行。
如图图3-0:
图3-0:
44X4键盘扫描原理
4.1电路及连接
4X4键盘的电路连线如图4-0所示,分别定义这16个按键盘的键值为1~16。
单片机与该电路连接时,使用4个端口作为输出口,接4条行扫描线;使用4个端口作为输入口,接4条列扫描线;在此介绍中,使用SPCE061A的IOA0~7这8个端口作4X4键盘的扫描,IOA0~3接行扫描线,IOA4~7接列扫描线。
图4-04X4键盘电路接线图
如上图中,IOA0~3设置为输出口,接行扫描线;IOA4~IOA7设置为带下拉电阻的输入口,接列扫描线。
4.2基本的扫描原理
行列式键盘的操作一般完成两个任务,一是检测是否有键被按下,二是识别被按下的键是哪一个。
一般会采用行列扫描法,可以同时完成上述两项任务。
基本的扫描原理是:
先使行扫描线全部输出高电平,然后读取列扫描线的状态,得到与按键横向位置对应的4位列码;如果有键被按下,则对应的列扫描线必然会被读回高电平,如果无键按下,则读取的列码必定全是0(低电平)。
这也就可以判断有无按键的按下了。
4.3延时消抖
一旦检测到有键按下时,还需要有一个延时消抖操作,以消除按键时带有的抖动信号;一般延时在15ms左右即可。
延时后,如还能检测到有按键按下,则可确定当前是有键按下,可进入获取键值的操作。
4.4按键步骤及实现方法
获取键值时,采用行列依次扫描的方法。
首先使第一行扫描线输出高电平,其它的行扫描线输出低电平,然后读取列扫描线的状态,得到列码;如果本行无键按下,则得到的列码为全0,并扫描下一行;如本行有键按下,则会读取到对应的列码值,并退出扫描,进行键值计算。
当第一行扫描没有检测到按键时,则扫描第二行,即置第二行扫描线输出高电平,其它行扫描线输出低电平,其它与前面所述类似。
在行列扫描时,可以用一个变量记录下当前扫描的行号,在计算键值时,可以利用此行号以及读回的列码得知是哪一行、哪一列上的按键按下了。
如:
当S5按下时,应该检测出第二行扫描时读取到有效的列码0001(IOA7~4)。
凌阳16位系列单片机的实验设备,能最大程度的激发学生学习单片机的兴趣,巩固单片机的知识,从而达到事半功倍的效果。
它大致分为软件部分和硬件部分,两者相辅相成,互为补充。
软件为硬件提供编译环境、代码下载、通信软件等;硬件是软件代码的功能实现。
实验仪具备如下功能:
1.CPU为凌阳SPCE061A16位SOC单片机。
2.采用动态扫描方式驱动1×8键盘、4位8段数码管、8个LED灯。
3.5V/3.3V可选I/O输出电压。
4.一路0~3.3V可调模拟电压,可方便地完成AD的数据采集实验。
5.RS232接口,可直接与计算机进行通信,或者进行单片机之间的双机通信。
6.SIO接口扩展存储芯片SPR4096,扩展4MBitsFlash或者32KBitsSRAM的扩展存储空间。
7.USB接口,提供完整的单片机通讯程序、上位机驱动程序及应用范例。
8.带背光的128×64点阵液晶,自带驱动芯片SPLC501,它采用了最新的COG技术使驱动和液晶合二为一。
9.两路音频输出电路,采用凌阳功放芯片SPY0030A,通过它可以体验
SPCE061A给您带来的听觉效果。
10.MIC输入电路,配合SPCE061A内置的AGC和OPI电路,可获得不错的语音数据。
11.PROBE∕EZ_PROBE两种在线下载、编程、调试模式。
12.提供所有外围电路的原理图、IDE环境下的40个实验的源代码,还提供了方便快捷的网络支持,所以我们选择了SPCE061A单片机作为本次毕业设计智能键盘的控制芯片。
如图5-0:
图5-0
流程图如图6-0:
图6-0
6.2IO单独操作函数库
#ifndef__EASY_h__
#define__EASY_h__
//**********************************************************************
//IO单独操作函数库
//可以对每一个端口单独进行操作,不影响其他端口
//此库调用系统库里关于IO的API函数编写,所以调用此库前,必须保证系统IO端口
//API函数已加载
//WrittenbyFantasy_Ma
//************************************************************************
unsignedintA=1;
unsignedintB=2;
//**********单独设置I/O的Direction信息***********
voidSet_IO_Dir(unsignedintx,unsignedinty,unsignedintz)
{
if(x==1)
{
switch(y)
{
case0:
if(z==1)*P_IOA_Dir|=0x0001;
if(z==0)*P_IOA_Dir&=0xfffe;
break;
case1:
if(z==1)*P_IOA_Dir|=0x0002;
if(z==0)*P_IOA_Dir&=0xfffd;
break;
case2:
if(z==1)*P_IOA_Dir|=0x0004;
if(z==0)*P_IOA_Dir&=0xfffb;
break;
case3:
if(z==1)*P_IOA_Dir|=0x0008;
if(z==0)*P_IOA_Dir&=0xfff7;
break;
case4:
if(z==1)*P_IOA_Dir|=0x0010;
if(z==0)*P_IOA_Dir&=0xffef;
break;
case5:
if(z==1)*P_IOA_Dir|=0x0020;
if(z==0)*P_IOA_Dir&=0xffdf;
break;
case6:
if(z==1)*P_IOA_Dir|=0x0040;
if(z==0)*P_IOA_Dir&=0xffbf;
break;
case7:
if(z==1)*P_IOA_Dir|=0x0080;
if(z==0)*P_IOA_Dir&=0xff7f;
break;
case8:
if(z==1)*P_IOA_Dir|=0x0100;
if(z==0)*P_IOA_Dir&=0xfeff;
break;
case9:
if(z==1)*P_IOA_Dir|=0x0200;
if(z==0)*P_IOA_Dir&=0xfdff;
break;
case10:
if(z==1)*P_IOA_Dir|=0x0400;
if(z==0)*P_IOA_Dir&=0xfbff;
break;
case11:
if(z==1)*P_IOA_Dir|=0x0800;
if(z==0)*P_IOA_Dir&=0xf7ff;
break;
case12:
if(z==1)*P_IOA_Dir|=0x1000;
if(z==0)*P_IOA_Dir&=0xefff;
break;
case13:
if(z==1)*P_IOA_Dir|=0x2000;
if(z==0)*P_IOA_Dir&=0xdfff;
break;
case14:
if(z==1)*P_IOA_Dir|=0x4000;
if(z==0)*P_IOA_Dir&=0xbfff;
break;
case15:
if(z==1)*P_IOA_Dir|=0x8000;
if(z==0)*P_IOA_Dir&=0x7fff;
break;
}
}
if(x==2)
{
switch(y)
{
case0:
if(z==1)*P_IOB_Dir|=0x0001;
if(z==0)*P_IOB_Dir&=0xfffe;
break;
case1:
if(z==1)*P_IOB_Dir|=0x0002;
if(z==0)*P_IOB_Dir&=0xfffd;
break;
case2:
if(z==1)*P_IOB_Dir|=0x0004;
if(z==0)*P_IOB_Dir&=0xfffb;
break;
case3:
if(z==1)*P_IOB_Dir|=0x0008;
if(z==0)*P_IOB_Dir&=0xfff7;
break;
case4:
if(z==1)*P_IOB_Dir|=0x0010;
if(z==0)*P_IOB_Dir&=0xffef;
break;
case5:
if(z==1)*P_IOB_Dir|=0x0020;
if(z==0)*P_IOB_Dir&=0xffdf;
break;
case6:
if(z==1)*P_IOB_Dir|=0x0040;
if(z==0)*P_IOB_Dir&=0xffbf;
break;
case7:
if(z==1)*P_IOB_Dir|=0x0080;
if(z==0)*P_IOB_Dir&=0xff7f;
break;
case8:
if(z==1)*P_IOB_Dir|=0x0100;
if(z==0)*P_IOB_Dir&=0xfeff;
break;
case9:
if(z==1)*P_IOB_Dir|=0x0200;
if(z==0)*P_IOB_Dir&=0xfdff;
break;
case10:
if(z==1)*P_IOB_Dir|=0x0400;
if(z==0)*P_IOB_Dir&=0xfbff;
break;
case11:
if(z==1)*P_IOB_Dir|=0x0800;
if(z==0)*P_IOB_Dir&=0xf7ff;
break;
case12:
if(z==1)*P_IOB_Dir|=0x1000;
if(z==0)*P_IOB_Dir&=0xefff;
break;
case13:
if(z==1)*P_IOB_Dir|=0x2000;
if(z==0)*P_IOB_Dir&=0xdfff;
break;
case14:
if(z==1)*P_IOB_Dir|=0x4000;
if(z==0)*P_IOB_Dir&=0xbfff;
break;
case15:
if(z==1)*P_IOB_Dir|=0x8000;
if(z==0)*P_IOB_Dir&=0x7fff;
break;
}
}
}
//**********单独获取I/O的Direction信息***********
unsignedintGet_IO_Dir(unsignedintx,unsignedinty)
{
unsignedinta;
if(x==1)
{
switch(y)
{
case0:
a=*P_IOA_Dir&0x0001;
if(a==0)returna;
elsereturn1;
case1:
a=*P_IOA_Dir&0x0002;
if(a==0)returna;
elsereturn1;
case2:
a=*P_IOA_Dir&0x0004;
if(a==0)returna;
elsereturn1;
case3:
a=*P_IOA_Dir&0x0008;
if(a==0)returna;
elsereturn1;
case4:
a=*P_IOA_Dir&0x0010;
if(a==0)returna;
elsereturn1;
case5:
a=*P_IOA_Dir&0x0020;
if(a==0)returna;
elsereturn1;
case6:
a=*P_IOA_Dir&0x0040;
if(a==0)returna;
elsereturn1;
case7:
a=*P_IOA_Dir&0x0080;
if(a==0)returna;
elsereturn1;
case8:
a=*P_IOA_Dir&0x0100;
if(a==0)returna;
elsereturn1;
case9:
a=*P_IOA_Dir&0x0200;
if(a==0)returna;
elsereturn1;
case10:
a=*P_IOA_Dir&0x0400;
if(a==0)returna;
elsereturn1;
case11:
a=*P_IOA_Dir&0x0800;
if(a==0)returna;
elsereturn1;
case12:
a=*P_IOA_Dir&0x1000;
if(a==0)returna;
elsereturn1;
case13:
a=*P_IOA_Dir&0x2000;
if(a==0)returna;
elsereturn1;
case14:
a=*P_IOA_Dir&0x4000;
if(a==0)returna;
elsereturn1;
case15:
a=*P_IOA_Dir&0x8000;
if(a==0)returna;
elsereturn1;
}
}
if(x==2)
{
switch(y)
{
case0:
a=*P_IOB_Dir&0x0001;
if(a==0)returna;
elsereturn1;
case1:
a=*P_IOB_Dir&0x0002;
if(a==0)returna;
elsereturn1;
case2:
a=*P_IOB_Dir&0x0004;
if(a==0)returna;
elsereturn1;
case3:
a=*P_IOB_Dir&0x0008;
if(a==0)returna;
elsereturn1;
case4:
a=*P_IOB_Dir&0x0010;
if(a==0)returna;
elsereturn1;
case5:
a=*P_IOB_Dir&0x0020;
if(a==0)returna;
elsereturn1;
case6:
a=*P_IOB_Dir&0x0040;
if(a==0)returna;
elsereturn1;
case7:
a=*P_IOB_Dir&0x0080;
if(a==0)returna;
elsereturn1;
case8:
a=*P_IOB_Dir&0x0100;
if(a