|
|
每0.1s掃描一次組合鍵盤,鍵值0x01 led0亮,鍵值0x02 led1亮.
/**************************************************************************************
實驗現(xiàn)象:每0.1s掃描一次組合鍵盤,鍵值0x01 led0亮,鍵值0x02 led1亮.
接線說明:
P20-->J8-A
P21-->J8-B
J20-->JP3
注意事項:
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
#define GPIO_KEY P1
sbit led0=P2^0; //定義P20口是led
sbit led1=P2^1; //
static u16 i;
u8 KeyValue; //用來存放讀取到的鍵值
/*******************************************************************************
* 函 數(shù) 名 : void Timer0() interrupt 1
* 函數(shù)功能 : 定時器0中斷函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0XdC; //給定時器賦初值,0xfc18定時1ms@12M;0xdc00定時10ms@11.0592M;
TL0=0X00;
i++;
}
/*******************************************************************************
* 函 數(shù) 名 : Timer0Init
* 函數(shù)功能 : 定時器0初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XdC; //0xfc18定時1ms@12M;0xdc00定時10ms@11.0592M;
TL0=0X00;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
void zihansu1()
{
led0=0;
led1=1;
}
void zihansu2()
{
led0=1;
led1=0;
}
void delay(u16 i)
{
while(i--);
}
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)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
}
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
{
delay(100);
a++;
}
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
if(i>9)
{
i=0;
KeyDown(); //按鍵判斷函數(shù)
if(KeyValue==1){KeyValue=0xff;zihansu1();}
if(KeyValue==2){KeyValue=0xff;zihansu2();}
}
}
} |
|