需求:矩阵键盘实现计算器操作
main.c 代码如下:
#include <STC89C5XRC.H>
#include "ApplicationProgram.h"
#include "Int_DigitalTube.h"
#include "Int_MatrixKeyboard.h"
void main()
{
u8 KeyPress;
App_Initialize();
while (1) {
KeyPress = Int_MatrixKeyboard_Counter();
if(KeyPress != 10) {
App_KeyFunction(KeyPress);
}
Int_DigitalTube_Refresh();
}
}
Int_MatrixKeyboard.h 代码如下:
#ifndef __INT_MATRIXKEYBOARD_H__
#define __INT_MATRIXKEYBOARD_H__
#include "Util.h"
/**
* @brief 数字
*
* @return u8 返回数字 0 - 9
*
* 返回 10 代表错误
*
* 返回 11 代表 +
* 返回 12 代表 -
* 返回 13 代表 *
* 返回 14 代表 /
* 返回 15 代表 =
* 返回 16 代表 清零
*/
u8 Int_MatrixKeyboard_Counter();
#endif
Int_MatrixKeyboard.c 代码如下:
#include "Int_MatrixKeyboard.h"
#include <STC89C5xRC.H>
#define KEYIN P2
u8 Int_MatrixKeyboard_Counter()
{
// 将P20 置为 0 ;则P27 - P20分别为1111 1110 0xFE
KEYIN = 0xFE;
// SW5 按下 ;则P27 - P20分别为1110 1110 0xEE
if (KEYIN == 0xEE) {
// 消前抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xEE) {
// SW5 已经被按下等待抬起
while (1) {
if (KEYIN == 0xFE) {
// 消后抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xFE) {
return 1;
}
}
}
}
}
// SW6 按下 ;则P27 - P20分别为1101 1110 0xDE
if (KEYIN == 0xDE) {
// 消前抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xDE) {
// SW5 已经被按下等待抬起
while (1) {
if (KEYIN == 0xFE) {
// 消后抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xFE) {
return 2;
}
}
}
}
}
// SW7 按下 ;则P27 - P20分别为1011 1110 0xBE
if (KEYIN == 0xBE) {
// 消前抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xBE) {
// SW5 已经被按下等待抬起
while (1) {
if (KEYIN == 0xFE) {
// 消后抖
Com_Util_Delay1ms(10);
if (KEYIN == 0xFE) {
return 3;
}
}
}
}
}
// SW8 按下 ;则P27 - P20分别为0111 1110 0x7E
if (KEYIN == 0x7E) {
// 消前抖
Com_Util_Delay1ms(10);
if (KEYIN == 0x7E) {
// SW5 已经被按下等待抬起
while (1) {
if (KEYIN == 0xFE) {
// 消后抖