0%

三按键测试工程

三按键测试

文件结构说明

image-20220630084706907

在前几个实验的基础上,增加了key.hbeep.h

KEY.H头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**********************************key V2.0 说明 ************************************************************************
Key模块用于获取“STC-B学习板”上三个按键的状态。提供按键模块加载和一个应用函数,一个“按键事件:enumEventKey:
(1) KeyInit():按键模块加载函数;
(2) char GetKeyAct(char Key):获取按键状态。
函数参数:Key,指定要获取状态的按键。Key取值:
enumKey1
enumKey2
enumKey3
(当参数取值超出有效范围,函数将返回fail)
函数返回值:
enumKeyNull(无按键动作)
enumKeyPress(按下)
enumKeyRelease(抬起)
enumKeyFail(失败)
返回值是经过多次检测按键实时状态和统计检测结果后(软件消抖)的有效事件。
每个按键查询一次后,事件值变成enumKeyNull。事件值仅查询一次有效。
(3) 按键事件:enumEventKey
当三个按键(enumKey1,enumKey2,enumKey3)中任意一个按键有”按下“或”抬起“动作时,将产生一个”按键事件“,
响应按键事件的用户处理函数由用户编写,并有sys中提供的SetEventCallBack函数设置.
补充说明:如果启用了ADC模块,按键3(Key3)任何操作在本模块不可检测到和有任何信息反应,
这时按键3(Key3)任何操作将在 ADC模块中检测和反应。使用方法相同,具体见ADC模块说明。
*/

#ifndef _key_H_
#define _key_H_

extern void KeyInit();
extern unsigned char GetKeyAct(char Key) ; //获取按键enumKey1,enumKey2,enumKey3事件
//返回值:enumKeyNull——无,enumKeyPress——下降沿,enumKeyRelease——上升沿,enumKeyFail——错误
enum KeyName {enumKey1,enumKey2,enumKey3}; //按键名
enum KeyActName {enumKeyNull,enumKeyPress,enumKeyRelease,enumKeyFail}; //按键动作名

#endif

BEEP.H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
Beep V2.0 说明
Beep用于控制“STC-B学习板”上无源蜂鸣器的发声。Beep模块共提供1个驱动函数、2个应用函数:
(1) BeepInit(): 蜂鸣器模块驱动函数
(2) Set_Beep(unsigned int Beep_freq, unsigned char Beep_time): 控制蜂鸣器发声,非阻塞型
函数参数:
Beep_freq:指定发声频率,单位Hz。小于10将无输出
Beep_time:指定发声时长。发声时长=10*Beep_time(mS),最长 655350mS
函数返回值:enumSetBeepOK:调用成功,enumSetBeepFail:调用失败(或因蜂鸣器正在发音)
(3) GetBeepStatus(void): 获取Beep当前状态,enmuBeepFree:空闲, enumBeepBusy ,正在发音
(4) Beep模块使用了STC内部CCP模块1通道
*/

#ifndef _beep_H_
#define _beep_H_

extern void BeepInit(); // 蜂鸣器初始化

extern char SetBeep(unsigned int Beep_freq, unsigned int Beep_time);
// 发指定频率声音, 发声时长=10×Beep_time (mS) ,最长 655350mS
// Beep_freq < 10 Hz, 不发音
// 函数返回 enumSetBeepOK:调用成功, enumSetBeepFail:调用失败(调用时正在发音)

extern unsigned char GetBeepStatus(void); // 获取状态,enumBeepFree:自由, enumBeepBusy,正在发声

enum BeepActName {enumBeepFree=0,enumBeepBusy,enumSetBeepOK,enumSetBeepFail};

#endif

BSP版本主函数逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "STC15F2K60S2.H"        //必须。
#include "sys.H" //必须。
#include "displayer.H"
#include "key.H"
#include "beep.H"

code unsigned long SysClock=11059200; //必须。定义系统工作时钟频率(Hz),用户必须修改成与实际工作频率(下载时选择的)一致
#ifdef _displayer_H_ //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等)
code char decode_table[]={
0x3f,
0x06,
0x5b,
0x4f,
0x66,
0x6d,
0x7d,
0x07,
0x7f,
0x6f,
0x00,
0x08,
0x40,
0x01,
0x41,
0x48,
0x3f|0x80,
0x06|0x80,
0x5b|0x80,
0x4f|0x80,
0x66|0x80,
0x6d|0x80,
0x7d|0x80,
0x07|0x80,
0x7f|0x80,
0x6f|0x80
};
#endif

char a;

void myKey_callback()
{
char k;
SetBeep(1000,10); // BEEPing

/* 根据按键设置LED */
k=GetKeyAct(enumKey1);
if( k == enumKeyPress ) a |=0x01;
else if( k == enumKeyRelease ) a &=~0x01;
k=GetKeyAct(enumKey2);
if( k == enumKeyPress ) a |=0x02;
else if( k == enumKeyRelease ) a &=~0x02;
k=GetKeyAct(enumKey3);
if( k == enumKeyPress ) a |=0x04;
else if( k == enumKeyRelease ) a &=~0x04;
}

void my10mS_callback()
{
LedPrint(a);
}

void main()
{
DisplayerInit();
KeyInit();
BeepInit();
SetDisplayerArea(0,7);
Seg7Print(1,2,3,4,5,6,7,8);
SetEventCallBack(enumEventSys10mS, my10mS_callback);
SetEventCallBack(enumEventKey, myKey_callback);
// 循环等待事件
MySTC_Init();
while(1)
{
MySTC_OS();
}
}

C版本

没有蜂鸣器。没有数码管。过于简单,按下按键,对应的LED亮起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**********************
三按键测试
型号:STC15F2K60S2 主频:11.0592MHz
************************/
#include <STC15F2K60S2.H>

/*---------引脚别名定义---------*/
sbit sbtKey1 = P3 ^ 2;
sbit sbtKey2 = P3 ^ 3;
sbit sbtKey3 = P1 ^ 7;
sbit sbtLedSel = P2 ^ 3;

/*---------初始化函数---------*/
void Init()
{
//推挽输出
P0M0 = 0XFF;
P0M1 = 0X00;
P2M0 = 0X08;
P2M1 = 0X00;
sbtLedSel = 1; //选择让LED灯发光,可以不设置,默认为1
P0 = 0; //初始化P0,让LED灯全部熄灭
}

/*---------主函数---------*/
void main()
{
Init();
while( 1 )
{
if( sbtKey1 == 0 ) //检测按键1是否被按下
P0 |= 0x01; //按下则L0发光
else
P0 &= ~0x01; //否则L0熄灭

if( sbtKey2 == 0 ) //检测按键2是否被按下
P0 |= 0x02; //按下则L1发光
else
P0 &= ~0x02; //否则L1熄灭

if( sbtKey3 == 0 ) //检测按键3是否被按下
P0 |= 0x04; //按下则L2发光
else
P0 &= ~0x04; //否则L2熄灭
}
}