完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uchar unsigned char #define uint unsigned int ***it dula=P2^6; //定义段选锁存器锁存端 ***it wela=P2^7; //定义位选锁存器锁存端 uchar code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x76}; void delayms(uint xms) //延时函数 { uint i,j; for (i=xms;i>0;i++) for(j=110;j>0;j--); } void display(uchar num) { P0=table[num]; dula=1; dula=0; } void matrixkeyscan() { uchar temp,key; P3=0xfe; //11111110 第一行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线 temp=P3; //读取当前P3口的状态赋予temp temp=temp&0xf0; //temp与0xf0求"与",再赋予temp if(temp!=0xf0) { delayms(10); //延时去抖操作 temp=P3; //重新读取当前P3口状态 temp=temp&0xf0; //重新求与 if(temp!=0xf0) { temp=P3; //读取P3口状态 switch(temp) { case 0xee: //第一行第一列低电平(按键按下) 11101110 key=0; break; case 0xde: //第一行第二列低电平(按键按下) 11011110 key=1; break; case 0xbe: //第一行第三列低电平(按键按下) 10111110 key=2; break; case 0x7e: //第一行第四列低电平(按键按下) 01111110 key=3; break; } while(temp!=0xf0) //等待按键是否释放 { temp=P3; //不断取P3口状态 temp=temp&0xf0; // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较 //如果求与后temp等于0xf0(11111110),则说明按键释放 } display(key); //显示被按下按键对应的字符 } } P3=0xfd; //11111101 第二行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线 temp=P3; //读取当前P3口的状态赋予temp temp=temp&0xf0; //temp与0xf0求"与",再赋予temp if(temp!=0xf0) { delayms(10); //延时去抖操作 temp=P3; //重新读取当前P3口状态 temp=temp&0xf0; //重新求与 if(temp!=0xf0) { temp=P3; //读取P3口状态 switch(temp) { case 0xed: //第二行第一列低电平(按键按下)11101101 key=4; break; case 0xde: //第二行第二列低电平(按键按下) 11011101 key=5; break; case 0xbd: //第二行第三列低电平(按键按下) 10111101 key=6; break; case 0x7d: //第二行第四列低电平(按键按下) 01111101 key=7; break; } while(temp!=0xf0) //等待按键是否释放 { temp=P3; //不断取P3口状态 temp=temp&0xf0; // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较 //如果求与后temp等于0xf0(11111110),则说明按键释放 } display(key); //显示被按下按键对应的字符 } } P3=0xfb; //11111011 第三行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线 temp=P3; //读取当前P3口的状态赋予temp temp=temp&0xf0; //temp与0xf0求"与",再赋予temp if(temp!=0xf0) { delayms(10); //延时去抖操作 temp=P3; //重新读取当前P3口状态 temp=temp&0xf0; //重新求与 if(temp!=0xf0) { temp=P3; //读取P3口状态 switch(temp) { case 0xed: //第三行第一列低电平(按键按下)11101011 key=8; break; case 0xde: //第三行第二列低电平(按键按下) 11011011 key=9; break; case 0xbd: //第三行第三列低电平(按键按下) 10111011 key=10; break; case 0x7d: //第三行第四列低电平(按键按下) 01111011 key=11; break; } while(temp!=0xf0) //等待按键是否释放 { temp=P3; //不断取P3口状态 temp=temp&0xf0; // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较 //如果求与后temp等于0xf0(11111110),则说明按键释放 } display(key); //显示被按下按键对应的字符 } } P3=0xfb; //11110111 第四行是低电平,其余三行为高电平 P3低四位是行线,高四位是列线 temp=P3; //读取当前P3口的状态赋予temp temp=temp&0xf0; //temp与0xf0求"与",再赋予temp if(temp!=0xf0) { delayms(10); //延时去抖操作 temp=P3; //重新读取当前P3口状态 temp=temp&0xf0; //重新求与 if(temp!=0xf0) { temp=P3; //读取P3口状态 switch(temp) { case 0xe7: //第四行第一列低电平(按键按下)11100111 key=12; break; case 0xd7: //第四行第二列低电平(按键按下) 11010111 key=13; break; case 0xb7: //第四行第三列低电平(按键按下) 10110111 key=14; break; case 0x77: //第四行第四列低电平(按键按下) 01110111 key=15; break; } while(temp!=0xf0) //等待按键是否释放 { temp=P3; //不断取P3口状态 temp=temp&0xf0; // 用来检测按键是否释放 如果求与后temp不等于0xf0,则说明高四位有低电平,说明按键没有释放,继续取P3口状态用来求与比较 //如果求与后temp等于0xf0(11111110),则说明按键释放 } display(key); //显示被按下按键对应的字符 } } } void main() { P0=0x00; dula=1; //关闭所有数码管的段选 dula=0; wela=1; P0=0xc0; //打开所有数码管的位选 wela=0; while(1) { matrixkeyscan(); } } |
|
相关推荐
9个回答
|
|
有点长,看起来挺累的
|
|
|
|
矩阵键盘算法太复杂了,参考论坛里面的代码吧!
|
|
|
|
用仿真器跟差跑一下,看到底是哪儿的问题,程序是调出来的!没有仿真器的话用个仿真软件也行,你这个功能简单,仿真软件实现起来也方便!
|
|
|
|
谢谢 指点 我找到原因了 是因为粗心把延时函数外循环写错了 呵呵 |
|
|
|
|
|
|
|
学习了
|
|
|
|
你这程序是仿真的还是实物
|
|
|
|
|
|
|
|
不错的文件,值得收藏
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
54 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
395 浏览 0 评论
439 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1265 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
529 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11743 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 13:14 , Processed in 0.802598 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号