矩陣鍵盤掃描程序
你要放到“死循環”中不斷掃描。他的原理圖一般是這樣的
以第一個按鍵為例,當你按下時I/O口讀到的數據就不是0x0f了。好吧你最開始的賦值錯了。你要用0xee,0xde檢測的話你應該給0xfe。每四個按鍵是一組。我這有一個我做密碼鎖的程序你參考一下。
void key()
{
P3=0xfe;
if(P3!=0xfe)
{
time(50);
if(P3!=0xfe)
{
switch(P3)
{
ca 0xee:num=1,cs++;
break;
ca 0xde:num=2,cs++;
break;
ca 0xbe:num=3,cs++;
break;
ca 0x7e:num=4,cs++;
break;
}
}
while(P3!=0xfe);
}
P3=0xfd;
if(P3!=0xfd)
{
time(50);
if(P3!=0xfd)
{
switch(P3)
{
ca 0xed:num=5,cs++;
break;
ca 0xdd:num=6,cs++;
break;
ca 0xbd:num=7,cs++;
break;
ca 0x7d:num=8,cs++;
break;
}
}
while(P3!=0xfd);
}
P3=0xfb;
if(P3!=0xfb)
{
time(50);
if(P3!=0xfb)
{
switch(P3)
{
ca 0xeb:num=9,cs++;
break;
ca 0xdb:num=0,cs++;
break;
ca 0xbb:cs++;
break;
ca 0x7b:num=10,cs=0,a=b=c=d=e=f=10,ply=1;
break;
}
}
while(P3!=0xfb);
}
}
c51矩陣鍵盤程序怎么寫
#include <reg52.h>
#define key P2
int val;
char code sign[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void delay_10ms();
void key_scan(); //矩陣按鍵函數聲明
void main()
{
while(1)
{
P0=sign[val];
key_scan();
}
}
void key_scan()
{
static char a,b; //a用于判斷是不是第一次按下,b用于稍微延時
char state; //記錄鍵值
key=0x0f;
if(key!=0x0f) //如果有按鍵按下
{
state=key; //記錄第一次按鍵狀態
if(a==0) //如果第一次按下
{
b++; //略微延時 不需要延時10ms以提高單片機效率
if(b>3)
{
if(key==state) //判斷鍵值是否和第一次一致
{
a=1,b=0; //復位狀態值 a==1說明已經按下,等待后續松開
key=0x0f; //測試列
switch(key)
{
ca (0x07): val=0;break;
ca (0x0b): val=1;break;
ca (0x0d): val=2;break;
ca (0x0e): val=3;break;
}
key=0xf0; // 測試行
switch(key)
{
ca (0x70): val=val;break;
ca (0xb0): val=val+4;break;
ca (0xd0): val=val+8;break;
ca (0xe0): val=val+12;break;
}
}
}
}
}
el
{
a=b=0; //松開后復位狀態機
}
}
51單片機4*3矩陣鍵盤6位密碼鎖c語言程序
#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char
uchar key;
int i=0;
char b[4]={'0','0','0','0'};//輸入的密碼放這里和初始的比較來判斷是否密碼正確
void keyscan() //掃描按鍵是否按下
{
uchar temp;
P3=0xfe; //掃描第一行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0) //判斷按鍵是否按下
{
delayms(10);//去抖動
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)//確認按鍵按下
{
temp=P3;
switch(temp)
{
ca 0xee:key='0';break;
ca 0xde:key='1';break;
ca 0xbe:key='2';break;
ca 0x7e:key='3';break;
}
while(temp!=0xf0) //判斷按鍵是否松開
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfd; //掃描第二行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xed:key='4';break;
ca 0xdd:key='5';break;
ca 0xbd:key='6';break;
ca 0x7d:key='7';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xfb; //掃描第三行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xeb:key='8' ;break;
ca 0xdb:key='9' ;break;
ca 0xbb:key='A';break;
ca 0x7b:key='B';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
P3=0xf7; //掃描第四行
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
ca 0xe7:key='C';break;
ca 0xd7:key='D';break;
ca 0xb7:key='E';break;
ca 0x77:key='F';break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
b[i]=key;i++;if(i==3)i=0;
}
}
}
main()
{
char a[4]={'3','5','A','C'}; //這個做初始密碼
while(1)//無限循環,保證了b 0-3 四個數有值
{
keyscan();
if(a[0]==b[0]&&a[1]==b[1]&&a[2]==b[2]&&a[3]==b[3])
{
//這里寫密碼正確程序要怎么處理
}
}
}
矩陣鍵盤程序解析,掃描和判斷程序如下。求注釋!!真心看不懂啊!4*4矩陣
大體上看了一下你的程序, 就是一個很簡單的鍵盤掃描~~ 你應該看看矩陣鍵盤的原理,再看這個的時候就很簡單了~~我給你手寫也有點累~ 處于責任心,給你寫點吧!! 這個程序實現的是4*4的矩陣鍵盤,用高4位來進行掃描是否有鍵按下(高位的4個口輪流置零掃描), 如果有鍵按下(置零的哪個口連接的線就會和低四位其中的一根線接觸)低四位中就會有一個口為低電平.... 剩下的就是通過高低4位來判斷具體按鍵是哪個~~ 我不寫了~~ 自己了解一下原理吧,很簡單~~~ 加油!
PANDUAN: MOV P3,#0FFH //程序開始 p3口全部拉高
CLR P3.4 //P3.4置零 P3=0XEF
MOV A,P3 //將P3端口的值賦給A---0XEF
ANL A,#0FH //將上一步得到的值 和0X0F邏輯與---也就是取P3口低四位0X0F----結果存到A
XRL A,#0FH //A里面的值 與0X0F異或 ---結果為0
JZ SW1 //如果為零 則跳轉到SW1,否則往下執行---含義就是如果為零則代表無鍵按下 否則有
LCALL DELAY10MS //延時10MS--有按鍵按下, 軟件消抖
JZ SW1 //繼續判斷---確定有鍵按下 但是不確定是哪個鍵按下 --接下來判斷哪個鍵按下
MOV A,P3 // 以解釋
ANL A,#0FH //以解釋
CJNE A,#0EH,K1 //A不等于0x0E 則跳轉到k1, 否則往下執行
MOV COUNT,#0 //count置零
LJMP DK //跳轉到DK
K1: CJNE A,#0DH,K2
MOV COUNT,#4
LJMP DK
K2: CJNE A,#0BH,K3
MOV COUNT,#8
LJMP DK
K3: CJNE A,#07H,K4
MOV COUNT,#12
K4: NOP
LJMP DK
SW1: MOV P3,#0FFH //以上分析的結果--程序跳轉到這執行
CLR P3.5 //與之前的分析很類似--以下不在分析
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW2
LCALL DELAY10MS
JZ SW2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,K5
MOV COUNT,#1
LJMP DK
K5: CJNE A,#0DH,K6
MOV COUNT,#5
LJMP DK
K6: CJNE A,#0BH,K7
MOV COUNT,#9
LJMP DK
K7: CJNE A,#07H,K8
MOV COUNT,#13
K8: NOP
LJMP DK
SW2: MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW3
LCALL DELAY10MS
JZ SW3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,K9
MOV COUNT,#2
LJMP DK
K9: CJNE A,#0DH,KA
MOV COUNT,#6
LJMP DK
KA: CJNE A,#0BH,KB
MOV COUNT,#10
LJMP DK
KB: CJNE A,#07H,KC
MOV COUNT,#14
KC: NOP
LJMP DK
SW3: MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ SW4
LCALL DELAY10MS
JZ SW4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,KD
MOV COUNT,#3
LJMP DK
KD: CJNE A,#0DH,KE
MOV COUNT,#7
LJMP DK
KE: CJNE A,#0BH,KF
MOV COUNT,#11
LJMP DK
KF: CJNE A,#07H,KG
MOV COUNT,#15
KG: NOP
LJMP DK
SW4: LJMP PANDUAN
DK: RET
求助程序:51單片機矩陣鍵盤是否按下檢測程序
/**************************************************************************************
* 矩陣按鍵實驗 *
實現現象:下載程序后數碼管顯示0,按下矩陣按鍵上的按鍵顯示對應的數字
S1-S4:0-3
S5-S8:4-7
S9-S12:8-B
S13-S16:C-F。
注意事項:如果不想讓點陣模塊顯示,可以將74HC595模塊上的JP595短接片拔掉。
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
#define GPIO_DIG P0
#define GPIO_KEY P1
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 KeyValue; //用來存放讀取到的鍵值
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : KeyDown
* 函數功能 : 檢測有按鍵按下并讀取鍵值
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay(1000);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
ca(0X07): KeyValue=0;break;
ca(0X0b): KeyValue=1;break;
ca(0X0d): KeyValue=2;break;
ca(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
ca(0X70): KeyValue=KeyValue;break;
ca(0Xb0): KeyValue=KeyValue+4;break;
ca(0Xd0): KeyValue=KeyValue+8;break;
ca(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
{
delay(1000);
a++;
}
}
}
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
LSA=0; //給一個數碼管提供位選
LSB=0;
LSC=0;
while(1)
{
KeyDown(); //按鍵判斷函數
GPIO_DIG=smgduan[KeyValue]; //
}
}