永发信息网

求51单片机的P1口接行列扫描的16个按键,试编程完成行列扫描的程序。

答案:2  悬赏:70  手机版
解决时间 2021-07-28 23:47
求51单片机的P1口接行列扫描的16个按键,试编程完成行列扫描的程序。
最佳答案


uchar keyscan()


{


P1=0xfe; //P1赋值,低位送0


temp=P1; //temp读回P1的值,


temp=temp&0xf0; //屏蔽 temp低四位,只看高四位列控是否发声变化


while(temp!=0xf0) //不等,说明第一行有键按下


{ //延时去抖


delay(5); //再检测


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0) //果真有键按下,


{ //把P1给temp,检测按键位置


temp=P1;


switch(temp)


{


case 0xee:num=1;


break;


case 0xde:num=2;


break;


case 0xbe:num=3;


break;


case 0x7e:num=4;


break;


}


while(temp!=0xf0) //一次按键检测,松手跳出循环


{


temp=P1;


temp=temp&0xf0;


}


}


}



P1=0xfd; //检测第二列


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0)


{


delay(5);


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0)


{


temp=P1;


switch(temp)


{


case 0xed:num=5;


break;


case 0xdd:num=6;


break;


case 0xbd:num=7;


break;


case 0x7d:num=8;


break;


}


while(temp!=0xf0)


{


temp=P1;


temp=temp&0xf0;


}


}


}




P1=0xfb;


temp=P1; //检测第三列


temp=temp&0xf0;


while(temp!=0xf0)


{


delay(5);


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0)


{


temp=P1;


switch(temp)


{


case 0xeb:num=9;


break;


case 0xdb:num=10;


break;


case 0xbb:num=11;


break;


case 0x7b:num=12;


break;


}


while(temp!=0xf0)


{


temp=P1;


temp=temp&0xf0;


}


}


}




P1=0xf7; //检测第四列


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0)


{


delay(5);


temp=P1;


temp=temp&0xf0;


while(temp!=0xf0)


{


temp=P1;


switch(temp)


{


case 0xe7:num=13;


break;


case 0xd7:num=14;


break;


case 0xb7:num=15;


break;


case 0x77:num=16;


break;


}


while(temp!=0xf0)


{


temp=P1;


temp=temp&0xf0;


}


}


}


return num; //返回检测结果,



}

全部回答

给你一个经典的,自己研究研究:

#define Key_Port P1

unsigned char code tab[]={0x7e,0x7d,0x7b,0x77,0xbe,0xbd,0xbb,0xb7,0xde,0xdd,0xdb,0xd7,0xee,0xed,0xeb,0xe7}; unsigned char Key_Scan(void) { unsigned char key_temp=0xff,i=0xff; Key_Port=0xf0; if(Key_Port!=0xf0) { key_temp=Key_Port; Key_Port=0x0f; //线反转 key_temp=(Key_Port&0x0f)|(key_temp&0xf0); //这里已经得到键码 while(Kep_Port!=0x0f); //等待按键释放,可在while里加入显示防止显示中断 for(i=0;i<16;i++) //键码比较,找到则退出循环 if(tab[i]==key_temp)break; } return i; //返回查找到的是第几个键,一般都需要数字键,这样做很有用,如无按键按下则返回0xFF, }

如只需返回键码,则只要如下写即可,比楼主的经典得多也有效得多

unsigned char Key_Scan(void) { unsigned char key_temp=0xff; Key_Port=0xf0; if(Key_Port!=0xf0) { key_temp=Key_Port; Key_Port=0x0f; //线反转 key_temp=(Key_Port&0x0f)|(key_temp&0xf0); //这里已经得到键码 while(Kep_Port!=0x0f); //等待按键释放,可在while里加入显示防止显示中断 } return key_temp; //返回键码,如无按键按下则返回0xFF, }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
VB编程计算问题
什么食物含纤维素最多?
高手来吖。为什么我的N70突然间朋友发短信给
涟源市娄底涟源市中医院-男科诊疗中心这个地
黄浦江和黄浦有什么联系?
悬空城的地图怎么开
怎样能健康减肥,又不用花太多时间?
谁知道共和国之辉里的预备役怎么配武器?
DNF石象价格怎么到了3500去了?
应城市孝感中国移动(长江埠营业厅)哪位知道具
用魔域新超值购来的带赠字的法宝,不能和主法
能不能一边充电一边玩手机阿
动漫经典日语句子,有一个日语句子的语法,动
应该拿什么来爱一个人!
想学临床医学
推荐资讯
监利县荆州智力自行车在什么地方啊,我要过去
梦幻里面七彩玲珑阵最后怎么点啊
李克勤经典曲目
DNF北京三加9含光斩岩剑能卖多少钱
怎样才能去黄斑
蕲春县黄冈中国移动(狮子营业厅)在什么地方啊
手机闹钟怎么设置铃声,闹钟铃声怎么删除
音速有2级图标没?
娄星区娄底雅菲尔这个地址怎么能查询到,着急
360保险箱的那个硬盘还原保护是什么意思
五年级上册口语交际怎么写
流星到底是什么来的丫?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?