南京個人做網(wǎng)站百度指數(shù)專業(yè)版app
由于行、列線為多鍵共用,各按鍵彼此將相互發(fā) 生影響,必須將行、列線信號配合起來并作適當(dāng)?shù)奶?理,才能確定閉合鍵的位置。
線反轉(zhuǎn)法
第1步:列線輸出為全低電平,則行線中電平由高變低 的所在行為按鍵所在行。
第2步:行線輸出為全低電平,則列線中電平由高變低 所在列為按鍵所在列。
綜合上述兩步,可確定閉合按鍵所在行和列。
程序代碼
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
/*共陰極數(shù)碼管0至F的段碼*/
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
?? ? ? ? ? ? ? ? ? ? ?0x7d,0x07,0x7f,0x6f,0x77,0x7c,
?? ? ? ? ? ? ? ? ? ? ?0x39,0x5e,0x79,0x71};
/*0至F的鍵值*/
uchar code key_value[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,
?? ? ? ? ? ? ? ? ? ? ? ? ?0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,
?? ? ? ? ? ? ? ? ? ? ? ? ?0xe7,0xd7,0xb7,0x77};
void delay();
void delay()
{
?? ?uint i;
?? ?for(i=0;i<1000;i++);
}
uchar key_dis()?
{
? uchar key_buf;
? uchar key_state;
? P2=0xf0;
? key_buf=P2;
? if(key_buf!=0xf0)
?? ?{
?? ??? ?delay();
?? ??? ?if(P2==key_buf)
?? ??? ?{
?? ??? ??? ?key_state=key_buf&0xf0;
?? ??? ??? ?P2=0x0f;
?? ??? ??? ?key_buf=P2;
? ? ? ? ? ? key_buf&=0x0f;
?? ??? ??? ?key_state=key_state|key_buf;
?? ??? ??? ?return key_state;
?? ??? ?}
?? ??? ?else?
?? ??? ??? ?return 0;
?? ? }
?? ?else?
?? ??? ?return 0;
}
?? ?
void main(void)
{
? uchar j,key_num; ?
?? ?P0=0x00; ? ? ? ? ? ? ? ? ? ? ?// 開機黑屏
? ? while(1)
?? ??? ?{
?? ??? ? ?key_num=key_dis();
?? ??? ??? ?if(key_num!=0)
?? ??? ??? ?{
?? ??? ??? ? ?for(j=0;j<16;j++)
?? ??? ??? ? ?{
?? ??? ??? ??? ?if(key_num==key_value[j])? ? ? //獲得按鍵的鍵號
?? ??? ??? ??? ? ? break;
?? ??? ??? ? ?}
?? ??? ? ? ?P0=table[j];? ??
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ??? ?
原理圖
仿真結(jié)果