完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`矩阵键盘扫描-----反转法 #include #define uchar unsigned char uchar low,high,temp; void delay(uint t); void main() { while(1) { P3=0x0f; if(P3!=0x0f) { delay(100); low=P3&0x0f; P3=0xff; //What the hell ?????? P3=0xf0; //如果没了上面那行,此处用 P3=low|0xf0 什么的 同样失效。。。。 high=P3&0xf0; temp=high+low; switch(temp) { case 0xd7:P0=0x3f;break; //0 case 0xeb:P0=0x06;break; //1 case 0xdb:P0=0x5b;break; //2 case 0xbb:P0=0x4f;break; //3 case 0xed:P0=0x66;break; //4 case 0xdd:P0=0x6d;break; //5 case 0xbd:P0=0x7d;break; //6 case 0xee:P0=0x07;break; //7 case 0xde:P0=0x7f;break; //8 case 0xbe:P0=0x6f;break; //9 } } } } void delay(uint t) { while(t--); } ----------------------------------------------------------------------------------------------------------------------- 首先 这个程序是正确的,虽然有些地方不足,但是是可以正常工作的。。。 主要是红色字体那 就是让我纠结了好久的一个问题,实在是想不出来了 所以来论坛里求助 希望大家能帮帮忙 看一下也行 谢谢了 :) 因为实在是太奇怪了, 如果没有他, 如果我将她该为0x0f;那么高四位(P3.4~P3.7)相当于失效。 如果将他改为0xfe;那么P3.0口就失效。。。 总之就是,这个P3端口必须要置1一下 后面才能使用。 但是从C语言上,对于下面一条语句来说,他是多余的呀,难道和硬件有关吗??? 如果有关的话 那这句话究竟起着什么作用呢??? 我是在仿真软件上进行测试的 也没有提示有错误 ` |
|
相关推荐
5个回答
|
|
大家帮帮忙啊
|
|
|
|
如果不加那条语句 估计会产生很多毛刺.....
|
|
|
|
友情顶,求积分
|
|
|
|
仔细看了看你的代码,没发现什么问题,我把你写的和我自己写的对比了一下,可能是有些地方直接对IO口操作了?我也不太清楚,我是把IO口的值拿出来在进行操作的。我写的代码粘在下面了。另外,仿真和在实际的硬件环境真的有很大差别,有时候仿真对的程序,在硬件上不一定对,所以还是尽量用硬件吧。找到问题的话,跟我说一声
//键盘扫描函数 uchar Matrixkeyscan() { uchar num; uchar key_lie; //按键扫描函数里用来存储列的变量 uchar key_hang; //存储行的变量 uchar key; //具体按下的键值的编码 P2=0xf0; //1111 0000,行为低电平,列为高电平 key_lie=P2; //读取IO的数值 key_lie=key_lie&0xf0; //与,将低四位屏蔽 if(key_lie!=0xf0) //如果不等,说明有按键按下 { Delay_ms(10); //去抖动 if(key_lie!=0xf0) //说明确实有按键被按下 { key_lie=P2; //读取最新的P2值 key_lie=key_lie&0xf 0; //得到最新的列的信息(这两行可以不写,写上更严谨) //假如第一列的某个按键按下,则key_lie为1110 0000 P2=0x0f; //0000 1111,列为低电平,行为高电平 key_hang=P2; //读取P2口 key_hang=key_hang&0x0f; //将高四位屏蔽掉,得到具体的行的信息,假如第一行的某个按键被按下 //则key_hang为0000 1110 key=key_hang|key_lie; //将行和列的信息相或,1110 0000 |0000 1110=1110 1110, //可知第一行,第一列的按键被按下 } while(P2!=0x0f); //等待按键被释放 } switch(key) //根据按键的数值进行判断 { case 0xee: num=0;break; //0xee=1110 1110 说明第一个按键被按下,则num的值为0; case 0xde: num=1;break; case 0xbe: num=2;break; case 0x7e: num=3;break; case 0xed: num=4;break; case 0xdd: num=5;break; case 0xbd: num=6;break; case 0x7d: num=7;break; case 0xeb: num=8;break; case 0xdb: num=9;break; case 0xbb: num=10;break; case 0x7b: num=11;break; case 0xe7: num=12;break; case 0xd7: num=13;break; case 0xb7: num=14;break; case 0x77: num=15;break; case 0x00: num=16;break; //如果没有按键按下,则不显示 } return num; } |
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
122 浏览 0 评论
565 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
772 浏览 0 评论
948 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
658 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12041 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 15:08 , Processed in 0.575201 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号