Ⅰ 51單片機如何把矩陣鍵盤控制數碼管和獨立鍵盤控制蜂鳴器共同實現
我們先了解矩陣鍵盤的工作原理,掌握編碼方法並能夠編寫出掃描程序,使用矩陣鍵盤控制數碼管輸出矩陣鍵值。
顯示內容
在顯示備橘祥模塊的八位 LED 數碼的個位顯示當前使用矩陣鍵盤所按下的值。
鍵陣鍵盤多用於鍵伍李數目較多的時候。這樣可以更多的節省IO口的佔用量,
對於矩陣鍵盤常用的掃描方法為線反轉查詢法。具體的思路是:首先使行作為輸入,使用單片機內部仿搏電阻上拉為高電平,列輸出低電平,讀行的狀態。如果行有一個IO口是低,說明有鍵按下,進行下一步,否則退出掃描。如果有鍵按下,置列為輸入,行輸出低電平,讀列的狀態。最後根據
行列的狀態查表就可以知道是那個按鍵按下。
Ⅱ 51單片機,用c語言,如何用矩陣鍵盤為一個變數char a賦值已設計出一個函數,使得每按一個矩陣
/***4×4矩陣按鍵構架——火柴天堂作品-20110921***/
/***源程序默認硬體環境:52單片機,12MHz晶振,P1口 4×4矩陣鍵盤,詳細布局如下***/
/* 默認矩陣布局,按鍵掃描方式1使用
P0 P1 P2 P3
│ │ │ │
P4─┼──┼──┼──┤ S1 S2 S3 S4
│ │ │ │
P5─┼──┼──┼──┤ S5 S6 S7 S8
│ │ │ │
P6─┼──┼──┼──┤ S9 S10 S11 S12
│ │ │ │
P7─┴──┴──┴──┘ S13 S14 S15 S16
*/
#include"reg52.h" //包含52頭文件
#define TRUE 1 //定義布爾量'1':真
#define FALSE 0 //定義布爾量'0':假
#define uchar unsigned char //定義 無符號字元型數據 簡稱
#define uint unsigned int //定義 無符號整型數據 簡稱
#define KeyPort P1
#define Key1Value 1
#define Key2Value 2
//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//按鍵代碼列表,按鍵掃描方式2使用,可按需要隨意修改順序
uchar KeyScan() //按鍵掃描函數(方式1,需配合源程序矩陣布局,返回值0表示無按鍵,1-16為對應按鍵),缺點:無法掃描組合鍵(同時按2個按鍵以上)
{
uchar temp_h,temp_l,scan_value,i;
KeyPort=0xf0; //設置低4位為0(掃描線),准備讀取高4位(返回線)狀態
if(KeyPort==0xf0) return 0; //若高4位狀態不變,表示無按鍵,返回無按鍵 鍵值0
temp_h=~KeyPort>>4; //若高4位狀態改變,表示有按鍵,讀取高4位,並將結果轉成正邏輯(按鍵對應 行線 為 1 )存在temp_h低位上
KeyPort=0x0f; //設置高4位為0(掃描線),准備讀取低4位(返回線)狀態
temp_l=~(KeyPort|0xf0); //讀取低4位,並將結果轉成正邏輯(按鍵對應 列線 為 1 )存在temp_l低位上
while(i<4) //將 按鍵行線號 轉成數值
{
if((temp_h>>i)==0x01) break; //讀取按鍵行線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回無按鍵
temp_h=i; //將 按鍵行線數值 結果存於 temp_h
i=0;
while(i<4) //將 按鍵列線號 轉成數值
{
if((temp_l>>i)==0x01) break; //讀取按鍵列線號
i++;
}
if(i==4) return 0; //若讀取出錯,返回無按鍵
temp_l=i; //將 按鍵列線號 結果存於 temp_l
scan_value=(temp_h<<2)+temp_l+1; //合並行列線數值,並轉成按鍵值,每條行線鍵值差為 4(temp_h<<2),按鍵值從1開始(+1,0為無按鍵 鍵值)
return scan_value; //返回 按鍵值
}
/*
uchar KeyScan() //按鍵掃描函數(方式2,需配合 按鍵代碼列表 數組 進行 鍵值 查詢,返回值0表示無按鍵,1-16為代碼表順序對應按鍵),缺點:無法掃描組合鍵
{
uchar temp,i;
KeyPort=0xf0; //設置低4位為0(掃描線),准備讀取高4位(返回線)狀態
if(KeyPort==0xf0) return 0; //若高4位狀態不變,表示無按鍵,返回無按鍵 鍵值0
temp=KeyPort|0x0f; //若高4位狀態改變,表示有按鍵,讀取高4位,並將結果存於 temp 的高4位
KeyPort=0x0f; //設置高4位為0(掃描線),准備讀取低4位(返回線)狀態
temp&=(KeyPort|0xf0); //讀取低4位,並將結果存於 temp 的低4位
while(i<16) //將按鍵行列線代碼轉換成鍵值
{
if(temp==KeyCodeList[i]) break; //將 行列線 代碼與 按鍵代碼表 進行對比,若一致則結束對比
i++; //進行下一個對比
}
if(i==16) return 0; //若查詢出錯,或 行列線代碼 不在 按鍵代碼表中,返回無按鍵 鍵值0
return i+1; //返回按鍵值1~16(按鍵代碼列表中元素下標+1,0為無按鍵 鍵值)
}
*/
void KeyResp() //按鍵響應函數
{
static uchar KeyValue; //定義靜態變數-按鍵值,
static bit KeyDownFlag,KeyReadyFlag; //定義靜態標志位-按鍵按下標志,按鍵准備(響應)標志
uchar key_value=KeyScan(); //調用掃描函數,並將結果臨時存放於key_value 中
if(key_value) //若掃描結果為真(即有按鍵)
{
KeyValue=key_value; //保存掃描結果
KeyDownFlag=TRUE; //按鍵按下標志 置位
KeyReadyFlag=TRUE; //按鍵准備(響應)標志 置位
}
else KeyDownFlag=FALSE; //若掃描結果為假(即無按鍵),則清空按鍵按下標志
if(KeyReadyFlag && !KeyDownFlag) //若 按鍵已准備(響應),且無按鍵按下,(可知為 按下後又鬆手情況)
{
switch(KeyValue) //查找 按鍵值 對應的 按鍵處理
{
case Key1Value:break; //按鍵1處理
case Key2Value:break; //按鍵2處理
//case Key3Value:break;//......... //按鍵N處理
default:break; //無對應按鍵,或其它按鍵值處理
}
KeyValue=0; //清除按鍵值
KeyReadyFlag=FALSE; //清空 按鍵准備(響應)標志
}
}
void main() //主函數
{
while(1) //循環系統
{
KeyResp(); //調用 按鍵響應函數
}
}
Ⅲ 51單片機如何用矩陣鍵盤輸入數值,最後賦值到一個變數上
你好!!
你做矩陣鍵盤檢測的時候,會觸發相關的IO口的狀態,通過分析IO口,就能知道那個鍵按下;
定義一個變數,將按下的鍵值賦給變數就行了
Ⅳ 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)
{
case 0xee:key='0';break;
case 0xde:key='1';break;
case 0xbe:key='2';break;
case 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)
{
case 0xed:key='4';break;
case 0xdd:key='5';break;
case 0xbd:key='6';break;
case 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)
{
case 0xeb:key='8' ;break;
case 0xdb:key='9' ;break;
case 0xbb:key='A';break;
case 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)
{
case 0xe7:key='C';break;
case 0xd7:key='D';break;
case 0xb7:key='E';break;
case 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])
{
//這里寫密碼正確程序要怎麼處理
}
}
}
Ⅳ C 51單片機 矩陣按鍵
首先記住,你的是矩陣鍵盤,就是說一個按鍵A的一端接單片機的一個腳(假設P00),另一個也接一個腳(假設P07),
GPIO_KEY=0x0f; 當沒有按下的話,GPIO_KEY還是等於0x0f的,假設按下A按鍵,由於按鍵兩邊一個接高電平,一個接低電平,按下後,高電平被低電平拉成低電平,也就是說按鍵A兩側都是0,此時不就可以判定了嘛
Ⅵ 51單片機如何用矩陣按鍵輸入多位數,比如輸入6顯示6,再輸入7顯示67,最好給個c的程序,謝了!
用數組啊,如果是指定位數的就比較簡單
當第一次輸入時i=0,第一個數6放a[0],i=1,第二個數7放a[1],顯示就是
OUT=a[0]*10+a[1]*1
數組用之前初始化為0,a[2]={0}
//這個好用點,遞推
if(key_data)//有按鍵按下
{
for(i=key_count;i>0;i--;)
{
a[i+1]=a[i];
}
a[0]=key_data;
key_count++;
}
//顯示調用,根據你的輸入最大數定數組的位數
Sprint=a[3]*1000+a[2]*100+a[1]*10+a[0]*1;