打印

转载的4X4键盘资料

[复制链接]
1632|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyy_2002|  楼主 | 2009-4-29 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转载的4X4键盘资料
原贴地址 
http://forum.**/FORUM_POST_72_24279_0.HTM

完整请看附件
在AT8?S52单片机上连接矩阵键盘
本文说说矩阵键盘和51单片机连接的情况。先说下独立键盘的应用。
当一个单片机系统只需要少量的键盘的时候 用简单的独立键盘最好 见下图
比如说按一个键亮一个灯就可以这样搞 如果说真的要求就这么简单 其实连单片机也可以省了 我自己感觉哈 学会用单片机的时候 就开始不喜欢用以前的电路啦 老是有一种单片机可以搞定所有问题的感觉 其实这样不好 但是单片机确实很“万能”
但是当系统需要比较多的键盘时 采用矩阵键盘就比较方便 见下图
常见的遥控器 大楼安保密码键盘 保险柜的键盘 电话机的键盘 手机键盘 上网聊QQ的键盘 等等等等 都是这样的
4x4矩阵键盘检测按键的方法是
先拉低第一行的电平,检测1~4列有无键按下 如有返回键值 如无看下行
再拉低第二行的电平,检测1~4列有无键按下 如有返回键值 如无看下行
先拉低第三行的电平,检测1~4列有无键按下 如有返回键值 如无看下行
再拉低第四行的电平,检测1~4列有无键按下 如有返回键值 如无则返回无键按下
下面出个检测矩阵键盘的函数秀秀哈(主函数略过)
采用最原始的想法哈 (除特殊说明外本资料里面程序均调试正常工作)
 
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键ASC值 若无返回 0
{
   
}
希望新入行的兄弟上机试一下这段函数 可以配个LCD来做显示 也可以用串口发回电脑显示 否则光是看看印象不会很深的 严重不建议简单电路使用软件仿真 还是要 搭板子 编程 烤片 试验的
上面函数是直接把 矩阵键盘检测按键的方法 翻译成C程序的 这样直接做当然是有很多问题的 但是在拿到一个问题后不知道如何程序化的前提下 不妨就这样先直译 译完了 再确定 功能是否实现 功能是否有缺陷 如何改良 。
上面的函数 功能是实现了 但是有2个致命的缺陷 (试过程序就知道)
1 没有键盘消抖和松手检测
2 代码过长
关于没有键盘消抖和松手检测的现象我不想多说了 请试下就知道效果了
说说如何在上步程序的基础上加上
请看改良过1次的函数

void Delay(unsigned int Time)//新添加的延时函数
{
 unsigned char t;
 while(Time--)
 {
  for(t=0;t<100;t++);
 }
}
 
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键ASC值 若无返回 0
{
 
   
}
这次试机的时候发现按一个键出1个字了吧(当然键盘不能超抖)
嘿嘿 程序就是这样调试的 先把功能搞出来 然后根据毛病再改良 老手也是这样来的 新人更是如此 慢慢来 不要再不熟悉的情况下追求完美 会晕的 另外提下 程序这种东西永远没有最完美 只有更完美 当你深深的感觉到 你编的程序在某种情况下是为了弥补硬件上的缺陷的时候 那恭喜你 你就大概齐明白了为啥要用程序驱动电路了 呵呵  
这样做了以后 上面红字第1个的毛病就克服了 但是更突出的是第2行红字的毛病了 咱们再改 
细看程序 能发现程序中有很多一样或者相似的内容 具体的暂时先表管 只要是有这个感觉就好办 以后别的函数也一样哈 先要有这个感觉 然后再细细琢磨你的感觉 我告诉大家只要是有重复的东西就可以用循环搞定的 这也是简化代码的最直接办法
另外再扯点别的阿 计算机是计算的 有些时候 越是那种类似于1+2+3+1000 之类的问题越是要交给计算机算 不要人算 要知道 它算得比人快N倍 
就说加法这个问题 如果按照人正常的想法 程序是这样编的
void ADD1_1000(void)//(此段函数未调试 只是说明问题)
{
 unsigned int sum;
 sum=1+2+3+4+5+......1000;
}
这样写是会死人的 要么累死 要么被老大秒杀 看看下面的
void ADD1_1000(void) //(此段函数未调试 只是说明问题)
{
 unsigned int sum,i;
 while(i!=1001)
 {
  sum=sum+i;
  i++;
 }
}
比较老实的弄法 有学生的风格 下面看个玩得更拽的
void ADD1_1000(void) //(此段函数未调试 只是说明问题)
{
 unsigned int sum,i;
 while(i!=1001)
 {
  sum+=(i++);
 }
}
其实和第2个是一个东西 只是压缩了一行 其实不建议这样压缩的 这样做完了 只能是程序的可读性下降了(对于新人) 其他的好处不是很大 咱们以后也是阿 有时候是需要玩下拽的(即特殊的时候) 但平时工作能老老实实就老老实的比较好 毕竟写完的程序还是自己粘的时候比较多
再说了 以后编程很可能是论行算钱的 就更没有必要压缩这些不需要压缩的行了 但是如果咱们的Key_Scan()函数不压缩的话基本类似第一个加法函数也会被老大秒杀的 这都扯到哪里了 言归正传哈

咱们再说说这个键盘哈 万变不离上面的紫色的内容 因为那是基本思想 但是发现再咱们检测按键的时候只是检测了P10~P13的内容 其他的咱们不用管的 高位咱们依次送出的是 e,d,b,7 (在扯的里面再嵌套一些扯的 有些个数字是需要咱们敏感的 咱先不说是把2进制数背的滚瓜烂熟 咱又不是计算机 但是看到0xfe的时候要立马有一个只亮一盏灯的概念 不是说算了10分钟才能闹明白的 就说键盘这里 常用的就是0xf0和0x0f一看就得知道是前一半和后一半的关系 还有诸如 看到e,d,b,7 就要有一种3个1和1个0的掺和的想法 )知道了这个咱们就可以压缩代码 看看下面的函数 少了很多 用1个for循环解决的问题。值得说的就是很好的用了变量i的次数和case后面的常量 确定一个键值
unsigned char Key_Scan(void)//键盘扫描函数 如果有键按下返回键1-15 若无返回 'E'
{
 
}
看看咱们这个程序是如何压缩代码的 对比着上面的看 是不是很袖珍了 代码压缩也是一门艺术 不能随便乱压 这个键盘扫描的函数可以存在电脑里面了 以后再需要键盘扫描的时候直接贴上改改就可以了 所以编程就是很多大虾说的Ctrl+C 和 Ctrl+V 嘿嘿
好了键盘的事情先就罗嗦到这里了 强烈建议新人一定要做硬件试验来巩固知识 切忌看看程序就了事
好了 留4个作业题
1如何能判断每个键按下的时间??因为这个特别是在键盘特别少的情况下 一个键按下时间的长短 代表的意思是不同的。(要编程的思想或者程序)
2 如果单片机只有 P10,P11俩个端口的时候 你能想到最多能连接多少键盘??
(要电原理图和编程思想或者程序)
3如何在键盘被按下时才通知主函数或者处理键盘输入的数据 而平时不需要一直扫描键盘 
(要电原理图和编程思想或者程序)
4如何在键盘少的情况下(比如3个按键)开发按键的第2功能(比如某表中有三个键 SET UP DOWN       SET键按1次秒闪 2次分闪 3次时闪  UP DOWN是谁闪调谁)
(编程思想或者程序)
以上4道作业题欢迎大家交作业哈 2周后 咱们开新贴讨论这4道题

有问题 意见 建议 等等请发邮件    unifax@163.com



http://forum.**/FORUM_POST_72_24279_0.HTM
附件在那个BBS 里面 我烤不过来 请去那个论坛下载 另外请告诉我 怎样上传附件?




相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝