/********************************************************************
* 文件名 : 獨立按鍵.c
* 描述 : 該程序實現獨立按鍵去控制 LED燈 的亮滅,并講訴了對按鍵的處理方法。
獨立按鍵相應的IO口平時為高電平,一旦按鍵按下,單片機便檢測到低電平。
按下P3.2,P0.0口對應的LED亮滅交替變化。
按下P3.3,P0.1口對應的LED亮滅交替變化。
按下P3.4,P0.2口對應的LED亮滅交替變化。
* 創建人 : 東流,2009年8月27日
* 版本號 : 1.0
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
sbit KEY1 = P1^2;
sbit KEY2 = P1^3;
sbit KEY3 = P1^4;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
static u16 count;
char cost;
void KEY();
/********************************************************************
* 名稱 : Delay()
* 功能 : 延時,延時時間為 10ms * del
* 輸入 : del
* 輸出 : 無
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++);
}
/********************************************************************
* 名稱 : Delay()
* 功能 : 實現按鍵功能,當按鍵按下時,相應的LED亮滅交替
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void KEY()
{
// Delay(2);
if(KEY1==0 || KEY2==0 || KEY3==0)
{
Delay(5); //20毫秒軟件防抖
if(KEY1 == 0)
{
Delay(5);
// while(!KEY1);
P4_0 = 0 ; //LED顯示取反
Delay(1);
++cost; SBUF= cost;
while(!TI);TI=0;
}
if(KEY2 == 0)
{
P4_0 = 1;
--cost;
SBUF= cost;
while(!TI);TI=0;
}
else
{
LED3 = !LED3;
}
Delay(50); //延時0.5秒再進行下次按鍵的檢測
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
// // TMOD: timer 1, mode 2, 8-bit 重裝
TMOD |= 0x21; //T1方式2、T0方式1
TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TL1 = 0xFD; //波特率
TR1 = 1; // TR1: timer 1 打開
IE |= 0x92; //開啟中斷
EA = 1; //打開總中斷
ES = 1; //打開串口中斷
}
void Init_Timer1(void)
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
TH0=0x0c; //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出
TL0=0x0c;
ET0=1; //定時器中斷打開
TR0=1; //定時器開關打開
EA=1; //總中斷打開
}
void timer1(void) interrupt 1
{
TH0=0x00; //重新賦值
TL0=0x00;
if(count>10)
{
count=0;
P4_0 =!P4_0 ;
}
count++;
}
/********************************************************************
* 名稱 : Main()
* 功能 : 實現按鍵控制LED的亮滅
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
Init_Timer1();
InitUART();
while(1)
{
KEY();
}
} |