完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
P3=一个数后
如果我按下某个矩阵键后P3是不是也会改变? 如下面这个程序中 加粗的字体 #include #define uint unsigned int #define uchar unsigned char ***it du=P2^6; ***it we=P2^7; uchar code leddata[]={ 0x3F, //"0" 0x06, //"1" 0x5B, //"2" 0x4F, //"3" 0x66, //"4" 0x6D, //"5" 0x7D, //"6" 0x07, //"7" 0x7F, //"8" 0x6F, //"9" 0x77, //"A" 0x7C, //"B" 0x39, //"C" 0x5E, //"D" 0x79, //"E" 0x71, //"F" 0x76, //"H" 0x38, //"L" 0x37, //"n" 0x3E, //"u" 0x73, //"P" 0x5C, //"o" 0x40, //"-" 0x00, //熄灭 0x00 //自定义 }; void delay(uint z) { uint x; for(z=z;z>0;z--) for(x=114;x>0;x--); } uchar KeyScan() { uint crod_l,crod_h; P3=0xf0; if((P3&0xf0)!=0xf0) //经过测试跟if以及上面那个赋值有关 { delay(5); if((P3&0xf0)!=0xf0) { crod_l=P3&0xf0; P3=crod_l | 0x0f; //为何不能去掉...? crod_h=P3&0x0f; while((P3&0x0f)!=0x0f); //为何while((P3&0x0f)!=0x0f); 不行 return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0); } } } void KeyPro() { switch(KeyScan()) { case 0xee: P0 = leddata[0]; break; case 0xde: P0 = leddata[1]; break; case 0xbe: P0 = leddata[2]; break; case 0x7e: P0 = leddata[3]; break; case 0xed: P0 = leddata[4]; break; case 0xdd: P0 = leddata[5]; break; case 0xbd: P0 = leddata[6]; break; case 0x7d: P0 = leddata[7]; break; case 0xeb: P0 = leddata[8]; break; case 0xdb: P0 = leddata[9]; break; case 0xbb: P0 = leddata[10]; break; case 0x7b: P0 = leddata[11]; break; case 0xe7: P0 = leddata[12]; break; case 0xd7: P0 = leddata[13]; break; case 0xb7: P0 = leddata[14]; break; case 0x77: P0 = leddata[15]; break; } } void main() { we=1; P0=0; we=0; du=1; P0=leddata[22]; while(1) KeyPro(); } |
|
相关推荐
9个回答
|
|
|
uchar KeyScan()
{ uint crod_l,crod_h; P3=0xf0; if((P3&0xf0)!=0xf0) //经过测试跟if以及上面那个赋值有关 { delay(5); if((P3&0xf0)!=0xf0) { crod_l=P3&0xf0; P3=crod_l | 0x0f; //为何不能去掉...? crod_h=P3&0x0f; while((P3&0x0f)!=0x0f); //为何while((P3&0x0f)!=0x0f); 不行 return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0); } } } 这是一个矩阵键盘的识别按下哪个键盘的程序,你好好看看资料,这是一个4X4的键盘,先是高位送高电平,低位送低电平判断是哪一列,然后高位低电平,低位高电平判断出哪一行,这样就出来是哪一个键按下了,最后是等待键盘松开。 |
|
|
|
|
|
|
|
|
|
|
|
首先,确定你这个是矩阵键盘?看了下程序怎么都像是1*8的键盘而已...
2、回答下你的问题吧:是的,按键按下去了P3就会变 uchar KeyScan() { uint crod_l,crod_h; P3=0xf0; if((P3&0xf0)!=0xf0) //经过测试跟if以及上面那个赋值有关 { delay(5); if((P3&0xf0)!=0xf0) { crod_l=P3&0xf0; //读取高四位的数据 P3=crod_l | 0x0f; //crod_l 的高四位的数据保留,低四位全部置1 //为何不能去掉...? crod_h=P3&0x0f; //读取低四位的数据 while((P3&0x0f)!=0x0f); //为何while((P3&0x0f)!=0x0f); 不行 //这句语句表达的是“当P3的低四位还有按键的时候,就循环,没按键就跳出” ,看起来没什么问题,不过我们编程很少会用while循环直接 //去判断,就怕卡死在里面,这里建议你delay 200~300毫秒,直接在下面return就行了,因为人按按键的速度一般是在100~300毫秒左右 return(crod_l+crod_h); //与while((P3&0xf0)!=0xf0); } } } 解答全都写在程序里了哟~ |
|
|
|
|
|
你这是逐行扫描,你看上边的程序是先高位送高电平,低位送低电平,就知道哪一行了,再反过来就知道那一列了,不比你逐行扫描快?
|
|
|
|
|
|
while((P3&0x0f)!=0x0f);这句话应该是等待键盘松开吧?
|
|
|
|
|
|
是呀,等待按键松开,不过我个人认为没有必要写这个东东在这里,不想用太多while,怕死循环在里面了
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1018 浏览 1 评论
1849 浏览 0 评论
1830 浏览 1 评论
3254 浏览 5 评论
3581 浏览 9 评论
1021浏览 1评论
1850浏览 1评论
如何知道嵌入式电子控制单元 (ECU) 中的RAM使用情况?
1360浏览 1评论
1852浏览 0评论
1178浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 05:16 , Processed in 1.082293 second(s), Total 93, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
567