找回密码
 注册会员
img_loading
智能检测中
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 矩阵键盘显示.rar

矩阵键盘显示.rar

 

新人请教4*4键盘扫描细节问题,望达人不吝赐教!:
键盘扫描程序如下(程序及图附件中都有),下面这个程序是对的,但问题有以下几点(都在扫描部分):
一、用if语句可以,但用while语句不可以(语法上大致明白,但理解不清楚)。
二、我用语句if(P2&0x0f!=0x0f)判断时,直接出现两个警告(图见附件warning.jpg),原因不明。当改用
P2=light[j];
k=P2&0x0f;
if(k!=0x0f)
这三条替换if(P2&0x0f!=0x0f)时,程序正确,不知道为什么。
三、以上只是按键判定,松手判定,我试了好几种方式(见程序中),都不行。
#include<at89x51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code light[]={0x7f,0xbf,0xdf,0xef};
uchar code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
uchar key,j;
void delay(uint m) //延时
{
uint i;
for(;m>0;m--)
for(i=124;i>0;i--)
;
}
uchar readkey(uchar scan) //读取键码值
{
P2=scan;
switch(P2)
{
case 0x7e:return(0);
case 0x7d:return(1);
case 0x7b:return(2);
case 0x77:return(3);
case 0xbe:return(4);
case 0xbd:return(5);
case 0xbb:return(6);
case 0xb7:return(7);
case 0xde:return(8);
case 0xdd:return(9);
case 0xdb:return(10);
case 0xd7:return(11);
case 0xee:return(12);
case 0xed:return(13);
case 0xeb:return(14);
case 0xe7:return(15);
default:return(16);
}
}
void keyscan() //扫描程序
{
uchar k;
for(j=0;j<4;j++)
{
P2=light[j];
k=P2&0x0f;
if(k!=0x0f)
{
delay(5);
P2=light[j];
k=P2&0x0f;
if(k!=0x0f)
{
key=readkey(light[j]);
// while(k!=0x0f); //判松手
//while(P2&0x0f!=0x0f);
/* P2=light[j];
k=P2&0x0f;
while(k!=0x0f);
*/
}
}
}
}
void main()
{
key=16;
while(1)
{
keyscan();
P1=LED[key];
}
}


QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2025-7-13 18:41 , Processed in 0.050235 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部