基于 残奕悟恩(刘平老师)的状态机扫描法,矩阵键盘高低电平翻转法,控制Led小灯程序
0赞
发表于 2014/4/22 21:32:17
阅读(4303)
/********************************
基于 残奕悟恩(刘平老师)的状态机扫描法,矩阵键盘高低电平翻转法,控制Led小灯程序
实现功能:按键按下,对应键值的小灯点亮
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(); //按键扫描函数
}
基于 残奕悟恩(刘平老师)的状态机扫描法,矩阵键盘高低电平翻转法,控制Led小灯程序
实现功能:按键按下,对应键值的小灯点亮
硬件接线:
P2.0口接 列线1
P2.1口接 列线2P2.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(); //按键扫描函数
}