石头

基于 残奕悟恩(刘平老师)的状态机扫描法,矩阵键盘高低电平翻转法,控制Led小灯程序

0
阅读(4303)
/********************************
基于 残奕悟恩(刘平老师)的状态机扫描法,矩阵键盘高低电平翻转法,控制Led小灯程序
实现功能:按键按下,对应键值的小灯点亮

硬件接线:

 P2.0口接 列线1

 P2.1口接 列线2
 P2.2口接 列线3
 P2.3口接 列线4
 P2.4口接 行线1
 P2.5口接 行线2
 P2.6口接 行线3  
 P2.7口接 行线4
 P1口接 Led小灯  
晶振频率:11.0592Mhz  
********************************/

#include<STC12C5A60S2.H>

typedef unsigned char uint8;
typedef unsigned int  uint16;

#define Led P1
#define Initial_State    0      //按键初始状态
#define Affirm_State   1     //按键确认状态
#define Singel_State    2    //按键松手状态

#define K1_1 1
#define K1_2 2
#define K1_3 3
#define K1_4 4

#define K2_1 5
#define K2_2 6
#define K2_3 7
#define K2_4 8

#define K3_1 9
#define K3_2 10
#define K3_3 11
#define K3_4 12

#define K4_1 13
#define K4_2 14
#define K4_3 15
#define K4_4 16


char Key;
char Key_Scan();
void initial_myself();
void initial_peripheral();
void Delayms(uint16 z);

void main()
{
    initial_myself(); //上电初始化
    Delayms(10);
    initial_peripheral(); //外围设备初始化
    while(1)
    {
        Led = ~Key ;
    }
}

char  Key_Scan() //矩阵键盘扫描函数
{
    static uint8 Key_Step = 0;
    uint16 Key_Line,Key_Valve,ValveLine;
    P2 = 0xf0;  
    Key_Valve = P2;
switch(Key_Step)
{    
   case Initial_State: //按键初始状态
   if(Key_Valve != 0xfe) //行扫描
   {
       Key_Step = Affirm_State ;    
   }
       break;

   case Affirm_State : //按键确认状态

    if(Key_Valve != 0xf0)  
   {   
       Key_Valve = P2;  
       P2 = 0x0f;   //列扫描
       Key_Line = P2;
       ValveLine = Key_Valve|Key_Line;  //键值判断
       Key_Step = Singel_State;
   }
   else 
   {
       Key_Step = Initial_State;
   }
   break;

   case Singel_State: //按键松手状态

   if(Key_Valve == 0xf0)
   {
       switch (ValveLine)
      {
       case 0xee:  
       Key = K1_1;
       break;

       case 0xed:
       Key = K1_2;
       break;

       case 0xeb:
       Key = K1_3;
       break;

       case 0xe7:
       Key = K1_4;
       break; 

       case 0xde:
       Key = K2_1;
       break;

       case 0xdd:
       Key = K2_2;
       break;

       case 0xdb:
       Key = K2_3;
       break;

       case 0xd7:
       Key = K2_4;
       break;

       case 0xbe:  
       Key = K3_1;
       break;

       case 0xbd:
       Key = K3_2;
       break;

       case 0xbb :
       Key = K3_3;
       break;

      case 0xb7:
      Key = K3_4;
      break;

      case 0x7e:  
      Key = K4_1;
      break;

       case 0x7d:
      Key = K4_2;
      break;

       case 0x7b:
       Key = K4_3;
       break;

       case 0x77:
       Key = K4_4;
       break;
    }
     Key_Step = Initial_State;
  }
  break;
}
return Key;
}

void initial_myself()  //上电初始化
{
    P2 = 0xff;
   TMOD |= 0x01;
   TH0 = 0xdc;
   TL0 = 0x00; 
}

void Delayms(uint16 z)  
{
    uint16 x,y;
    for(x=0; x<z; x++)
       for(y=0; y<1000; y++);
}

void initial_peripheral()   //外围设备初始化
{
    EA = 1;
    ET0 = 1;
    TR0 = 1;  
}

void interruptT0() interrupt 1  //定时器0中断函数
{
    TF0 = 0;
    TH0 = 0xdc;
    TL0 = 0x00;
    Key_Scan(); //按键扫描函数
}