lcd1602矩阵键盘输入行列公用同一IO口输入问题

查看: 781|回复: 1
矩阵键盘任意io实现
本帖最后由 cafppla 于
14:37 编辑
矩阵键盘是大家经常使用的一种输入方式,但是一般常见的程序都是要求一组io口来驱动,有时候我们用下图这种键盘和单片机的时候,io有时候不全,或者位置不合适,
(WGLX3TWHMN~%ZC~VZXFQ1C.png (79.03 KB, 下载次数: 0)
14:20 上传
A5YXAJQK1C6{]XTE6VQBB.png (29.93 KB, 下载次数: 0)
14:20 上传
那我们的硬件走线就比较麻烦,现在介绍一种矩阵键盘的写法,可以随意就近接线,方便布线。举例3X4的矩阵键盘,列出示意代码,可以很方便扩展。sbit row0 = P1 ^ 1;
sbit row1 = P1 ^ 2;
sbit row2 = P1 ^ 3;
sbit row3 = P1 ^ 4;
sbit col0 = P3 ^ 2;
sbit col1 = P3 ^ 3;
sbit col2 = P3 ^ 6;
uint8 KeyDown(void)
{
&&col0=0; col1=0; col2=0;& && && && && && && & // 列线全部置低
& & if((row0==0) || (row1==0) || (row2==0) || (row3==0) )& &&&// 若有任一行线读回状态为低
& &{
& &&&Delay(80);& && && && && && && && && && && & & &
& && && &if((row0==0) || (row1==0) || (row2==0) || (row3==0) )&&// 再次读行线状态,若有任一行线读回状态为低
& && & return 1;& && && && && & // 返回1,表明有键盘按下
& &&&
& & & &&&else
& && & return 0;& && && && && && & // 返回0,表明无键盘按下
& & & && &
&&}
&&else
& & return 0;& &
uint8 KeyUp(void)
{
&&col0=0; col1=0; col2=0;& && && && && && && && &&&// 列线全部置低
if((row0==1) && (row1==1) && (row2==1) && (row3==1) )& &&&// 若全部行线读回状态都为高
& &{
& &&&Delay(80);& && && && &&&// 延时消抖
& && & & && &if((row0==1) && (row1==1) && (row2==1) && (row3==1) )&&// 再次读行线状态,若全部行线读回状态都为高
& && & return 1;& && && && && &// 返回1,表明所有键盘都处于弹起状态
& &&&else
& && & return 0;& && && && & // 返回0,表明有键盘处于按下状态
& &}
&&else
& & return 0;
}
uint8&&KeyNum(void)
{
&&uint8 KeyT
&&KeyTemp=0;
&&if(KeyDown()==1)& && && && && && && && && && && && && &&&// 若键盘被按下
& &{
& &&&col1=0; col2=1; col2=1;& && && && &// 将列线1置低,其他列线置高
& &&&if (row0==0) KeyTemp=1;& && && &&&
& &&&if (row1==0) KeyTemp=2;& && && && &
& &&&if (row2==0) KeyTemp=3;& && && && &
& &&&if (row3==0) KeyTemp=4;& && && && && &&&
&&col0=1; col1=0; col2=1;& && && && &// 将列线1置低,其他列线置高
& &&&if (row0==0) KeyTemp=5;& && && && &
& &&&if (row1==0) KeyTemp=6;& && && && &
& &&&if (row2==0) KeyTemp=7;& && && && &
& &&&if (row3==0) KeyTemp=8;& && && &&&
& && && && &
&&col0=1; col1=1; col2=0;& & // 将列线2置低,其他列线置高
& &&&if (row0==0) KeyTemp=0;& && && && &
& &&&if (row1==0) KeyTemp=10;& && && &&&
& &&&if (row2==0) KeyTemp=11;& && && &&&
& &&&if (row3==0) KeyTemp=12;& && && && && && &
& &&&while ( KeyUp()==1);& && && && && & // 等待按下的键盘被释放&&
& &&&return KeyT& && && && && && && &// 返回被按下并被释放的键盘的编号
& & }
&&else& & & &
&&& & & && &
& && &return 0;& && && &&&//表示无按键按下
}复制代码至于扩展成别的比如3X5或者4X4,大家可以试试
定义2个数组,把row0..n和col0..m放进去,通过for循环来遍历,才能实现通用……
Powered by豆丁微信公众号
君,已阅读到文档的结尾了呢~~
dsp io空间 dsp io速度 矩阵键盘 矩阵式键盘 矩阵键盘原理图 通用矩阵 矩阵键盘原理 通用电气矩阵 矩阵键盘扫描程序 矩阵键盘扫描
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
关于DSP通用IO口做矩阵键盘
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口51单片机,在做矩阵键盘(行列式键盘)的时候,IO口选择不同,按键按下时,相应IO口读入电平也不同,为什么_百度知道
51单片机,在做矩阵键盘(行列式键盘)的时候,IO口选择不同,按键按下时,相应IO口读入电平也不同,为什么
做矩阵键盘实验的时候发现,如果矩阵键盘I0口选用P3口,任意按键按下时,相应IO端口电平变为高电平1。。当选用P1口的时候,任意按键按下,相应的IO端口电平变为低电平0。。。
这种情况是怎么回事??
求高手解答。。。好加分。。。
乱喷和胡乱推测的,请...
我有更好的答案
矩阵键盘常用开发方法是行列反转法,不知道你是怎么开发的
一般如果是4*4的键盘的话、一般扫描是行全为1、列逐行为0、通过检测哪一行为0、则该行和对应的为0列嗦确定的键就按下;
为您推荐:
其他类似问题
您可能关注的内容
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。备战蓝桥杯(单片机开发组)-独立按键与矩阵键盘~其他部分后续更新今年大二电气工程及其自动化的学生,但是对强电什么的并不感兴趣,当年报这个专业就是冲这后面自动化仨字去的hhhh。
自己对嵌入式和物联网比较感兴趣(特别希望有一天能通过科技改变人们的生活方式),所以在大一的时候就自己买了51的开发板,因为这个单片机的课程到大二下学期才开,所以只能自己自学,期间断断续续歪歪扭扭也走了不少弯路,刚好来年三月份有个蓝桥杯比赛,准备之余顺便总结下,帮助自己更好的学习,也希望能对看到这篇文章的人有所帮助吧hh。这篇文章用程序框图的方式替代程序代码,主要是自己对于一个应用模块的程序框架的总结,并不适合新手入门,如果想要开始学习mcu的话还是先看看书和视频。如有错误还请大家耐心指出,谢谢(∩_∩)正文开始:
键盘的应用:1,编码键盘。即键盘上闭合键的识别由专用的硬件编码器实现,如计算机的键盘。 2,非编码键盘。靠软件编程来识别。 单片机上用到的独立按键,矩阵键盘就是非编码键盘。
一,独立按键。
这个图大家可能会出现的疑问:问:为何先检测按键是否释放再执行任务?答:因为一般用键盘的情况是,每按一次键,就执行一次(比如每按一次数码管+1),所以如果不进行按键释放检测的话很有可能按一次加好几个数,不准确。问:为何执行完任务时又会回到开始的地方?答:因为键盘这个东西不能只是按第一次有效,而再按就不管用了吧。所以键盘程序一般写在一个大while(1)循环中一直检测是否有按键按下,这样每当有按键按下的时候都能有响应。问:检测按键是否释放也要加去抖吗?答:一般来说其实是不用的,很多例程里面也没有这一步,但有时为了更准确还是加上去抖比较好。注意:去抖程序太多会让主机等待太久,可以适当缩短去抖持续时间。二,矩阵键盘很多讲解矩阵键盘的都是采用行列扫描法,虽然好理解,但步骤太过反锁,4x4的键盘需要扫描四次才行,不太实用。所以可以采用反转扫描法,这样只需正反两次扫描即可,而且还可以检测组合按键。矩阵键盘反转扫描步骤:1,行线输出全为0。2,读入列线值。3,列线输出当前值。4,读入行线值。5,组合码值。本人表达能力实在有限,在百度文库里看到有个大神的解释还不错,所以直接拿来了,当然他这个文档的解释还有不完善的地方,我就在后面对这个文档的一些问题进行补充吧。1,说明:这个文档中P1口即对应矩阵键盘的八个io口。2,关于P1值到底是怎么变化的?答:这里可以参照我画的程序框图来看(行线对应P1的高四位,列线对应第四位)。首先行线置0,列线置1。此时P1=(为了直观用二进制表示)。假设按键按下P1=(箭头表示按的那个按键)这时P1的低四位就发生了变化,把P1的值赋给a(一个unsigned char型)。则a=再让行线为1,列线置0。此时P1=,因为这时按键被你按下了,所以P1=有人会问如果我快速松手岂不是检测不到变化了?放心,你的手速绝对比不上程序运行的速度,早在你松手之前就已经完成了反转扫描。这时再将P1赋给b(另一个unsigned char型),则b=。组合码值=a+b=。然后找出这个值所对应的按键即可。~第一次写文章,想问下引用别人资料需要注意什么,直接贴链接可以吗?希望能对大家有所帮助,顺便留下你们宝贵的建议和意见,让我发现自己的不足,更好的提高。其它的模块会持续更新,喜欢的可以点赞关注下,欢迎大家私信和我交流提问,一起进步。谢谢~168 条评论分享收藏

我要回帖

更多关于 matlab 矩阵行列数 的文章

 

随机推荐