❶ 51單片機矩陣4*4鍵盤程序,P0口接一個數碼管,P2口接矩陣鍵盤
////給你一個例子,自己再改改:
/*-----------------------------------------------
名稱:矩陣鍵盤
論壇:www.doflye.net
編寫:shifang
日期:2009.5
修改:無
內容:
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include"keyboard.h"
#include"delay.h"
#define KeyPort P1
/*------------------------------------------------
按鍵掃描函數,返回掃描鍵值
------------------------------------------------*/
unsigned char KeyScan(void) //鍵盤掃描函數,使用行列反轉掃描法
{
unsigned char cord_h,cord_l;//行列值中間變數
KeyPort=0x0f; //行線輸出全為0
cord_h=KeyPort&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
DelayMs(10); //去抖
if((KeyPort&0x0f)!=0x0f)
{
cord_h=KeyPort&0x0f; //讀入列線值
KeyPort=cord_h|0xf0; //輸出當前列線值
cord_l=KeyPort&0xf0; //讀入行線值
while((KeyPort&0xf0)!=0xf0);//等待松開並輸出
return(cord_h+cord_l);//鍵盤最後組合碼值
}
}return(0xff); //返回該值
}
/*------------------------------------------------
按鍵值處理函數,返回掃鍵值
可以根據需要改變返回值
| 1 | 2 | 3 | + |
| 4 | 5 | 6 | - |
| 7 | 8 | 9 | * |
| 0 | . | = | / |
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 1 ;break;//0 按下相應的鍵顯示相對應的碼值
case 0x7d:return 2 ;break;//1
case 0x7b:return 3 ;break;//2
case 0x77:return '+';break;//3
case 0xbe:return 4 ;break;//4
case 0xbd:return 5 ;break;//5
case 0xbb:return 6 ;break;//6
case 0xb7:return '-';break;//7
case 0xde:return 7 ;break;//8
case 0xdd:return 8 ;break;//9
case 0xdb:return 9 ;break;//a
case 0xd7:return 'x';break;//b
case 0xee:return 0 ;break;//c
case 0xed:return '.';break;//d
case 0xeb:return '=';break;//e
case 0xe7:return '/';break;//f
default:return 0xff;break;
}
}
❷ 51單片機矩陣鍵盤程序:想把按鍵的值一一存到數組里,最後按下某個按鍵時,把數組里的某個數顯示出來,
給一個鍵盤掃描程序參考:
voiddelay(unsignedinta)
{
unsignedinti,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
ucharkbscan(void)
{
unsignedcharsccode,recode;
P1=0x0f;//發0掃描,列線輸入
if((P2&0x0f)!=0x0f)//有鍵按下
{
delay(20);//延時去抖動
if((P1&0x0f)!=0x0f)
{
sccode=0xef;//逐行掃描初值
while((sccode&0x01)!=0)
{
P1=sccode;
if((P1&0x0f)!=0x0f)
{
recode=(P1&0x0f)|0xf0;
while((P1&0x0f)!=0x0f);//等待鍵抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//無鍵按下,返回0
}
uchargetkey(void)
{
unsignedcharkey,keyval=0xff;
key=kbscan();
switch(key)
{
case0x11:keyval=1;break;
case0x12:keyval=2;break;
case0x14:keyval=3;break;
case0x18:keyval=10;break; //+
case0x21:keyval=4;break;
case0x22:keyval=5;break;
case0x24:keyval=6;break;
case0x28:keyval=11;break; //-
case0x41:keyval=7;break;
case0x42:keyval=8;break;
case0x44:keyval=9;break;
case0x48:keyval=12;break; //清除
case0x81:keyval=13;break;
case0x82:keyval=0;break;
case0x84:keyval=14;break; //小數點
case0x88:keyval=15;break; //確認
default:keyval=16;break;
}
return(keyval);
}
❸ 求大神,51單片機矩陣鍵盤問題!!!
我給個程序你參考一下
程序:
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharkey=16,key_t=16;
sbitan=P2^0;
sbitwei=P2^1;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共陰數碼管段選碼表,無小數點
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
voiddelay(uintms)
{
uchari;
while(ms--)
for(i=0;i<110;i++);
}
voidkey_tst()
{
ucharkess;
if(P1!=0xf0)
delay(5);
if(P1!=0xf0)
{
P1=0x0f;
delay(3);
kess=P1^0x0f; //P1口的狀態導或上0x0f,如果下了高4位不管,看低4位是多少
switch(kess)
{
case1:key=0;break;
case2:key=1;break;
case4:key=2;break;
case8:key=3;break;
default:key=16;
}
P1=0xf0;
delay(1);
kess=P1>>4^0x0f;
switch(kess)
{
case1:key+=12;break;
case2:key+=8;break;
case4:key+=4;break;
case8:key+=0;break;
default:key=16;
}
}
}
voidmain()
{
P0=0x00;
while(1)
{
key_tst();
P0=table[key];
an=1;
an=0;
P0=0x7f;
wei=1;
wei=0;
delay(2);
}
}