基于蓝桥杯的单片机模块练习——独立键盘算法

基于蓝桥杯的单片机模块练习——独立键盘算法

C代码

#include "key.h"
unsigned char keystat[] = {1,1,1,1};
unsigned int lkey_count = 0;
bit lkey_flag = 0;
code unsigned char KeyCodemap[4] = {0x07,0x06,0x05,0x04};
void KeyAction(unsigned char KeyCode)
{
	switch(KeyCode)
	{
		case 0x04 :按键S4的相应操作;break;
		case 0x05 :按键S5的相应操作;break;
		case 0x06 :按键S6的相应操作;break;
		case 0x07 :按键S7的相应操作;break;
		case255 - 0x0?:按键S?的相应长按操作;break;
	}
}
	
void KeyScan()
{
	unsigned char i;
	static unsigned char backup[] = {1,1,1,1};
	for(i=0; i<4; i++)
	{
		if(backup[i] != keystat[i])
		{
			 lkey_count = 0;
             lkey_flag = 0;
			while((keystat[i] == 0)&&(lkey_flag == 0));//只有长按键触发时间还没到并且按键还在按下状态时才等待
			if(backup[i] == 1)
			{
				if(lkey_flag == 0)
                       KeyAction(KeyCodemap[i]); //短按键操作
				else
					 KeyAction(255 - KeyCodemap[i]);//长按键操作
					
			}
			backup[i] = keystat[i];
		}
	}
}

void Service_Timer1() interrupt 3
{
	
	static unsigned char key_count = 0;
	static unsigned char keybuffer[] = {0xff,0xff,0xff,0xff};
	unsigned char i;
	key_count++;
	lkey_count++;
	if(key_count == 2)
	{
		key_count = 0;
		keybuffer[0] = (keybuffer[0] << 1) | P30;
		keybuffer[1] = (keybuffer[1] << 1) | P31;
		keybuffer[2] = (keybuffer[2] << 1) | P32;
		keybuffer[3] = (keybuffer[3] << 1) | P33;
		for(i=0;i<4;i++)
		{
			if(keybuffer[i] == 0x00)
			{
				keystat[i] = 0;
			}
			else if(keybuffer[i] == 0xff)
			{
				keystat[i] = 1;
			}
		}
	}
//***********************长按键计时**********************************
	if(lkey_count >= 800)
	{
		lkey_count = 0;
		lkey_flag = 1;
	}
//***********************长按键计时**********************************
}

拓展:
第九届国赛编程题的长按键引发参数快速增加的部分

void KeyAction(unsigned char KeyCode)
{
	switch(KeyCode)
	{
		case 0x04 :按键S4的相应操作;break;
		case 0x05 :按键S5的相应操作;break;
		case 0x06 :按键S6的相应操作;break;
		case 0x07 :按键S7的相应操作;break;
		case255 - 0x06:
		if(D_or_P == 1)//判断是否处于参数显示界面
						{ 
							while(keystat[1] == 0)//只要按键S6没有松开
							{ P_U++;//参数变量就一直增加
							if(P_U > 50) 
								P_U = 1;
							Display_P();
							 Delay_1ms(100);
							}
							
						}
		break;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值