实验开发板为CT107D蓝桥官方板,编译环境为MDK5

 参考宋雪松老师的写法:

  1. 采用多个缓冲区
  2. 可以扩展至16个键码对应的指令

Keyboard.h:

#ifndef _KEYBOARD_H
#define _KEYBOARD_H

#include "main.h"

sbit Key_IN1 = P4^4;
sbit Key_IN2 = P4^2;
sbit Key_IN3 = P3^5;
sbit Key_IN4 = P3^4;

sbit Key_OUT1 = P3^0;
sbit Key_OUT2 = P3^1;
sbit Key_OUT3 = P3^2;
sbit Key_OUT4 = P3^3;

extern void KeyDrive();
extern void KeyScan();
extern void KeyAction(u8 cmd);

extern u8 Key_Sta[4][4];
extern u8 Key_CodeMap[4][4];

#endif

 Keyboard.c:

#include "Keyboard.h"
#include "DataDeal.h"

u8 Key_Sta[4][4] = {
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},
{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}
};//按键当前状态

u8 Key_CodeMap[4][4] = {
	{'A', 'C', 'D', 'E'},
	{'F', 'G', 'H', 'I'},
	{'J', 'K', 'L', 'M'},
	{'N', 'O', 'P', 'Q'}

};//按键对应指令集(字母的ASCII码仅用作标识)

void KeyAction(u8 cmd)//指令集对应动作(可扩展)
{
	if(cmd == 'A')//也可以用switch写法
	{
		SwitchClock();
	}
	else if(cmd == 'F')
	{
		SwitchAlarm();
	}
	else if(cmd == 'J')
	{
		TimeADD();
	}
	else if(cmd == 'N')
	{
		TimeCut();
	}
}

void KeyDrive()//KeyDrive和KeyScan需要同时在主函数中调用
{
	u8 i, j;
	static u8 backup[4][4] = {
	{1 , 1 , 1 , 1},{1 , 1 , 1 , 1},
	{1 , 1 , 1 , 1},{1 , 1 , 1 , 1}
	};
	
	for(i = 0; i < 4; i ++)
	{
		for(i = 0; i < 4; i ++)
		{
			if(Key_Sta[i][j] != backup[i][j])
			{
				KeyAction(Key_CodeMap[i][j]);
			}
		}
	}

}

void KeyScan()
{
	u8 i;
	static u8 Key_OUT = 0;
	static u8 Key_Buff[4][4] = {
        {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF},
        {0xFF, 0xFF, 0xFF, 0xFF},  {0xFF, 0xFF, 0xFF, 0xFF}
	};//备份区
	
	switch(Key_OUT)//逐行扫描
	{
	 	case 0: Key_OUT1 = 0; Key_OUT4 = 1; break;
		case 1: Key_OUT2 = 0; Key_OUT3 = 1; break;
		case 2: Key_OUT3 = 0; Key_OUT2 = 1; break;
		case 3: Key_OUT4 = 0; Key_OUT1 = 1; break;
		default: break;
	}
	
	Key_Buff[Key_OUT][0] = (Key_Buff[Key_OUT][0] << 1) | Key_IN1;	//一则变零则不变
	Key_Buff[Key_OUT][1] = (Key_Buff[Key_OUT][1] << 1) | Key_IN2;
	Key_Buff[Key_OUT][2] = (Key_Buff[Key_OUT][2] << 1) | Key_IN3;
	Key_Buff[Key_OUT][3] = (Key_Buff[Key_OUT][3] << 1) | Key_IN4;	
	
	for(i = 0; i < 4; i ++)	//每个按键状态判断4次
	{
		if( (Key_Buff[Key_OUT][i] & 0x0F) == 0x00)    //按键按下
		{
			Key_Sta[Key_OUT][i] = 0;
		}
		else if( (Key_Buff[Key_OUT][i] & 0x0F) == 0x0F)//按键弹起
		{
			Key_Sta[Key_OUT][i] = 1;
		}
	}
	
	Key_OUT ++;
	Key_OUT &= 0x03;//达3即归0

}


【蓝桥杯单片机】矩阵键盘新解(更稳定更高复用性)

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-19
  • 2022-12-23
  • 2022-02-27
  • 2022-02-18
  • 2021-10-27
  • 2021-12-19
猜你喜欢
  • 2021-11-19
  • 2021-04-27
  • 2021-08-26
  • 2021-12-27
  • 2021-04-13
  • 2021-06-23
  • 2022-12-23
相关资源
相似解决方案