kwjy

持续进军之五-----矩阵按键触发状态机数码管显示按键编码值

0
阅读(2642)

经过几天的努力终于做好了矩阵按键触发状态机数码管显示按键编码值,期间也学到了很多的知识;由于的事松手检测还有点小BUG,等日后有好的方法再来修改吧程序里的松手检测代码可以用,只是有点小BUG,不嫌弃的就将就用吧^_^


上代码了,高手前辈本勿喷,不要用板砖砸小弟哦


/*
网名:坎悟积验
功能:矩阵按键状态机检测
现象:简单的数码管显示按键编码值
类型:高低电平翻转法
      行列扫描(略)
声明:此程序费了我好多时间与周折与辛苦,一波未完又一波,真是受不了了^_^
Fosc:11059200Hz
MCU :STC89C52RC
Day :2014-05-08
*/
#include <reg52.h>

typedef unsigned char Uint8;
typedef unsigned int Uint16;
Uint8 code shuLED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80,0x40,0};

sbit DULA = P1^7;
sbit WELA = P1^6;

Uint8 KeyScan();
void display_saxin();
#define FSM_Initial    0
#define FSM_Confirm    1
#define FSM_Key_value  2
#define Pro0 P0
#define Mstrix_KeyIn  P3
static Uint8 tm = 0;
static Uint8 temp = 0,temp1 = 0;
void main()
{
WELA = 1;Pro0 = 0;WELA = 0;
Mstrix_KeyIn = 0xff;
TMOD  = 0x01;
TH0 = 0xf8;
TL0 = 0xcd;//2ms
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}

Uint8 KeyScan()
{
static Uint8 Number_return = 18;
static Uint8 Number_return2 = 18;
    static Uint8 state_positive = 0;
static Uint8 state_reverse = 0;
static Uint8 state_keyscan = 0;
switch(state_keyscan)
{  
case FSM_Initial: Mstrix_KeyIn = 0xf0;
 Mstrix_KeyIn &= 0xf0;
 state_positive  =  Mstrix_KeyIn;
 if(state_positive != 0xf0)
 //按键状态初始化
    state_keyscan = FSM_Confirm;
     break;

case FSM_Confirm:
 Mstrix_KeyIn = 0xf0;
 Mstrix_KeyIn &= 0xf0;
 state_positive  =  Mstrix_KeyIn;
 if(state_positive != 0xf0)
 state_keyscan = FSM_Key_value;
  //确认按键发生状态
 else
  state_keyscan = FSM_Initial; 

case FSM_Key_value:  Mstrix_KeyIn = 0x0f;
Mstrix_KeyIn &= 0x0f;
state_reverse  =  Mstrix_KeyIn;
switch(state_positive | state_reverse)
{ //读取按键值对应状态
case 0xee: Number_return = 14;Number_return2 = 14;

break;
case 0xde: Number_return = 13;Number_return2 = 14;

break;
case 0xbe: Number_return = 11;Number_return2 = 14;

break;
case 0x7e: Number_return = 7; Number_return2 = 14;

break;
case 0xed: Number_return = 14;Number_return2 = 13;

break;
case 0xdd: Number_return = 13;Number_return2 = 13;

break;
case 0xbd: Number_return = 11;Number_return2 = 13;

break;
case 0x7d: Number_return = 7; Number_return2 = 13;

break;
case 0xeb: Number_return = 14;Number_return2 = 11;

break;
case 0xdb: Number_return = 13;Number_return2 = 11;

break;
case 0xbb: Number_return = 11;Number_return2 = 11;

break;
case 0x7b: Number_return = 7; Number_return2 = 11;

break;
case 0xe7: Number_return = 14;Number_return2 = 7;

break;
case 0xd7: Number_return = 13;Number_return2 = 7;

break;
case 0xb7: Number_return = 11;Number_return2 = 7;

break;
case 0x77: Number_return = 7; Number_return2 = 7;

break;
default: state_keyscan = FSM_Initial;
   
break;
   }break;
   
default: state_keyscan = FSM_Initial;
 break;
}
 
// while((state_positive != 0xf0) && (state_reverse != 0x0f)) //松手检测
// {
// Mstrix_KeyIn = 0xf0;
//    Mstrix_KeyIn &= 0xf0;
//    state_positive  =  Mstrix_KeyIn;
// Mstrix_KeyIn = 0x0f;
//    Mstrix_KeyIn &= 0x0f;
//    state_reverse  =  Mstrix_KeyIn;
// }  
   if(tm != 1)
   return Number_return;
   else
   return Number_return2;   


void display_saxin()
{
static Uint8 i = 0;

    switch(i)
{
case 0: tm = 0;
DULA = 1;Pro0 = 0;DULA = 0;//关闭段码数据
   WELA = 1;Pro0 = 0xfe;WELA = 0;Pro0 = 0;//关闭位码数据
DULA = 1;Pro0 = shuLED[KeyScan()];DULA = 0;Pro0 = 0;
i++;
       break;
case 1: tm = 1;
DULA = 1;Pro0 = 0;DULA = 0;
WELA = 1;Pro0 = 0xfd;WELA = 0;Pro0 = 0;
DULA = 1;Pro0 = shuLED[KeyScan()];DULA = 0;Pro0 = 0;
i=0;
    break;
// case 2: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0xfb;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[11];DULA = 0;Pro0 = 0;
// i++;
//    break;
// case 3: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0xf7;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[tab[2]];DULA = 0;Pro0 = 0;
// i++;
//    break;
// case 4: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0xef;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[tab[3]];DULA = 0;Pro0 = 0;
// i++;
//    break;
// case 5: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0xdf;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[11];DULA = 0;Pro0 = 0;
// i++;
//     break;
// case 6: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0xbf;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[tab[4]];DULA = 0;Pro0 = 0;
// i++;
//    break;
// case 7: DULA = 1;Pro0 = 0;DULA = 0;
// WELA = 1;Pro0 = 0x7f;WELA = 0;Pro0 = 0;
// DULA = 1;Pro0 = shuLED[tab[5]];DULA = 0;Pro0 = 0;
// i = 0;
//    break;
default: Pro0 = 0;tm = 0;
break;
}
}

void Time0() interrupt 1
{
static Uint8 m = 0;
TH0 = 0xf8;
TL0 = 0xcd;//2ms

m++;
if(m == 5) //10ms
{  
m = 0;
display_saxin();
}
}

实验效果图。。。。。。

继续下一课题。。。。。。。…~^*^~