手里現在只有一個單片機的試驗儀,所以按上面的接線寫程序。但是按了6遍0再按D確認,led燈也沒反應。查不出來是那里出問題了。
矩陣是按行從左到右3210列從上到下7654的順序,掃描程序我另外試了,對應關系都對,就是沒有消抖處理。感覺是主程序輸入密碼那里有點問題。
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;
sbit led2=P2^1;
bit pass=0;
u8 Input[6];
u8 Correct[6]={0,0,0,0,0,0};
/*************5ms延時********************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/************將按鍵值編碼為數值**************/
unsigned char coding(unsigned char m)
{
unsigned char k;
switch(m)
{
case (0x77): k=1;break;
case (0x7b): k=2;break;
case (0x7d): k=3;break;
case (0x7e): k='A';break;
case (0xb7): k=4;break;
case (0xbb): k=5;break;
case (0xbd): k=6;break;
case (0xbe): k='B';break;
case (0xd7): k=7;break;
case (0xdb): k=8;break;
case (0xdd): k=9;break;
case (0xde): k='C';break;
case (0xe7): k='*';break;
case (0xeb): k=0;break;
case (0xed): k='#';break;
case (0xee): k='D';break;
}
return(k);
}
//=====================按鍵檢測并返回按鍵值===============================
unsigned char keynum(void)
{
u8 temp;
u8 com1,com2;
P1=0xf0;
if(P1!=0xf0)
{ Delay5Ms();
Delay5Ms();
if(P1!=0xf0)
{
{
com1=P1;
P1=0x0f;
com2=P1;
}
P1=0xf0;
while(P1!=0xf0);
temp=com1|com2;
return(temp);
}
else return 0;
}
else return 0;
}
/******************密碼判斷程序*********************/
void judge()
{ if((Input[0]==Correct[0])&&(Input[1]==Correct[1])&&(Input[2]==Correct[2])&&(Input[3]==Correct[3])&&(Input[4]==Correct[4])&&(Input[5]==Correct[5]))
{
pass=1;
led=0; //開鎖指示燈亮
}
else pass=0;
}
void main()
{ u8 key,num;
u8 N=0;
while(1)
{ led2=0;
key=keynum();
num=coding(key);
switch(num)
{ case('A'): ;break;
case('B'): ;break;
case('C'): ;break;
case('D'):judge();break;
case('*'): ;break;
case('#'): ;break;
default:
{ if(N<6)
{Input[N]=num;N++;}
else
{N=6;break;}
}
}
}
}
|