51微控制器程式框架之帶順序的組合按鍵觸發

硬软發表於2024-05-04
/******************************************************************************
此程式是依據吳堅鴻程式框架,在普中51 A2微控制器開發板上的程式練習
程式目標:帶順序的按鍵組合鍵,按下後LED取反
*******************************************************************************/
#include<REG51.H>
#define Main_Fosc 12000000L //預設系統時鐘12Mhz
#define T1MS  (65536-Main_Fosc/12/1000)  //12分頻下1ms定時器的裝載值,n=t/T=t/(12/f)=0.001*f/12=f/12/1000
#define Key_Debounce 40  //按鍵debounce time
sbit LED=P2^0;
sbit Key=P3^1;
sbit Key2=P3^0;
unsigned char Key_Handle=0;  //按鍵值,按下組合鍵之後為1,LED取反
void Sys_Init();    //系統初始化
void Delay_Long();   //長延時,等待系統穩定
void Perpherial_Init();  //埠初始化
void Key_Scan();  //按鍵掃描函式
void Key_Service(); //按鍵響應函式

void main()
{
    Sys_Init(); 
    Delay_Long();
    Perpherial_Init();
    while (1)
    {
        Key_Service();
    }
    
}

void Sys_Init()
{
    TMOD=0X01; //定時器0模式1
    TL0=T1MS;
    TH0=T1MS>>8;
}

void Delay_Long()
{
    unsigned char i,j;
    for(i=0;i++;i<220)
    {
        for(j=0;j<220;j++)
        ;
    }
}

void Perpherial_Init()
{
    ET0=1;
    TR0=1;
    EA=1;
}

void Timer0_ISR() interrupt 1   //定時器0中斷函式
{
	TL0=T1MS;
    TH0=T1MS>>8;
    Key_Scan();
}

void Key_Scan()
{
    static unsigned int Key_CNT;
    static unsigned char Key_Lock;

    if (0!=Key)
    {
       Key_CNT=0;
       Key_Lock=0; 
    }
    else if (0==Key_Lock)
    {
        Key_CNT++;
        if (Key_CNT>Key_Debounce)
        {
           if (0==Key2)
           {
            Key_Lock=1;
            Key_Handle=1;
           }
           
            
        }
        
    }
        
}

void Key_Service()
{
    if (0==Key_Handle)
    {
        return;
    }
    
    switch (Key_Handle)
    {
    case 1:
        LED=!LED;
        Key_Handle=0;
        break;
    }
    
}


相關文章